2 * Original author : tridge@samba.org, January 2002
4 * Copyright (c) 2005 Christophe Varoqui
5 * Copyright (c) 2005 Benjamin Marzinski, Redhat
9 * A simple domain socket listener
18 #include <sys/ioctl.h>
19 #include <sys/types.h>
20 #include <sys/socket.h>
29 #include <structs_vec.h>
37 struct timespec sleep_time = {5, 0};
41 struct client *next, *prev;
44 static struct client *clients;
45 static unsigned num_clients;
47 volatile sig_atomic_t reconfig_sig = 0;
48 volatile sig_atomic_t log_reset_sig = 0;
51 * handle a new client joining
53 static void new_client(int ux_sock)
57 socklen_t len = sizeof(addr);
60 fd = accept(ux_sock, &addr, &len);
65 /* put it in our linked list */
66 c = (struct client *)MALLOC(sizeof(*c));
67 memset(c, 0, sizeof(*c));
70 if (c->next) c->next->prev = c;
76 * kill off a dead client
78 static void dead_client(struct client *c)
81 if (c->prev) c->prev->next = c->next;
82 if (c->next) c->next->prev = c->prev;
83 if (c == clients) clients = c->next;
88 void free_polls (void)
94 void uxsock_cleanup(void *arg)
103 void * uxsock_listen(int (*uxsock_trigger)(char *, char **, int *, void *),
113 ux_sock = ux_socket_listen(DEFAULT_SOCKET);
118 pthread_cleanup_push(uxsock_cleanup, NULL);
120 polls = (struct pollfd *)MALLOC(0);
121 pthread_sigmask(SIG_SETMASK, NULL, &mask);
122 sigdelset(&mask, SIGHUP);
123 sigdelset(&mask, SIGUSR1);
128 /* setup for a poll */
129 polls = REALLOC(polls, (1+num_clients) * sizeof(*polls));
130 polls[0].fd = ux_sock;
131 polls[0].events = POLLIN;
133 /* setup the clients */
134 for (i=1, c = clients; c; i++, c = c->next) {
136 polls[i].events = POLLIN;
139 /* most of our life is spent in this call */
140 poll_count = ppoll(polls, i, &sleep_time, &mask);
142 if (poll_count == -1) {
143 if (errno == EINTR) {
148 /* something went badly wrong! */
156 /* see if a client wants to speak to us */
157 for (i=1, c = clients; c; i++) {
158 struct client *next = c->next;
160 if (polls[i].revents & POLLIN) {
161 if (recv_packet(c->fd, &inbuf, &len) != 0) {
165 condlog(4, "Got request [%s]", inbuf);
166 uxsock_trigger(inbuf, &reply, &rlen,
169 if (send_packet(c->fd, reply,
173 condlog(4, "Reply [%d bytes]",
184 /* see if we got a new client */
185 if (polls[0].revents & POLLIN) {
190 pthread_cleanup_pop(1);