server: Remove ->argc, ->argv from struct command_context.
authorAndre Noll <maan@tuebingen.mpg.de>
Sun, 22 May 2016 11:37:48 +0000 (13:37 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 26 Mar 2017 09:02:28 +0000 (11:02 +0200)
Command handlers should not look at the argv[] vector directly
but only use the lopsub library functions to access the parsed
command line.

In fact, the only function which accesses the argv vector is
run_command(). Defining argc and argv as local variables in this
function allows to drop the two members from the command context
structure.

command.c
command.h

index d7b68a4..89a6aea 100644 (file)
--- a/command.c
+++ b/command.c
@@ -812,8 +812,8 @@ out:
 static int run_command(struct command_context *cc, struct iovec *iov,
                const char *peername)
 {
-       int ret, i;
-       char *p, *end;
+       int ret, i, argc;
+       char *p, *end, **argv;
        const struct lls_command *lcmd = NULL;
        unsigned perms;
        struct lls_parse_result *lpr;
@@ -836,23 +836,23 @@ static int run_command(struct command_context *cc, struct iovec *iov,
        end = iov->iov_base + iov->iov_len;
        for (i = 0; p < end; i++)
                p += strlen(p) + 1;
-       cc->argc = i;
-       cc->argv = para_malloc((cc->argc + 1) * sizeof(char *));
+       argc = i;
+       argv = para_malloc((argc + 1) * sizeof(char *));
        for (i = 0, p = iov->iov_base; p < end; i++) {
-               cc->argv[i] = para_strdup(p);
+               argv[i] = para_strdup(p);
                p += strlen(p) + 1;
        }
-       cc->argv[cc->argc] = NULL;
+       argv[argc] = NULL;
        PARA_NOTICE_LOG("calling com_%s() for %s@%s\n", lls_command_name(lcmd),
                cc->u->name, peername);
-       ret = lls(lls_parse(cc->argc, cc->argv, lcmd, &lpr, &errctx));
+       ret = lls(lls_parse(argc, argv, lcmd, &lpr, &errctx));
        if (ret >= 0) {
                const struct server_cmd_user_data *ud = lls_user_data(lcmd);
                ret = ud->handler(cc, lpr);
                lls_free_parse_result(lpr, lcmd);
        } else
                send_errctx(cc, errctx);
-       free_argv(cc->argv);
+       free_argv(argv);
        mutex_lock(mmd_mutex);
        mmd->num_commands++;
        if (ret >= 0 && (perms & AFS_WRITE))
index 8a117b9..5b01eb7 100644 (file)
--- a/command.h
+++ b/command.h
@@ -6,10 +6,6 @@ struct command_context {
        const char *peer;
        /** The paraslash user that executes this command. */
        struct user *u;
-       /** Argument count. */
-       int argc;
-       /** Argument vector. */
-       char **argv;
        /** File descriptor and crypto keys. */
        struct stream_cipher_context scc;
 };