connection: add do_close flag to connect_fd

Make pw_remote_connect_fd() not automatically close the provided
fd but let the caller take care of that. This allows us to reuse
the fd in pipewiresrc.

Fixes #155
This commit is contained in:
Wim Taymans 2019-06-19 10:49:28 +02:00
parent 37613b67ba
commit 151b2b266e
5 changed files with 13 additions and 11 deletions

View file

@ -619,7 +619,7 @@ static const struct pw_protocol_native_connection_events conn_events = {
.need_flush = on_need_flush, .need_flush = on_need_flush,
}; };
static int impl_connect_fd(struct pw_protocol_client *client, int fd) static int impl_connect_fd(struct pw_protocol_client *client, int fd, bool do_close)
{ {
struct client *impl = SPA_CONTAINER_OF(client, struct client, this); struct client *impl = SPA_CONTAINER_OF(client, struct client, this);
struct pw_remote *remote = client->remote; struct pw_remote *remote = client->remote;
@ -638,13 +638,14 @@ static int impl_connect_fd(struct pw_protocol_client *client, int fd)
impl->source = pw_loop_add_io(remote->core->main_loop, impl->source = pw_loop_add_io(remote->core->main_loop,
fd, fd,
SPA_IO_IN | SPA_IO_HUP | SPA_IO_ERR, SPA_IO_IN | SPA_IO_HUP | SPA_IO_ERR,
true, on_remote_data, impl); do_close, on_remote_data, impl);
if (impl->source == NULL) if (impl->source == NULL)
goto error_close; goto error_close;
return 0; return 0;
error_close: error_close:
if (do_close)
close(fd); close(fd);
return -ENOMEM; return -ENOMEM;
} }

View file

@ -84,7 +84,7 @@ int pw_protocol_native_connect_local_socket(struct pw_protocol_client *client,
goto error_close; goto error_close;
} }
res = pw_protocol_client_connect_fd(client, fd); res = pw_protocol_client_connect_fd(client, fd, true);
done_callback(data, res); done_callback(data, res);

View file

@ -44,14 +44,14 @@ struct pw_protocol_client {
int (*connect) (struct pw_protocol_client *client, int (*connect) (struct pw_protocol_client *client,
void (*done_callback) (void *data, int result), void (*done_callback) (void *data, int result),
void *data); void *data);
int (*connect_fd) (struct pw_protocol_client *client, int fd); int (*connect_fd) (struct pw_protocol_client *client, int fd, bool close);
int (*steal_fd) (struct pw_protocol_client *client); int (*steal_fd) (struct pw_protocol_client *client);
void (*disconnect) (struct pw_protocol_client *client); void (*disconnect) (struct pw_protocol_client *client);
void (*destroy) (struct pw_protocol_client *client); void (*destroy) (struct pw_protocol_client *client);
}; };
#define pw_protocol_client_connect(c,cb,d) ((c)->connect(c,cb,d)) #define pw_protocol_client_connect(c,cb,d) ((c)->connect(c,cb,d))
#define pw_protocol_client_connect_fd(c,fd) ((c)->connect_fd(c,fd)) #define pw_protocol_client_connect_fd(c,fd,cl) ((c)->connect_fd(c,fd,cl))
#define pw_protocol_client_steal_fd(c) ((c)->steal_fd(c)) #define pw_protocol_client_steal_fd(c) ((c)->steal_fd(c))
#define pw_protocol_client_disconnect(c) ((c)->disconnect(c)) #define pw_protocol_client_disconnect(c) ((c)->disconnect(c))
#define pw_protocol_client_destroy(c) ((c)->destroy(c)) #define pw_protocol_client_destroy(c) ((c)->destroy(c))

View file

@ -428,7 +428,7 @@ int pw_remote_connect_fd(struct pw_remote *remote, int fd)
pw_remote_update_state(remote, PW_REMOTE_STATE_CONNECTING, NULL); pw_remote_update_state(remote, PW_REMOTE_STATE_CONNECTING, NULL);
if ((res = pw_protocol_client_connect_fd (remote->conn, fd)) < 0) { if ((res = pw_protocol_client_connect_fd(remote->conn, fd, false)) < 0) {
pw_remote_update_state(remote, PW_REMOTE_STATE_ERROR, pw_remote_update_state(remote, PW_REMOTE_STATE_ERROR,
"connect_fd failed %s", spa_strerror(res)); "connect_fd failed %s", spa_strerror(res));
return res; return res;

View file

@ -177,7 +177,8 @@ void pw_remote_add_listener(struct pw_remote *remote,
int pw_remote_connect(struct pw_remote *remote); int pw_remote_connect(struct pw_remote *remote);
/** Connect to a remote PipeWire on the given socket \memberof pw_remote /** Connect to a remote PipeWire on the given socket \memberof pw_remote
* \param fd the connected socket to use * \param fd the connected socket to use, the socket will not be closed
* automatically on disconnect or error.
* \return 0 on success, < 0 on error */ * \return 0 on success, < 0 on error */
int pw_remote_connect_fd(struct pw_remote *remote, int fd); int pw_remote_connect_fd(struct pw_remote *remote, int fd);