Commit f5294414 authored by Max Kellermann's avatar Max Kellermann

server_socket: add method _add_fd()

parent 03664d04
...@@ -299,6 +299,36 @@ one_socket_new(unsigned serial, const struct sockaddr *address, ...@@ -299,6 +299,36 @@ one_socket_new(unsigned serial, const struct sockaddr *address,
return s; return s;
} }
bool
server_socket_add_fd(struct server_socket *ss, int fd, GError **error_r)
{
assert(ss != NULL);
assert(ss->sockets_tail_r != NULL);
assert(*ss->sockets_tail_r == NULL);
assert(fd >= 0);
struct sockaddr_storage address;
socklen_t address_length;
if (getsockname(fd, (struct sockaddr *)&address,
&address_length) < 0) {
g_set_error(error_r, server_socket_quark(), errno,
"Failed to get socket address: %s",
g_strerror(errno));
return false;
}
struct one_socket *s = one_socket_new(ss->next_serial,
(struct sockaddr *)&address,
address_length);
s->parent = ss;
*ss->sockets_tail_r = s;
ss->sockets_tail_r = &s->next;
set_fd(s, fd);
return true;
}
static struct one_socket * static struct one_socket *
server_socket_add_address(struct server_socket *ss, server_socket_add_address(struct server_socket *ss,
const struct sockaddr *address, const struct sockaddr *address,
......
...@@ -44,6 +44,14 @@ void ...@@ -44,6 +44,14 @@ void
server_socket_close(struct server_socket *ss); server_socket_close(struct server_socket *ss);
/** /**
* Add a socket descriptor that is accepting connections. After this
* has been called, don't call server_socket_open(), because the
* socket is already open.
*/
bool
server_socket_add_fd(struct server_socket *ss, int fd, GError **error_r);
/**
* Add a listener on a port on all interfaces. * Add a listener on a port on all interfaces.
* *
* @param port the TCP port * @param port the TCP port
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment