Skip to content

Commit

Permalink
tools/xenstored: move all socket handling into posix.c
Browse files Browse the repository at this point in the history
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@suse.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
  • Loading branch information
jgross1 authored and Julien Grall committed Feb 5, 2024
1 parent aae5445 commit e199a30
Show file tree
Hide file tree
Showing 6 changed files with 188 additions and 171 deletions.
4 changes: 0 additions & 4 deletions tools/xenstored/Makefile.common
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
160 changes: 5 additions & 155 deletions tools/xenstored/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -486,7 +480,7 @@ int set_fd(int fd, short events)
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;
Expand All @@ -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),
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand All @@ -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");
Expand Down Expand Up @@ -2986,7 +2836,7 @@ int main(int argc, char *argv[])
}
}

initialize_fds(&sock_pollfd_idx, &timeout);
initialize_fds(&timeout);
}
}

Expand All @@ -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";
Expand Down Expand Up @@ -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);
}
Expand Down
7 changes: 3 additions & 4 deletions tools/xenstored/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -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, ...);
Expand Down Expand Up @@ -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);
Expand Down
9 changes: 1 addition & 8 deletions tools/xenstored/domain.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
15 changes: 15 additions & 0 deletions tools/xenstored/minios.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
}

0 comments on commit e199a30

Please sign in to comment.