daemon: Constify argument of two functions.
[paraslash.git] / audiod_command.c
index 2b18837b7603de5e37b06ce579c0a604d10a34bb..278e6ef69e9f38a081aea8637405de8fcdc6e600 100644 (file)
 extern struct sched sched;
 extern char *stat_item_values[NUM_STAT_ITEMS];
 
+typedef int audiod_command_handler_t(int, int, char **);
+static audiod_command_handler_t AUDIOD_COMMAND_HANDLERS;
+
 /* Defines one command of para_audiod. */
 struct audiod_command {
        const char *name;
        /* Pointer to the function that handles the command. */
-       int (*handler)(int, int, char **);
+       /*
+        * Command handlers must never never close their file descriptor. A
+        * positive return value tells audiod that the status items have
+        * changed. In this case audiod will send an updated version of all
+        * status items to to each connected stat client.
+        */
+       audiod_command_handler_t *handler;
        /* One-line description. */
        const char *description;
        /* Summary of the command line options. */
@@ -75,7 +84,7 @@ struct stat_client {
        int fd;
        /** Bitmask of those status items the client is interested in. */
        uint64_t item_mask;
-       /** See \ref stat_client flags. s*/
+       /** See \ref stat_client flags. */
        unsigned flags;
        /** Its entry in the list of stat clients. */
        struct list_head node;
@@ -180,8 +189,7 @@ void stat_client_write_item(int item_num)
                        continue;
                b = (sc->flags & SCF_PARSER_FRIENDLY)? &pfpb : &pb;
                if (!b->buf)
-                       (void)WRITE_STATUS_ITEM(b, item_num, "%s\n",
-                               msg? msg : "");
+                       WRITE_STATUS_ITEM(b, item_num, "%s\n", msg? msg : "");
                ret = write(sc->fd, b->buf, b->offset);
                if (ret == b->offset)
                        continue;
@@ -253,10 +261,11 @@ static int com_help(int fd, int argc, char **argv)
 {
        int i, ret;
        char *buf;
-       const char *dflt = "No such command. Available commands:\n";
 
-       if (argc < 2)
-               return dump_commands(fd);
+       if (argc < 2) {
+               ret = dump_commands(fd);
+               goto out;
+       }
        FOR_EACH_COMMAND(i) {
                if (strcmp(audiod_cmds[i].name, argv[1]))
                        continue;
@@ -271,12 +280,13 @@ static int com_help(int fd, int argc, char **argv)
                );
                ret = client_write(fd, buf);
                free(buf);
-               return ret;
+               goto out;
        }
-       ret = client_write(fd, dflt);
+       ret = client_write(fd, "No such command. Available commands:\n");
        if (ret > 0)
                ret = dump_commands(fd);
-       return ret;
+out:
+       return ret < 0? ret : 0;
 }
 
 static int com_tasks(int fd, __a_unused int argc, __a_unused char **argv)
@@ -287,7 +297,7 @@ static int com_tasks(int fd, __a_unused int argc, __a_unused char **argv)
        if (tl)
                ret = client_write(fd, tl);
        free(tl);
-       return ret;
+       return ret < 0? ret : 0;
 }
 
 static int com_stat(int fd, int argc, char **argv)
@@ -326,18 +336,19 @@ static int com_stat(int fd, int argc, char **argv)
                char *item = stat_item_values[i];
                if (!((one << i) & mask))
                        continue;
-               (void)WRITE_STATUS_ITEM(&b, i, "%s\n", item? item : "");
+               WRITE_STATUS_ITEM(&b, i, "%s\n", item? item : "");
        }
        ret = client_write(fd, b.buf);
        if (ret >= 0)
                ret = stat_client_add(fd, mask, parser_friendly);
        free(b.buf);
-       return ret;
+       return ret < 0? ret : 0;
 }
 
 static int com_grab(int fd, int argc, char **argv)
 {
-       return grab_client_new(fd, argc, argv, &sched);
+       int ret = grab_client_new(fd, argc, argv, &sched);
+       return ret < 0? ret : 0;
 }
 
 static int com_term(__a_unused int fd, __a_unused int argc, __a_unused char **argv)
@@ -390,7 +401,7 @@ static int com_version(int fd, int argc, char **argv)
                msg = make_message("%s\n", version_single_line("audiod"));
        ret = client_write(fd, msg);
        free(msg);
-       return ret;
+       return ret < 0? ret : 0;
 }
 
 static int check_perms(uid_t uid, uid_t *whitelist)
@@ -437,7 +448,7 @@ int handle_connect(int accept_fd, fd_set *rfds, uid_t *uid_whitelist)
        if (ret < 0)
                goto out;
        uid = ret;
-       PARA_INFO_LOG("connection from user %i, buf: %s\n",  ret, buf);
+       PARA_INFO_LOG("connection from user %i, buf: %s\n", ret, buf);
        ret = check_perms(uid, uid_whitelist);
        if (ret < 0)
                goto out;