+2005-08-12 Dan Winship <danw@novell.com>
+
+ * libsoup/soup-server.c (soup_server_get_listener): new method to
+ get the server's listening socket.
+
+ * libsoup/soup-socket.c: add a new "cloexec" property, to set
+ FD_CLOEXEC on the socket. Update everything for that.
+
2005-08-05 Dan Winship <danw@novell.com>
* libsoup/soup-socket.c (finalize): Free priv->read_buf. From
return SOUP_PROTOCOL_HTTP;
}
+SoupSocket *
+soup_server_get_listener (SoupServer *server)
+{
+ g_return_val_if_fail (SOUP_IS_SERVER (server), NULL);
+
+ return server->priv->listen_sock;
+}
static void start_request (SoupServer *, SoupSocket *);
SoupProtocol soup_server_get_protocol (SoupServer *serv);
guint soup_server_get_port (SoupServer *serv);
+SoupSocket *soup_server_get_listener (SoupServer *serv);
+
void soup_server_run (SoupServer *serv);
void soup_server_run_async (SoupServer *serv);
void soup_server_quit (SoupServer *serv);
PROP_NON_BLOCKING,
PROP_NODELAY,
PROP_REUSEADDR,
+ PROP_CLOEXEC,
PROP_IS_SERVER,
PROP_SSL_CREDENTIALS,
guint non_blocking:1;
guint nodelay:1;
guint reuseaddr:1;
+ guint cloexec:1;
guint is_server:1;
gpointer ssl_creds;
priv->sockfd = -1;
priv->non_blocking = priv->nodelay = TRUE;
priv->reuseaddr = TRUE;
+ priv->cloexec = FALSE;
priv->addrlock = g_mutex_new ();
priv->iolock = g_mutex_new ();
}
TRUE,
G_PARAM_READWRITE));
g_object_class_install_property (
+ object_class, PROP_CLOEXEC,
+ g_param_spec_boolean (SOUP_SOCKET_FLAG_CLOEXEC,
+ "CLOEXEC",
+ "Whether or not the socket will be closed automatically on exec()",
+ FALSE,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (
object_class, PROP_IS_SERVER,
g_param_spec_boolean (SOUP_SOCKET_IS_SERVER,
"Server",
flags &= ~O_NONBLOCK;
fcntl (priv->sockfd, F_SETFL, flags);
}
+ flags = fcntl (sock->priv->sockfd, F_GETFD, 0);
+ if (flags != -1) {
+ if (sock->priv->cloexec)
+ flags |= FD_CLOEXEC;
+ else
+ flags &= ~FD_CLOEXEC;
+ fcntl (sock->priv->sockfd, F_SETFD, flags);
+ }
+
#else
if (priv->non_blocking) {
u_long val = 1;
priv->reuseaddr = g_value_get_boolean (value);
update_fdflags (priv);
break;
+ case PROP_CLOEXEC:
+ sock->priv->cloexec = g_value_get_boolean (value);
+ update_fdflags (sock);
+ break;
case PROP_SSL_CREDENTIALS:
priv->ssl_creds = g_value_get_pointer (value);
break;
case PROP_REUSEADDR:
g_value_set_boolean (value, priv->reuseaddr);
break;
+ case PROP_CLOEXEC:
+ g_value_set_boolean (value, sock->priv->cloexec);
+ break;
case PROP_IS_SERVER:
g_value_set_boolean (value, priv->is_server);
break;
#define SOUP_SOCKET_FLAG_NONBLOCKING "non-blocking"
#define SOUP_SOCKET_FLAG_NODELAY "nodelay"
#define SOUP_SOCKET_FLAG_REUSEADDR "reuseaddr"
+#define SOUP_SOCKET_FLAG_CLOEXEC "cloexec"
#define SOUP_SOCKET_IS_SERVER "is-server"
#define SOUP_SOCKET_SSL_CREDENTIALS "ssl-creds"