]> oss.titaniummirror.com Git - repo_shell.git/commitdiff
Simpler and better handling of non-repo access
authorR. Steve McKown <rsmckown@gmail.com>
Mon, 24 Sep 2012 14:21:05 +0000 (08:21 -0600)
committerR. Steve McKown <rsmckown@gmail.com>
Mon, 24 Sep 2012 14:21:05 +0000 (08:21 -0600)
repo_shell.c

index f92ce6ef1c804084e88f96f4d52c5b69557e0a83..7fb31d4c9f6340efff9bfde16c2979deb0a25b49 100644 (file)
@@ -12,6 +12,7 @@
 
 #define CFG_FILE "/etc/repo_shell.cfg"
 #define GIT_ACL_FILE "git_acl.cfg"
+#define SHELL "/bin/bash"
 
 typedef struct {
        char *svn_root;
@@ -19,8 +20,6 @@ typedef struct {
        char *owner;
 } cfg_t;
 
-static const char* shell_argv[] = { "/bin/bash", NULL };
-
 #undef USE_DEFAULTS
 #ifdef USE_DEFAULTS /* perhaps we want defaults?  Not sure */
 static cfg_t cfg {
@@ -191,70 +190,6 @@ static int do_svnserve_cmd(const char *cmd, char *arg, char *user)
        return execvp(svnserve_argv[0], (char *const *) svnserve_argv);
 }
 
-#define SPLIT_CMDLINE_BAD_ENDING 1
-#define SPLIT_CMDLINE_UNCLOSED_QUOTE 2
-static const char *split_cmdline_errors[] = {
-       "cmdline ends with \\",
-       "unclosed quote"
-};
-
-int split_cmdline(char *cmdline, const char ***argv)
-{
-       int src, dst, count = 0, size = 16;
-       char quoted = 0;
-
-       *argv = xmalloc(sizeof(char *) * size);
-
-       /* split alias_string */
-       (*argv)[count++] = cmdline;
-       for (src = dst = 0; cmdline[src];) {
-               char c = cmdline[src];
-               if (!quoted && isspace(c)) {
-                       cmdline[dst++] = 0;
-                       while (cmdline[++src]
-                                       && isspace(cmdline[src]))
-                               ; /* skip */
-                       ALLOC_GROW(*argv, count+1, size);
-                       (*argv)[count++] = cmdline + dst;
-               } else if (!quoted && (c == '\'' || c == '"')) {
-                       quoted = c;
-                       src++;
-               } else if (c == quoted) {
-                       quoted = 0;
-                       src++;
-               } else {
-                       if (c == '\\' && quoted != '\'') {
-                               src++;
-                               c = cmdline[src];
-                               if (!c) {
-                                       free(*argv);
-                                       *argv = NULL;
-                                       return -SPLIT_CMDLINE_BAD_ENDING;
-                               }
-                       }
-                       cmdline[dst++] = c;
-                       src++;
-               }
-       }
-
-       cmdline[dst] = 0;
-
-       if (quoted) {
-               free(*argv);
-               *argv = NULL;
-               return -SPLIT_CMDLINE_UNCLOSED_QUOTE;
-       }
-
-       ALLOC_GROW(*argv, count+1, size);
-       (*argv)[count] = NULL;
-
-       return count;
-}
-
-const char *split_cmdline_strerror(int split_cmdline_errno) {
-       return split_cmdline_errors[-split_cmdline_errno-1];
-}
-
 static void cd_to_homedir(void)
 {
        const char *home = getenv("HOME");
@@ -320,8 +255,9 @@ int main(int argc, char **argv)
 
        if (argc == 1 && check_ssh_interactive(getuid())) {
                setuid(getuid());
-               execvp(shell_argv[0], (char *const *) shell_argv);
-        }
+               argv[0] = SHELL;
+               execvp(argv[0], (char *const *) argv);
+       }
 
 #ifdef USE_DEFAULTS
        ini_parse("repo_shell.cfg", handler, &cfg);
@@ -362,14 +298,6 @@ int main(int argc, char **argv)
 
        setuid(getuid());
        cd_to_homedir();
-       count = split_cmdline(prog, &user_argv);
-       if (count >= 0) {
-               execvp(user_argv[0], (char *const *) user_argv);
-               free(user_argv);
-               die("unrecognized command '%s'", argv[2]);
-       } else {
-               free(prog);
-               die("invalid command format '%s': %s", argv[2],
-                   split_cmdline_strerror(count));
-       }
+       argv[0] = SHELL;
+       execvp(argv[0], (char *const *) argv);
 }