aft: Avoid invalid read.
[paraslash.git] / audiod_command.c
index 9623c4f51453c81deb6f11d97a218bcb8696c987..bb54dfab87f7965a18f6cccbe6bc4077c147fa29 100644 (file)
@@ -1,8 +1,4 @@
-/*
- * Copyright (C) 2005 Andre Noll <maan@tuebingen.mpg.de>
- *
- * Licensed under the GPL v2. For licencing details see COPYING.
- */
+/* Copyright (C) 2005 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
 
 /** \file audiod_command.c Commands for para_audiod. */
 
@@ -17,6 +13,7 @@
 
 #include "audiod.lsg.h"
 #include "para.h"
+#include "lsu.h"
 #include "audiod_cmd.lsg.h"
 #include "list.h"
 #include "sched.h"
@@ -82,7 +79,7 @@ static INITIALIZED_LIST_HEAD(client_list);
 static int num_clients;
 
 /** The list of all status items used by para_{server,audiod,gui}. */
-const char *status_item_list[] = {STATUS_ITEM_ARRAY};
+const char *status_item_list[] = {STATUS_ITEMS};
 
 static void dump_stat_client_list(void)
 {
@@ -228,59 +225,17 @@ __malloc static char *audiod_status_string(void)
        return para_strdup(status);
 }
 
-static int dump_commands(int fd)
-{
-       char *buf = para_strdup(""), *tmp = NULL;
-       int i;
-       ssize_t ret;
-       const struct lls_command *cmd;
-
-       for (i = 1; (cmd = lls_cmd(i, audiod_cmd_suite)); i++) {
-               tmp = make_message("%s%s\t%s\n", buf, lls_command_name(cmd),
-                       lls_purpose(cmd));
-               free(buf);
-               buf = tmp;
-       }
-       ret = client_write(fd, buf);
-       free(buf);
-       return ret;
-}
-
 static int com_help(int fd, struct lls_parse_result *lpr)
 {
+       char *buf;
        int ret;
-       char *buf, *errctx;
-       const struct lls_command *cmd;
+       const struct lls_opt_result *r =
+               lls_opt_result(LSG_AUDIOD_CMD_HELP_OPT_LONG, lpr);
+       bool long_help = lls_opt_given(r);
 
-       ret = lls(lls_check_arg_count(lpr, 0, 1, &errctx));
-       if (ret < 0) {
-               if (errctx) {
-                       buf = make_message("%s\n", errctx);
-                       client_write(fd, buf);
-                       free(buf);
-                       free(errctx);
-               }
-               return ret;
-       }
-       if (lls_num_inputs(lpr) == 0)
-               return dump_commands(fd);
-       ret = lls(lls_lookup_subcmd(lls_input(0, lpr), audiod_cmd_suite,
-               &errctx));
-       if (ret < 0) {
-               buf = make_message("%s: %s\nAvailable commands:\n", errctx?
-                       errctx : lls_input(0, lpr), para_strerror(-ret));
-               if (client_write(fd, buf) >= 0)
-                       dump_commands(fd);
-               free(errctx);
-               free(buf);
-               goto out;
-       }
-       cmd = lls_cmd(ret, audiod_cmd_suite);
-       buf = lls_long_help(cmd);
-       assert(buf);
+       lsu_com_help(long_help, lpr, audiod_cmd_suite, NULL, &buf, NULL);
        ret = client_write(fd, buf);
        free(buf);
-out:
        return ret < 0? ret : 0;
 }
 EXPORT_AUDIOD_CMD_HANDLER(help)
@@ -416,7 +371,7 @@ EXPORT_AUDIOD_CMD_HANDLER(version)
  * \return Positive on success, negative on errors, zero if there was no
  * connection to accept.
  *
- * \sa para_accept(), recv_cred_buffer()
+ * \sa \ref para_accept(), \ref recv_cred_buffer().
  * */
 int handle_connect(int accept_fd, fd_set *rfds)
 {
@@ -481,41 +436,41 @@ void audiod_status_dump(bool force)
 {
        char *old, *new;
 
-       old = stat_item_values[SI_PLAY_TIME];
+       old = stat_item_values[SI_play_time];
        new = get_time_string();
        if (new) {
                if (force || !old || strcmp(old, new)) {
                        free(old);
-                       stat_item_values[SI_PLAY_TIME] = new;
-                       stat_client_write_item(SI_PLAY_TIME);
+                       stat_item_values[SI_play_time] = new;
+                       stat_client_write_item(SI_play_time);
                } else
                        free(new);
        }
 
        new = daemon_get_uptime_str(now);
-       old = stat_item_values[SI_AUDIOD_UPTIME];
+       old = stat_item_values[SI_audiod_uptime];
        if (force || !old || strcmp(old, new)) {
                free(old);
-               stat_item_values[SI_AUDIOD_UPTIME] = new;
-               stat_client_write_item(SI_AUDIOD_UPTIME);
+               stat_item_values[SI_audiod_uptime] = new;
+               stat_client_write_item(SI_audiod_uptime);
        } else
                free(new);
 
-       old = stat_item_values[SI_AUDIOD_STATUS];
+       old = stat_item_values[SI_audiod_status];
        new = audiod_status_string();
        if (force || !old || strcmp(old, new)) {
                free(old);
-               stat_item_values[SI_AUDIOD_STATUS] = new;
-               stat_client_write_item(SI_AUDIOD_STATUS);
+               stat_item_values[SI_audiod_status] = new;
+               stat_client_write_item(SI_audiod_status);
        } else
                free(new);
 
-       old = stat_item_values[SI_DECODER_FLAGS];
+       old = stat_item_values[SI_decoder_flags];
        new = audiod_get_decoder_flags();
        if (force || !old || strcmp(old, new)) {
                free(old);
-               stat_item_values[SI_DECODER_FLAGS] = new;
-               stat_client_write_item(SI_DECODER_FLAGS);
+               stat_item_values[SI_decoder_flags] = new;
+               stat_client_write_item(SI_decoder_flags);
        } else
                free(new);
 }