diff options
author | wm4 <wm4@nowhere> | 2020-02-19 22:18:15 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2020-02-19 22:18:15 +0100 |
commit | e2ab6b7f3567542a2a1b5aab053d513737e72878 (patch) | |
tree | 36f3f24792e4974cf1e6c5601a61e799b098e69a /input/ipc-unix.c | |
parent | d06ebe2251b2ac75ebc6b63b1580ed15adecd3cc (diff) | |
download | mpv-e2ab6b7f3567542a2a1b5aab053d513737e72878.tar.bz2 mpv-e2ab6b7f3567542a2a1b5aab053d513737e72878.tar.xz |
scripting: add a way to run sub processes as "scripts"
This is just a more convenient way to start IPC client scripts per mpv
instance.
Does not work on Windows, although it could if the subprocess and IPC
parts are implemented (and I guess .exe/.bat suffixes are required).
Also untested whether it builds on Windows. A lot of other things are
untested too, so don't complain.
Diffstat (limited to 'input/ipc-unix.c')
-rw-r--r-- | input/ipc-unix.c | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/input/ipc-unix.c b/input/ipc-unix.c index ef478ba35e..0a7f2a5838 100644 --- a/input/ipc-unix.c +++ b/input/ipc-unix.c @@ -58,7 +58,7 @@ struct client_arg { struct mp_log *log; struct mpv_handle *client; - char *client_name; + const char *client_name; int client_fd; bool close_client_fd; @@ -215,9 +215,11 @@ done: return NULL; } -static void ipc_start_client(struct mp_ipc_ctx *ctx, struct client_arg *client) +static bool ipc_start_client(struct mp_ipc_ctx *ctx, struct client_arg *client, + bool free_on_init_fail) { - client->client = mp_new_client(ctx->client_api, client->client_name); + if (!client->client) + client->client = mp_new_client(ctx->client_api, client->client_name); if (!client->client) goto err; @@ -227,16 +229,19 @@ static void ipc_start_client(struct mp_ipc_ctx *ctx, struct client_arg *client) if (pthread_create(&client_thr, NULL, client_thread, client)) goto err; - return; + return true; err: - if (client->client) - mpv_destroy(client->client); + if (free_on_init_fail) { + if (client->client) + mpv_destroy(client->client); - if (client->close_client_fd) - close(client->client_fd); + if (client->close_client_fd) + close(client->client_fd); + } talloc_free(client); + return false; } static void ipc_start_client_json(struct mp_ipc_ctx *ctx, int id, int fd) @@ -246,11 +251,37 @@ static void ipc_start_client_json(struct mp_ipc_ctx *ctx, int id, int fd) .client_name = talloc_asprintf(client, "ipc-%d", id), .client_fd = fd, .close_client_fd = true, + .writable = true, + }; + ipc_start_client(ctx, client, true); +} + +bool mp_ipc_start_anon_client(struct mp_ipc_ctx *ctx, struct mpv_handle *h, + int out_fd[2]) +{ + int pair[2]; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, pair)) + return false; + + struct client_arg *client = talloc_ptrtype(NULL, client); + *client = (struct client_arg){ + .client = h, + .client_name = mpv_client_name(h), + .client_fd = pair[1], + .close_client_fd = true, .writable = true, }; - ipc_start_client(ctx, client); + if (!ipc_start_client(ctx, client, false)) { + close(pair[0]); + close(pair[1]); + return false; + } + + out_fd[0] = pair[0]; + out_fd[1] = -1; + return true; } static void ipc_start_client_text(struct mp_ipc_ctx *ctx, const char *path) @@ -292,7 +323,7 @@ static void ipc_start_client_text(struct mp_ipc_ctx *ctx, const char *path) .writable = writable, }; - ipc_start_client(ctx, client); + ipc_start_client(ctx, client, true); } static void *ipc_thread(void *p) |