Introduce LIST_HEAD macro and use it in audiod_command.
[paraslash.git] / command.c
index f8b5e4ee50f47af295c2e4d2689d30fc031eb44f..afa1e667ca3bfdfedfd17e7de6be622f210ec383 100644 (file)
--- a/command.c
+++ b/command.c
@@ -6,6 +6,7 @@
 
 /** \file command.c Client authentication and server commands. */
 
+#include <regex.h>
 #include <signal.h>
 #include <sys/time.h>
 #include <sys/types.h>
@@ -367,6 +368,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;
@@ -824,10 +826,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);
@@ -839,7 +845,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++;