[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v4 24/32] tools/xenstored: move all socket handling into posix.c



All of the socket handling is needed only when running as daemon.

Move it into posix.c, allowing to remove the NO_SOCKETS macro.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
V3:
- new patch
V4:
- make sock local to posix.c (Julien Grall)
---
 tools/xenstored/Makefile.common |   4 -
 tools/xenstored/core.c          | 160 +------------------------------
 tools/xenstored/core.h          |   7 +-
 tools/xenstored/domain.c        |   9 +-
 tools/xenstored/minios.c        |  15 +++
 tools/xenstored/posix.c         | 164 ++++++++++++++++++++++++++++++++
 6 files changed, 188 insertions(+), 171 deletions(-)

diff --git a/tools/xenstored/Makefile.common b/tools/xenstored/Makefile.common
index 189ab81b8d..ef63ef650c 100644
--- a/tools/xenstored/Makefile.common
+++ b/tools/xenstored/Makefile.common
@@ -16,10 +16,6 @@ CFLAGS += $(CFLAGS_libxenctrl)
 CFLAGS += $(CFLAGS_libxenguest)
 CFLAGS += $(CFLAGS_libxentoolcore)
 
-ifdef CONFIG_STUBDOM
-CFLAGS += -DNO_SOCKETS=1
-endif
-
 $(XENSTORED_OBJS-y): CFLAGS += $(CFLAGS_libxengnttab)
 
 xenstored.a: $(XENSTORED_OBJS-y)
diff --git a/tools/xenstored/core.c b/tools/xenstored/core.c
index 86ab330eaf..c045a6e5db 100644
--- a/tools/xenstored/core.c
+++ b/tools/xenstored/core.c
@@ -20,10 +20,6 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <poll.h>
-#ifndef NO_SOCKETS
-#include <sys/socket.h>
-#include <sys/un.h>
-#endif
 #include <sys/time.h>
 #include <time.h>
 #include <unistd.h>
@@ -61,8 +57,6 @@ static unsigned int current_array_size;
 static unsigned int nr_fds;
 static unsigned int delayed_requests;
 
-static int sock = -1;
-
 int orig_argc;
 char **orig_argv;
 
@@ -486,7 +480,7 @@ fail:
        return -1;
 }
 
-static void initialize_fds(int *p_sock_pollfd_idx, int *ptimeout)
+static void initialize_fds(int *ptimeout)
 {
        struct connection *conn;
        uint64_t msecs;
@@ -499,8 +493,6 @@ static void initialize_fds(int *p_sock_pollfd_idx, int 
*ptimeout)
        *ptimeout = delayed_requests ? 1000 : -1;
 
        set_special_fds();
-       if (sock != -1)
-               *p_sock_pollfd_idx = set_fd(sock, POLLIN|POLLPRI);
 
        if (xce_handle != NULL)
                xce_pollfd_idx = set_fd(xenevtchn_fd(xce_handle),
@@ -2260,97 +2252,6 @@ struct connection *get_connection_by_id(unsigned int 
conn_id)
        return NULL;
 }
 
-#ifdef NO_SOCKETS
-static void accept_connection(int sock)
-{
-}
-#else
-static int writefd(struct connection *conn, const void *data, unsigned int len)
-{
-       int rc;
-
-       while ((rc = write(conn->fd, data, len)) < 0) {
-               if (errno == EAGAIN) {
-                       rc = 0;
-                       break;
-               }
-               if (errno != EINTR)
-                       break;
-       }
-
-       return rc;
-}
-
-static int readfd(struct connection *conn, void *data, unsigned int len)
-{
-       int rc;
-
-       while ((rc = read(conn->fd, data, len)) < 0) {
-               if (errno == EAGAIN) {
-                       rc = 0;
-                       break;
-               }
-               if (errno != EINTR)
-                       break;
-       }
-
-       /* Reading zero length means we're done with this connection. */
-       if ((rc == 0) && (len != 0)) {
-               errno = EBADF;
-               rc = -1;
-       }
-
-       return rc;
-}
-
-static bool socket_can_process(struct connection *conn, int mask)
-{
-       if (conn->pollfd_idx == -1)
-               return false;
-
-       if (poll_fds[conn->pollfd_idx].revents & ~(POLLIN | POLLOUT)) {
-               talloc_free(conn);
-               return false;
-       }
-
-       return (poll_fds[conn->pollfd_idx].revents & mask);
-}
-
-static bool socket_can_write(struct connection *conn)
-{
-       return socket_can_process(conn, POLLOUT);
-}
-
-static bool socket_can_read(struct connection *conn)
-{
-       return socket_can_process(conn, POLLIN);
-}
-
-const struct interface_funcs socket_funcs = {
-       .write = writefd,
-       .read = readfd,
-       .can_write = socket_can_write,
-       .can_read = socket_can_read,
-};
-
-static void accept_connection(int sock)
-{
-       int fd;
-       struct connection *conn;
-
-       fd = accept(sock, NULL, NULL);
-       if (fd < 0)
-               return;
-
-       conn = new_connection(&socket_funcs);
-       if (conn) {
-               conn->fd = fd;
-               conn->id = dom0_domid;
-       } else
-               close(fd);
-}
-#endif
-
 /* We create initial nodes manually. */
 static void manual_node(const char *name, const char *child)
 {
@@ -2579,46 +2480,6 @@ void corrupt(struct connection *conn, const char *fmt, 
...)
        errno = saved_errno;
 }
 
-#ifndef NO_SOCKETS
-static void destroy_fds(void)
-{
-       if (sock >= 0)
-               close(sock);
-}
-
-void init_sockets(void)
-{
-       struct sockaddr_un addr;
-       const char *soc_str = xenstore_daemon_path();
-
-       if (!soc_str)
-               barf_perror("Failed to obtain xs domain socket");
-
-       /* Create sockets for them to listen to. */
-       atexit(destroy_fds);
-       sock = socket(PF_UNIX, SOCK_STREAM, 0);
-       if (sock < 0)
-               barf_perror("Could not create socket");
-
-       /* FIXME: Be more sophisticated, don't mug running daemon. */
-       unlink(soc_str);
-
-       addr.sun_family = AF_UNIX;
-
-       if(strlen(soc_str) >= sizeof(addr.sun_path))
-               barf_perror("socket string '%s' too long", soc_str);
-       strcpy(addr.sun_path, soc_str);
-       if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) != 0)
-               barf_perror("Could not bind socket to %s", soc_str);
-
-       if (chmod(soc_str, 0600) != 0)
-               barf_perror("Could not chmod sockets");
-
-       if (listen(sock, 1) != 0)
-               barf_perror("Could not listen on sockets");
-}
-#endif
-
 static void usage(void)
 {
        fprintf(stderr,
@@ -2796,7 +2657,6 @@ int set_trace_switch(const char *arg)
 int main(int argc, char *argv[])
 {
        int opt;
-       int sock_pollfd_idx = -1;
        bool dofork = true;
        bool live_update = false;
        const char *pidfile = NULL;
@@ -2907,7 +2767,7 @@ int main(int argc, char *argv[])
        check_store();
 
        /* Get ready to listen to the tools. */
-       initialize_fds(&sock_pollfd_idx, &timeout);
+       initialize_fds(&timeout);
 
        late_init(live_update);
 
@@ -2923,16 +2783,6 @@ int main(int argc, char *argv[])
 
                handle_special_fds();
 
-               if (sock_pollfd_idx != -1) {
-                       if (poll_fds[sock_pollfd_idx].revents & ~POLLIN) {
-                               barf_perror("sock poll failed");
-                               break;
-                       } else if (poll_fds[sock_pollfd_idx].revents & POLLIN) {
-                               accept_connection(sock);
-                               sock_pollfd_idx = -1;
-                       }
-               }
-
                if (xce_pollfd_idx != -1) {
                        if (poll_fds[xce_pollfd_idx].revents & ~POLLIN) {
                                barf_perror("xce_handle poll failed");
@@ -2986,7 +2836,7 @@ int main(int argc, char *argv[])
                        }
                }
 
-               initialize_fds(&sock_pollfd_idx, &timeout);
+               initialize_fds(&timeout);
        }
 }
 
@@ -2999,7 +2849,7 @@ const char *dump_state_global(FILE *fp)
        head.length = sizeof(glb);
        if (fwrite(&head, sizeof(head), 1, fp) != 1)
                return "Dump global state error";
-       glb.socket_fd = sock;
+       glb.socket_fd = get_socket_fd();
        glb.evtchn_fd = xenevtchn_fd(xce_handle);
        if (fwrite(&glb, sizeof(glb), 1, fp) != 1)
                return "Dump global state error";
@@ -3235,7 +3085,7 @@ void read_state_global(const void *ctx, const void *state)
 {
        const struct xs_state_global *glb = state;
 
-       sock = glb->socket_fd;
+       set_socket_fd(glb->socket_fd);
 
        domain_init(glb->evtchn_fd);
 }
diff --git a/tools/xenstored/core.h b/tools/xenstored/core.h
index 44c4d0f8b8..6180ec8b5c 100644
--- a/tools/xenstored/core.h
+++ b/tools/xenstored/core.h
@@ -301,6 +301,7 @@ int rm_node(struct connection *conn, const void *ctx, const 
char *name);
 
 void setup_structure(bool live_update);
 struct connection *new_connection(const struct interface_funcs *funcs);
+struct connection *add_socket_connection(int fd);
 struct connection *get_connection_by_id(unsigned int conn_id);
 void check_store(void);
 void corrupt(struct connection *conn, const char *fmt, ...);
@@ -394,14 +395,12 @@ int set_fd(int fd, short events);
 void set_special_fds(void);
 void handle_special_fds(void);
 
-void init_sockets(void);
+int get_socket_fd(void);
+void set_socket_fd(int fd);
 
 /* Close stdin/stdout/stderr to complete daemonize */
 void finish_daemonize(void);
 
-#ifndef NO_SOCKETS
-extern const struct interface_funcs socket_funcs;
-#endif
 extern xengnttab_handle **xgt_handle;
 
 int remember_string(struct hashtable *hash, const char *str);
diff --git a/tools/xenstored/domain.c b/tools/xenstored/domain.c
index 6ef136e01f..040df98b8c 100644
--- a/tools/xenstored/domain.c
+++ b/tools/xenstored/domain.c
@@ -1739,14 +1739,7 @@ void read_state_connection(const void *ctx, const void 
*state)
        struct domain *domain, *tdomain;
 
        if (sc->conn_type == XS_STATE_CONN_TYPE_SOCKET) {
-#ifdef NO_SOCKETS
-               barf("socket based connection without sockets");
-#else
-               conn = new_connection(&socket_funcs);
-               if (!conn)
-                       barf("error restoring connection");
-               conn->fd = sc->spec.socket_fd;
-#endif
+               conn = add_socket_connection(sc->spec.socket_fd);
        } else {
                domain = introduce_domain(ctx, sc->spec.ring.domid,
                                          sc->spec.ring.evtchn, true);
diff --git a/tools/xenstored/minios.c b/tools/xenstored/minios.c
index 3208169187..6d0c11423c 100644
--- a/tools/xenstored/minios.c
+++ b/tools/xenstored/minios.c
@@ -18,12 +18,18 @@
 #include <sys/types.h>
 #include <sys/mman.h>
 #include "core.h"
+#include "utils.h"
 #include <xen/grant_table.h>
 
 void finish_daemonize(void)
 {
 }
 
+struct connection *add_socket_connection(int fd)
+{
+       barf("socket based connection without sockets");
+}
+
 evtchn_port_t get_xenbus_evtchn(void)
 {
        return dom0_event;
@@ -55,3 +61,12 @@ void set_special_fds(void)
 void handle_special_fds(void)
 {
 }
+
+int get_socket_fd(void)
+{
+       return -1;
+}
+
+void set_socket_fd(int fd)
+{
+}
diff --git a/tools/xenstored/posix.c b/tools/xenstored/posix.c
index 1ea8475293..496329dfd1 100644
--- a/tools/xenstored/posix.c
+++ b/tools/xenstored/posix.c
@@ -24,6 +24,8 @@
 #include <stdlib.h>
 #include <syslog.h>
 #include <sys/mman.h>
+#include <sys/socket.h>
+#include <sys/un.h>
 #if defined(HAVE_SYSTEMD)
 #include <systemd/sd-daemon.h>
 #endif
@@ -32,10 +34,14 @@
 #include "utils.h"
 #include "core.h"
 #include "osdep.h"
+#include "talloc.h"
 
 static int reopen_log_pipe0_pollfd_idx = -1;
 static int reopen_log_pipe[2];
 
+static int sock_pollfd_idx = -1;
+static int sock = -1;
+
 static void write_pidfile(const char *pidfile)
 {
        char buf[100];
@@ -180,6 +186,142 @@ void *xenbus_map(void)
        return addr;
 }
 
+static int writefd(struct connection *conn, const void *data, unsigned int len)
+{
+       int rc;
+
+       while ((rc = write(conn->fd, data, len)) < 0) {
+               if (errno == EAGAIN) {
+                       rc = 0;
+                       break;
+               }
+               if (errno != EINTR)
+                       break;
+       }
+
+       return rc;
+}
+
+static int readfd(struct connection *conn, void *data, unsigned int len)
+{
+       int rc;
+
+       while ((rc = read(conn->fd, data, len)) < 0) {
+               if (errno == EAGAIN) {
+                       rc = 0;
+                       break;
+               }
+               if (errno != EINTR)
+                       break;
+       }
+
+       /* Reading zero length means we're done with this connection. */
+       if ((rc == 0) && (len != 0)) {
+               errno = EBADF;
+               rc = -1;
+       }
+
+       return rc;
+}
+
+static bool socket_can_process(struct connection *conn, int mask)
+{
+       if (conn->pollfd_idx == -1)
+               return false;
+
+       if (poll_fds[conn->pollfd_idx].revents & ~(POLLIN | POLLOUT)) {
+               talloc_free(conn);
+               return false;
+       }
+
+       return (poll_fds[conn->pollfd_idx].revents & mask);
+}
+
+static bool socket_can_write(struct connection *conn)
+{
+       return socket_can_process(conn, POLLOUT);
+}
+
+static bool socket_can_read(struct connection *conn)
+{
+       return socket_can_process(conn, POLLIN);
+}
+
+static const struct interface_funcs socket_funcs = {
+       .write = writefd,
+       .read = readfd,
+       .can_write = socket_can_write,
+       .can_read = socket_can_read,
+};
+
+static void accept_connection(int sock)
+{
+       int fd;
+       struct connection *conn;
+
+       fd = accept(sock, NULL, NULL);
+       if (fd < 0)
+               return;
+
+       conn = new_connection(&socket_funcs);
+       if (conn) {
+               conn->fd = fd;
+               conn->id = dom0_domid;
+       } else
+               close(fd);
+}
+
+static void destroy_fds(void)
+{
+       if (sock >= 0)
+               close(sock);
+}
+
+static void init_sockets(void)
+{
+       struct sockaddr_un addr;
+       const char *soc_str = xenstore_daemon_path();
+
+       if (!soc_str)
+               barf_perror("Failed to obtain xs domain socket");
+
+       /* Create sockets for them to listen to. */
+       atexit(destroy_fds);
+       sock = socket(PF_UNIX, SOCK_STREAM, 0);
+       if (sock < 0)
+               barf_perror("Could not create socket");
+
+       /* FIXME: Be more sophisticated, don't mug running daemon. */
+       unlink(soc_str);
+
+       addr.sun_family = AF_UNIX;
+
+       if (strlen(soc_str) >= sizeof(addr.sun_path))
+               barf_perror("socket string '%s' too long", soc_str);
+       strcpy(addr.sun_path, soc_str);
+       if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) != 0)
+               barf_perror("Could not bind socket to %s", soc_str);
+
+       if (chmod(soc_str, 0600) != 0)
+               barf_perror("Could not chmod sockets");
+
+       if (listen(sock, 1) != 0)
+               barf_perror("Could not listen on sockets");
+}
+
+
+struct connection *add_socket_connection(int fd)
+{
+       struct connection *conn;
+
+       conn = new_connection(&socket_funcs);
+       if (!conn)
+               barf("error restoring connection");
+       conn->fd = fd;
+
+       return conn;
+}
+
 void early_init(bool live_update, bool dofork, const char *pidfile)
 {
        reopen_log();
@@ -212,6 +354,9 @@ void set_special_fds(void)
        if (reopen_log_pipe[0] != -1)
                reopen_log_pipe0_pollfd_idx =
                        set_fd(reopen_log_pipe[0], POLLIN|POLLPRI);
+
+       if (sock != -1)
+               sock_pollfd_idx = set_fd(sock, POLLIN|POLLPRI);
 }
 
 void handle_special_fds(void)
@@ -231,6 +376,15 @@ void handle_special_fds(void)
                }
                reopen_log_pipe0_pollfd_idx = -1;
        }
+
+       if (sock_pollfd_idx != -1) {
+               if (poll_fds[sock_pollfd_idx].revents & ~POLLIN) {
+                       barf_perror("sock poll failed");
+               } else if (poll_fds[sock_pollfd_idx].revents & POLLIN) {
+                       accept_connection(sock);
+                       sock_pollfd_idx = -1;
+               }
+       }
 }
 
 void late_init(bool live_update)
@@ -242,3 +396,13 @@ void late_init(bool live_update)
        }
 #endif
 }
+
+int get_socket_fd(void)
+{
+       return sock;
+}
+
+void set_socket_fd(int fd)
+{
+       sock = fd;
+}
-- 
2.35.3




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.