new method to get the server's listening socket.
authorDan Winship <danw@src.gnome.org>
Fri, 12 Aug 2005 14:20:35 +0000 (14:20 +0000)
committerDan Winship <danw@src.gnome.org>
Fri, 12 Aug 2005 14:20:35 +0000 (14:20 +0000)
* 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.

ChangeLog
libsoup/soup-server.c
libsoup/soup-server.h
libsoup/soup-socket.c
libsoup/soup-socket.h

index d976a94..eec16f0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+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
index 620266c..1342df7 100644 (file)
@@ -300,6 +300,13 @@ soup_server_get_protocol (SoupServer *server)
                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 *);
 
index c2f6061..1fe83a5 100644 (file)
@@ -71,6 +71,8 @@ SoupServer        *soup_server_new            (const char            *optname1,
 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);
index 77a83f1..62ffea5 100644 (file)
@@ -42,6 +42,7 @@ enum {
        PROP_NON_BLOCKING,
        PROP_NODELAY,
        PROP_REUSEADDR,
+       PROP_CLOEXEC,
        PROP_IS_SERVER,
        PROP_SSL_CREDENTIALS,
 
@@ -56,6 +57,7 @@ typedef struct {
        guint non_blocking:1;
        guint nodelay:1;
        guint reuseaddr:1;
+       guint cloexec:1;
        guint is_server:1;
        gpointer ssl_creds;
 
@@ -98,6 +100,7 @@ soup_socket_init (SoupSocket *sock)
        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 ();
 }
@@ -270,6 +273,13 @@ soup_socket_class_init (SoupSocketClass *socket_class)
                                      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",
@@ -310,6 +320,15 @@ update_fdflags (SoupSocketPrivate *priv)
                        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;
@@ -348,6 +367,10 @@ set_property (GObject *object, guint prop_id,
                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;
@@ -372,6 +395,9 @@ get_property (GObject *object, guint prop_id,
        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;
index 5db2174..5f9f9a1 100644 (file)
@@ -35,6 +35,7 @@ typedef struct {
 #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"