new codename, reset version to git
[paraslash.git] / audiod_command.c
index 6bf5ac8600812ef6642c12ee2f5e0e1273ab3e84..77a0a1ee32bb7a1b3241afc549d999f124a6073e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2006 Andre Noll <noll@mathematik.tu-darmstadt.de>
+ * Copyright (C) 2005-2007 Andre Noll <maan@systemlinux.org>
  *
  *     This program is free software; you can redistribute it and/or modify
  *     it under the terms of the GNU General Public License as published by
@@ -37,7 +37,7 @@
 #include "audiod_command_list.h"
 
 /** iterate over the array of all audiod commands */
-#define FOR_EACH_COMMAND(c) for (c = 0; cmds[c].name; c++)
+#define FOR_EACH_COMMAND(c) for (c = 0; audiod_cmds[c].name; c++)
 
 static int client_write(int fd, const char *buf)
 {
@@ -141,8 +141,8 @@ static int dump_commands(int fd)
        ssize_t ret;
 
        FOR_EACH_COMMAND(i) {
-               tmp = make_message("%s%s\t%s\n", buf, cmds[i].name,
-                       cmds[i].description);
+               tmp = make_message("%s%s\t%s\n", buf, audiod_cmds[i].name,
+                       audiod_cmds[i].description);
                free(buf);
                buf = tmp;
        }
@@ -168,16 +168,16 @@ int com_help(int fd, int argc, char **argv)
                goto out;
        }
        FOR_EACH_COMMAND(i) {
-               if (strcmp(cmds[i].name, argv[1]))
+               if (strcmp(audiod_cmds[i].name, argv[1]))
                        continue;
                buf = make_message(
                        "NAME\n\t%s -- %s\n"
                        "SYNOPSIS\n\tpara_audioc %s\n"
                        "DESCRIPTION\n%s\n",
                        argv[1],
-                       cmds[i].description,
-                       cmds[i].synopsis,
-                       cmds[i].help
+                       audiod_cmds[i].description,
+                       audiod_cmds[i].usage,
+                       audiod_cmds[i].help
                );
                ret = client_write(fd, buf);
                free(buf);
@@ -350,7 +350,7 @@ err_out:
        return 1;
 }
 
-int __noreturn com_term(int fd, __a_unused int argc, __a_unused char **argv)
+__noreturn int com_term(int fd, __a_unused int argc, __a_unused char **argv)
 {
        close(fd);
        clean_exit(EXIT_SUCCESS, "terminating on user request");
@@ -406,6 +406,21 @@ static int check_perms(uid_t uid)
        return -E_UCRED_PERM;
 }
 
+/**
+ * handle arriving connections on the local socket
+ *
+ * \param accept_fd the fd to call accept() on
+ *
+ * This is called whenever para_audiod's main task detects an incoming
+ * connection by the readability of \a accept_fd. This function reads the
+ * command sent by the peer, checks the connecting user's permissions by using
+ * unix socket credentials (if supported by the OS) and calls the corresponding
+ * command handler if permissions are OK.
+ *
+ * \return positive on success, negative on errors
+ *
+ * \sa para_accept(), recv_cred_buffer()
+ * */
 int handle_connect(int accept_fd)
 {
        int i, argc, ret, clifd = -1;
@@ -432,21 +447,21 @@ int handle_connect(int accept_fd)
                *p = '\0';
                p++;
        }
-       for (i = 0; cmds[i].name; i++) {
+       for (i = 0; audiod_cmds[i].name; i++) {
                int j;
-               if (strcmp(cmds[i].name, cmd))
+               if (strcmp(audiod_cmds[i].name, cmd))
                        continue;
-               if (cmds[i].handler) {
+               if (audiod_cmds[i].handler) {
                        argc = split_args(buf, &argv, "\n");
                        PARA_INFO_LOG("argv[0]: %s, argc= %d\n", argv[0], argc);
-                       ret = cmds[i].handler(clifd, argc, argv);
+                       ret = audiod_cmds[i].handler(clifd, argc, argv);
                        goto out;
                }
                for (j = 0; p[j]; j++)
                        if (p[j] == '\n')
                                p[j] = ' ';
                PARA_INFO_LOG("cmd: %s, options: %s\n", cmd, p);
-               ret = cmds[i].line_handler(clifd, p);
+               ret = audiod_cmds[i].line_handler(clifd, p);
                goto out;
        }
        ret = -E_INVALID_AUDIOD_CMD;
@@ -462,7 +477,9 @@ out:
        }
        return ret;
 }
-
+/**
+ * send the current audiod status to all connected stat clients
+ */
 void audiod_status_dump(void)
 {
        struct timeval *t = wstime();
@@ -503,6 +520,7 @@ void audiod_status_dump(void)
        old = stat_task->stat_item_values[SI_DECODER_FLAGS];
        new = decoder_flags();
        if (!old || strcmp(old, new)) {
+               free(old);
                stat_client_write(new, SI_DECODER_FLAGS);
                stat_task->stat_item_values[SI_DECODER_FLAGS] = new;
        } else