server: Simplify afs socket cookie code.
authorAndre Noll <maan@tuebingen.mpg.de>
Sun, 31 Dec 2017 15:27:25 +0000 (16:27 +0100)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 11 Feb 2018 10:28:17 +0000 (11:28 +0100)
Currently, the afs_socket_cookie value is passed to afs_init() and
is stored in the commmand task structure of the afs process. This
is unnecessary since the variable defined in server.c is non-static,
and declared as extern in afs.c. We may thus refer to this variable
from afs.c.

The variable was also documented twice. Get rid of one comment.

afs.c
afs.h
server.c

diff --git a/afs.c b/afs.c
index a8c504f..c2d5e7a 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -74,11 +74,6 @@ static struct afs_table afs_tables[NUM_AFS_TABLES] = {
 struct command_task {
        /** The file descriptor for the local socket. */
        int fd;
-       /**
-        * Value sent by the command handlers to identify themselves as
-        * children of the running para_server.
-        */
-       uint32_t cookie;
        /** The associated task structure. */
        struct task *task;
 };
@@ -93,15 +88,6 @@ static struct signal_task *signal_task;
 static enum play_mode current_play_mode;
 static char *current_mop; /* mode or playlist specifier. NULL means dummy mood */
 
-/**
- * A random number used to "authenticate" the connection.
- *
- * para_server picks this number by random before it forks the afs process. The
- * command handlers know this number as well and write it to the afs socket,
- * together with the id of the shared memory area which contains the payload of
- * the afs command. A local process has to know this number to abuse the afs
- * service provided by the local socket.
- */
 extern uint32_t afs_socket_cookie;
 
 /**
@@ -880,7 +866,7 @@ static int execute_server_command(fd_set *rfds)
 }
 
 /* returns 0 if no data available, 1 else */
-static int execute_afs_command(int fd, fd_set *rfds, uint32_t expected_cookie)
+static int execute_afs_command(int fd, fd_set *rfds)
 {
        uint32_t cookie;
        int query_shmid;
@@ -898,9 +884,9 @@ static int execute_afs_command(int fd, fd_set *rfds, uint32_t expected_cookie)
                return 1;
        }
        cookie = *(uint32_t *)buf;
-       if (cookie != expected_cookie) {
+       if (cookie != afs_socket_cookie) {
                PARA_NOTICE_LOG("received invalid cookie (got %u, expected %u)\n",
-                       (unsigned)cookie, (unsigned)expected_cookie);
+                       (unsigned)cookie, (unsigned)afs_socket_cookie);
                return 1;
        }
        query_shmid = *(int *)(buf + sizeof(cookie));
@@ -938,7 +924,7 @@ static int command_post_select(struct sched *s, void *context)
        }
        /* Check the list of connected clients. */
        list_for_each_entry_safe(client, tmp, &afs_client_list, node) {
-               ret = execute_afs_command(client->fd, &s->rfds, ct->cookie);
+               ret = execute_afs_command(client->fd, &s->rfds);
                if (ret == 0) { /* prevent bogus connection flooding */
                        struct timeval diff;
                        tv_diff(now, &client->connect_time, &diff);
@@ -969,11 +955,10 @@ static int command_post_select(struct sched *s, void *context)
        return 0;
 }
 
-static void register_command_task(uint32_t cookie, struct sched *s)
+static void register_command_task(struct sched *s)
 {
        struct command_task *ct = &command_task_struct;
        ct->fd = setup_command_socket_or_die();
-       ct->cookie = cookie;
 
        ct->task = task_register(&(struct task_info) {
                .name = "afs command",
@@ -986,10 +971,9 @@ static void register_command_task(uint32_t cookie, struct sched *s)
 /**
  * Initialize the audio file selector process.
  *
- * \param cookie The value used for "authentication".
  * \param socket_fd File descriptor used for communication with the server.
  */
-__noreturn void afs_init(uint32_t cookie, int socket_fd)
+__noreturn void afs_init(int socket_fd)
 {
        static struct sched s;
        int i, ret;
@@ -1005,10 +989,9 @@ __noreturn void afs_init(uint32_t cookie, int socket_fd)
        ret = mark_fd_nonblocking(server_socket);
        if (ret < 0)
                goto out_close;
-       PARA_INFO_LOG("server_socket: %d, afs_socket_cookie: %u\n",
-               server_socket, (unsigned) cookie);
+       PARA_INFO_LOG("server_socket: %d\n", server_socket);
        init_admissible_files(OPT_STRING_VAL(AFS_INITIAL_MODE));
-       register_command_task(cookie, &s);
+       register_command_task(&s);
        s.default_timeout.tv_sec = 0;
        s.default_timeout.tv_usec = 999 * 1000;
        ret = write(socket_fd, "\0", 1);
diff --git a/afs.h b/afs.h
index 544a498..f506cbf 100644 (file)
--- a/afs.h
+++ b/afs.h
@@ -212,7 +212,7 @@ _static_inline_ int afs_max_size_handler(char *buf, size_t size, void *private)
        return pass_buffer_as_shm(amshd->fd, amshd->band, buf, size);
 }
 
-__noreturn void afs_init(uint32_t cookie, int socket_fd);
+__noreturn void afs_init(int socket_fd);
 __must_check int afs_event(enum afs_events event, struct para_buffer *pb,
        void *data);
 int send_callback_request(afs_callback *f, struct osl_object *query,
index 2018b8e..8c2a78f 100644 (file)
--- a/server.c
+++ b/server.c
@@ -86,7 +86,15 @@ struct lls_parse_result *server_lpr = NULL;
 /* Command line options (no config file options). Used in handle_sighup(). */
 static struct lls_parse_result *cmdline_lpr;
 
-/** A random value used in child context for authentication. */
+/**
+ * A random number used to "authenticate" the afs connection.
+ *
+ * para_server picks this number by random before it forks the afs process. The
+ * command handlers know this number as well and write it to the afs socket,
+ * together with the id of the shared memory area which contains the payload of
+ * the afs command. A local process has to know this number to abuse the afs
+ * service provided by the local socket.
+ */
 uint32_t afs_socket_cookie;
 
 /** The mutex protecting the shared memory area containing the mmd struct. */
@@ -454,7 +462,7 @@ static int init_afs(int argc, char **argv)
                i = argc - lls_num_inputs(cmdline_lpr) - 1;
                sprintf(argv[i], "para_server (afs)");
                close(afs_server_socket[0]);
-               afs_init(afs_socket_cookie, afs_server_socket[1]);
+               afs_init(afs_server_socket[1]);
        }
        close(afs_server_socket[1]);
        if (read(afs_server_socket[0], &c, 1) <= 0) {