afs: Use nonblocking API for server commands.
[paraslash.git] / command.c
index fa844b5ed2213bb8dc00777c18d25e9659b36e19..b7795a002a20f36349bd450522b99f746f3256ba 100644 (file)
--- a/command.c
+++ b/command.c
@@ -1,11 +1,12 @@
 /*
- * Copyright (C) 1997-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2010 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
 /** \file command.c Client authentication and server commands. */
 
+#include <regex.h>
 #include <signal.h>
 #include <sys/time.h>
 #include <sys/types.h>
@@ -42,6 +43,9 @@
 extern int mmd_mutex;
 extern struct misc_meta_data *mmd;
 extern struct sender senders[];
+int send_afs_status(struct rc4_context *rc4c, int parser_friendly);
+
+const char *status_item_list[] = {STATUS_ITEM_ARRAY};
 
 static void dummy(__a_unused int s)
 {
@@ -230,7 +234,7 @@ int com_si(struct rc4_context *rc4c, int argc, __a_unused char * const * argv)
 {
        int i, ret;
        char *ut;
-       char *sender_info = NULL, *sender_list = NULL;
+       char *sender_info = NULL;
 
        if (argc != 1)
                return -E_COMMAND_SYNTAX;
@@ -239,8 +243,6 @@ int com_si(struct rc4_context *rc4c, int argc, __a_unused char * const * argv)
                char *info = senders[i].info();
                sender_info = para_strcat(sender_info, info);
                free(info);
-               sender_list = para_strcat(sender_list, senders[i].name);
-               sender_list = para_strcat(sender_list, " ");
        }
        ut = uptime_str();
        ret = rc4_send_va_buffer(rc4c, "up: %s\nplayed: %u\n"
@@ -249,7 +251,6 @@ int com_si(struct rc4_context *rc4c, int argc, __a_unused char * const * argv)
                "connections (active/accepted/total): %u/%u/%u\n"
                "current loglevel: %s\n"
                "supported audio formats: %s\n"
-               "supported senders: %s\n"
                "%s",
                ut, mmd->num_played,
                (int)getppid(),
@@ -259,12 +260,10 @@ int com_si(struct rc4_context *rc4c, int argc, __a_unused char * const * argv)
                mmd->num_connects,
                conf.loglevel_arg,
                supported_audio_formats(),
-               sender_list,
                sender_info
        );
        mutex_unlock(mmd_mutex);
        free(ut);
-       free(sender_list);
        free(sender_info);
        return ret;
 }
@@ -364,6 +363,7 @@ int com_stat(struct rc4_context *rc4c, int argc, char * const * argv)
                        parser_friendly = 1;
                        continue;
                }
+               return -E_COMMAND_SYNTAX;
        }
        if (i != argc)
                return -E_COMMAND_SYNTAX;
@@ -773,7 +773,7 @@ __noreturn void handle_connect(int fd, const char *peername)
                numbytes = 256;
                get_random_bytes_or_die((unsigned char *)buf, numbytes);
        }
-       PARA_DEBUG_LOG("sending %zu byte challenge + rc4 keys (%u bytes)\n",
+       PARA_DEBUG_LOG("sending %u byte challenge + rc4 keys (%zu bytes)\n",
                CHALLENGE_SIZE, numbytes);
        ret = send_bin_buffer(fd, buf, numbytes);
        if (ret < 0)
@@ -783,7 +783,7 @@ __noreturn void handle_connect(int fd, const char *peername)
        if (ret < 0)
                goto net_err;
        numbytes = ret;
-       PARA_DEBUG_LOG("received %zu bytes challenge response\n", ret);
+       PARA_DEBUG_LOG("received %d bytes challenge response\n", ret);
        ret = -E_BAD_USER;
        if (!u)
                goto net_err;
@@ -821,10 +821,14 @@ __noreturn void handle_connect(int fd, const char *peername)
        if (ret < 0)
                goto err_out;
        /* valid command and sufficient perms */
-       argc = split_args(command, &argv, "\n");
+       ret = create_argv(command, "\n", &argv);
+       if (ret < 0)
+               goto err_out;
+       argc = ret;
        PARA_NOTICE_LOG("calling com_%s() for %s@%s\n", cmd->name, u->name,
                        peername);
        ret = cmd->handler(&rc4c, argc, argv);
+       free_argv(argv);
        mutex_lock(mmd_mutex);
        mmd->num_commands++;
        mutex_unlock(mmd_mutex);
@@ -836,7 +840,6 @@ net_err:
        PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
 out:
        free(command);
-       free(argv);
        mutex_lock(mmd_mutex);
        if (cmd && (cmd->perms & AFS_WRITE) && ret >= 0)
                mmd->events++;