contrib/hgsh/hgsh.c
changeset 10282 08a0f04b56bd
parent 5081 ea7b982b6c08
child 13297 613b8bd2284e
--- a/contrib/hgsh/hgsh.c	Mon Jan 25 00:05:22 2010 -0600
+++ b/contrib/hgsh/hgsh.c	Mon Jan 25 00:05:27 2010 -0600
@@ -89,7 +89,7 @@
  */
 #ifndef HG_SHELL
 #define HG_SHELL        NULL
-// #define HG_SHELL        "/bin/bash"
+/* #define HG_SHELL        "/bin/bash" */
 #endif
 
 /*
@@ -118,40 +118,40 @@
 
 static void print_cmdline(int argc, char **argv)
 {
-    FILE *fp = stderr;
-    int i;
+	FILE *fp = stderr;
+	int i;
 
-    fputs("command: ", fp);
+	fputs("command: ", fp);
 
-    for (i = 0; i < argc; i++) {
-        char *spc = strpbrk(argv[i], " \t\r\n");
-        if (spc) {
-            fputc('\'', fp);
-        }
-        fputs(argv[i], fp);
-        if (spc) {
-            fputc('\'', fp);
-        }
-        if (i < argc - 1) {
-            fputc(' ', fp);
-        }
-    }
-    fputc('\n', fp);
-    fflush(fp);
+	for (i = 0; i < argc; i++) {
+		char *spc = strpbrk(argv[i], " \t\r\n");
+		if (spc) {
+			fputc('\'', fp);
+		}
+		fputs(argv[i], fp);
+		if (spc) {
+			fputc('\'', fp);
+		}
+		if (i < argc - 1) {
+			fputc(' ', fp);
+		}
+	}
+	fputc('\n', fp);
+	fflush(fp);
 }
 
 static void usage(const char *reason, int exitcode)
 {
-    char *hg_help = HG_HELP;
+	char *hg_help = HG_HELP;
 
-    if (reason) {
-        fprintf(stderr, "*** Error: %s.\n", reason);
-    }
-    fprintf(stderr, "*** This program has been invoked incorrectly.\n");
-    if (hg_help) {
-        fprintf(stderr, "*** %s\n", hg_help);
-    }
-    exit(exitcode ? exitcode : EX_USAGE);
+	if (reason) {
+		fprintf(stderr, "*** Error: %s.\n", reason);
+	}
+	fprintf(stderr, "*** This program has been invoked incorrectly.\n");
+	if (hg_help) {
+		fprintf(stderr, "*** %s\n", hg_help);
+	}
+	exit(exitcode ? exitcode : EX_USAGE);
 }
 
 /*
@@ -162,43 +162,43 @@
  */
 static void forward_through_gateway(int argc, char **argv)
 {
-    char *ssh = SSH;
-    char *hg_host = HG_HOST;
-    char *hg_user = HG_USER;
-    char **nargv = alloca((10 + argc) * sizeof(char *));
-    int i = 0, j;
+	char *ssh = SSH;
+	char *hg_host = HG_HOST;
+	char *hg_user = HG_USER;
+	char **nargv = alloca((10 + argc) * sizeof(char *));
+	int i = 0, j;
 
-    nargv[i++] = ssh;
-    nargv[i++] = "-q";
-    nargv[i++] = "-T";
-    nargv[i++] = "-x";
-    if (hg_user) {
-        nargv[i++] = "-l";
-        nargv[i++] = hg_user;
-    }
-    nargv[i++] = hg_host;
+	nargv[i++] = ssh;
+	nargv[i++] = "-q";
+	nargv[i++] = "-T";
+	nargv[i++] = "-x";
+	if (hg_user) {
+		nargv[i++] = "-l";
+		nargv[i++] = hg_user;
+	}
+	nargv[i++] = hg_host;
 
-    /*
-     * sshd called us with added "-c", because it thinks we are a shell.
-     * drop it if we find it.
-     */
-    j = 1;
-    if (j < argc && strcmp(argv[j], "-c") == 0) {
-        j++;
-    }
+	/*
+	 * sshd called us with added "-c", because it thinks we are a shell.
+	 * drop it if we find it.
+	 */
+	j = 1;
+	if (j < argc && strcmp(argv[j], "-c") == 0) {
+		j++;
+	}
 
-    for (; j < argc; i++, j++) {
-        nargv[i] = argv[j];
-    }
-    nargv[i] = NULL;
+	for (; j < argc; i++, j++) {
+		nargv[i] = argv[j];
+	}
+	nargv[i] = NULL;
 
-    if (debug) {
-        print_cmdline(i, nargv);
-    }
+	if (debug) {
+		print_cmdline(i, nargv);
+	}
 
-    execv(ssh, nargv);
-    perror(ssh);
-    exit(EX_UNAVAILABLE);
+	execv(ssh, nargv);
+	perror(ssh);
+	exit(EX_UNAVAILABLE);
 }
 
 /*
@@ -209,44 +209,44 @@
  */
 static void run_shell(int argc, char **argv)
 {
-    char *hg_shell = HG_SHELL;
-    char **nargv;
-    char *c;
-    int i;
+	char *hg_shell = HG_SHELL;
+	char **nargv;
+	char *c;
+	int i;
 
-    nargv = alloca((argc + 3) * sizeof(char *));
-    c = strrchr(hg_shell, '/');
+	nargv = alloca((argc + 3) * sizeof(char *));
+	c = strrchr(hg_shell, '/');
 
-    /* tell "real" shell it is login shell, if needed. */
+	/* tell "real" shell it is login shell, if needed. */
 
-    if (argv[0][0] == '-' && c) {
-        nargv[0] = strdup(c);
-        if (nargv[0] == NULL) {
-            perror("malloc");
-            exit(EX_OSERR);
-        }
-        nargv[0][0] = '-';
-    } else {
-        nargv[0] = hg_shell;
-    }
+	if (argv[0][0] == '-' && c) {
+		nargv[0] = strdup(c);
+		if (nargv[0] == NULL) {
+			perror("malloc");
+			exit(EX_OSERR);
+		}
+		nargv[0][0] = '-';
+	} else {
+		nargv[0] = hg_shell;
+	}
 
-    for (i = 1; i < argc; i++) {
-        nargv[i] = argv[i];
-    }
-    nargv[i] = NULL;
+	for (i = 1; i < argc; i++) {
+		nargv[i] = argv[i];
+	}
+	nargv[i] = NULL;
 
-    if (debug) {
-        print_cmdline(i, nargv);
-    }
+	if (debug) {
+		print_cmdline(i, nargv);
+	}
 
-    execv(hg_shell, nargv);
-    perror(hg_shell);
-    exit(EX_OSFILE);
+	execv(hg_shell, nargv);
+	perror(hg_shell);
+	exit(EX_OSFILE);
 }
 
 enum cmdline {
-    hg_init,
-    hg_serve,
+	hg_init,
+	hg_serve,
 };
 
 
@@ -256,25 +256,25 @@
  */
 static int validate_repo(const char *repo_root, const char *subdir)
 {
-    char *abs_path;
-    struct stat st;
-    int ret;
+	char *abs_path;
+	struct stat st;
+	int ret;
 
-    if (asprintf(&abs_path, "%s.hg/%s", repo_root, subdir) == -1) {
-	ret = -1;
-	goto bail;
-    }
+	if (asprintf(&abs_path, "%s.hg/%s", repo_root, subdir) == -1) {
+		ret = -1;
+		goto bail;
+	}
 
-    /* verify that we really are looking at valid repo. */
+	/* verify that we really are looking at valid repo. */
 
-    if (stat(abs_path, &st) == -1) {
-	ret = 0;
-    } else {
-	ret = 1;
-    }
+	if (stat(abs_path, &st) == -1) {
+		ret = 0;
+	} else {
+		ret = 1;
+	}
 
 bail:
-    return ret;
+	return ret;
 }
 
 /*
@@ -282,158 +282,159 @@
  */
 static void serve_data(int argc, char **argv)
 {
-    char *hg_root = HG_ROOT;
-    char *repo, *repo_root;
-    enum cmdline cmd;
-    char *nargv[6];
-    size_t repolen;
-    int i;
-
-    /*
-     * check argv for looking okay. we should be invoked with argv
-     * resembling like this:
-     *
-     *   hgsh
-     *   -c
-     *   hg -R some/path serve --stdio
-     *
-     * the "-c" is added by sshd, because it thinks we are login shell.
-     */
+	char *hg_root = HG_ROOT;
+	char *repo, *repo_root;
+	enum cmdline cmd;
+	char *nargv[6];
+	size_t repolen;
+	int i;
 
-    if (argc != 3) {
-        goto badargs;
-    }
-
-    if (strcmp(argv[1], "-c") != 0) {
-        goto badargs;
-    }
-
-    if (sscanf(argv[2], "hg init %as", &repo) == 1) {
-	cmd = hg_init;
-    }
-    else if (sscanf(argv[2], "hg -R %as serve --stdio", &repo) == 1) {
-	cmd = hg_serve;
-    } else {
-        goto badargs;
-    }
-
-    repolen = repo ? strlen(repo) : 0;
+	/*
+	 * check argv for looking okay. we should be invoked with argv
+	 * resembling like this:
+	 *
+	 *   hgsh
+	 *   -c
+	 *   hg -R some/path serve --stdio
+	 *
+	 * the "-c" is added by sshd, because it thinks we are login shell.
+	 */
 
-    if (repolen == 0) {
-        goto badargs;
-    }
-
-    if (hg_root) {
-        if (asprintf(&repo_root, "%s/%s/", hg_root, repo) == -1) {
-            goto badargs;
-        }
+	if (argc != 3) {
+		goto badargs;
+	}
 
-        /*
-         * attempt to stop break out from inside the repository tree. could
-         * do something more clever here, because e.g. we could traverse a
-         * symlink that looks safe, but really breaks us out of tree.
-         */
-
-        if (strstr(repo_root, "/../") != NULL) {
-            goto badargs;
-        }
-
-	/* only hg init expects no repo. */
+	if (strcmp(argv[1], "-c") != 0) {
+		goto badargs;
+	}
 
-	if (cmd != hg_init) {
-	    int valid;
-
-	    valid = validate_repo(repo_root, "data");
-
-	    if (valid == -1) {
+	if (sscanf(argv[2], "hg init %as", &repo) == 1) {
+		cmd = hg_init;
+	}
+	else if (sscanf(argv[2], "hg -R %as serve --stdio", &repo) == 1) {
+		cmd = hg_serve;
+	} else {
 		goto badargs;
-	    }
+	}
 
-	    if (valid == 0) {
-		valid = validate_repo(repo_root, "store");
+	repolen = repo ? strlen(repo) : 0;
 
-		if (valid == -1) {
-		    goto badargs;
-		}
-	    }
-
-	    if (valid == 0) {
-		perror(repo);
-		exit(EX_DATAERR);
-	    }
+	if (repolen == 0) {
+		goto badargs;
 	}
 
-        if (chdir(hg_root) == -1) {
-            perror(hg_root);
-            exit(EX_SOFTWARE);
-        }
-    }
+	if (hg_root) {
+		if (asprintf(&repo_root, "%s/%s/", hg_root, repo) == -1) {
+			goto badargs;
+		}
+
+		/*
+		 * attempt to stop break out from inside the
+		 * repository tree. could do something more clever
+		 * here, because e.g. we could traverse a symlink that
+		 * looks safe, but really breaks us out of tree.
+		 */
+
+		if (strstr(repo_root, "/../") != NULL) {
+			goto badargs;
+		}
 
-    i = 0;
+		/* only hg init expects no repo. */
+
+		if (cmd != hg_init) {
+			int valid;
+
+			valid = validate_repo(repo_root, "data");
+
+			if (valid == -1) {
+				goto badargs;
+			}
+
+			if (valid == 0) {
+				valid = validate_repo(repo_root, "store");
+
+				if (valid == -1) {
+					goto badargs;
+				}
+			}
 
-    switch (cmd) {
-    case hg_serve:
-	nargv[i++] = HG;
-	nargv[i++] = "-R";
-	nargv[i++] = repo;
-	nargv[i++] = "serve";
-	nargv[i++] = "--stdio";
-	break;
-    case hg_init:
-	nargv[i++] = HG;
-	nargv[i++] = "init";
-	nargv[i++] = repo;
-	break;
-    }
+			if (valid == 0) {
+				perror(repo);
+				exit(EX_DATAERR);
+			}
+		}
+
+		if (chdir(hg_root) == -1) {
+			perror(hg_root);
+			exit(EX_SOFTWARE);
+		}
+	}
+
+	i = 0;
 
-    nargv[i] = NULL;
+	switch (cmd) {
+	case hg_serve:
+		nargv[i++] = HG;
+		nargv[i++] = "-R";
+		nargv[i++] = repo;
+		nargv[i++] = "serve";
+		nargv[i++] = "--stdio";
+		break;
+	case hg_init:
+		nargv[i++] = HG;
+		nargv[i++] = "init";
+		nargv[i++] = repo;
+		break;
+	}
 
-    if (debug) {
-        print_cmdline(i, nargv);
-    }
+	nargv[i] = NULL;
 
-    execv(HG, nargv);
-    perror(HG);
-    exit(EX_UNAVAILABLE);
+	if (debug) {
+		print_cmdline(i, nargv);
+	}
+
+	execv(HG, nargv);
+	perror(HG);
+	exit(EX_UNAVAILABLE);
 
 badargs:
-    /* print useless error message. */
+	/* print useless error message. */
 
-    usage("invalid arguments", EX_DATAERR);
+	usage("invalid arguments", EX_DATAERR);
 }
 
 int main(int argc, char **argv)
 {
-    char host[1024];
-    char *c;
+	char host[1024];
+	char *c;
 
-    if (gethostname(host, sizeof(host)) == -1) {
-        perror("gethostname");
-        exit(EX_OSERR);
-    }
+	if (gethostname(host, sizeof(host)) == -1) {
+		perror("gethostname");
+		exit(EX_OSERR);
+	}
 
-    if ((c = strchr(host, '.')) != NULL) {
-        *c = '\0';
-    }
+	if ((c = strchr(host, '.')) != NULL) {
+		*c = '\0';
+	}
 
-    if (getenv("SSH_CLIENT")) {
-        char *hg_gateway = HG_GATEWAY;
-        char *hg_host = HG_HOST;
+	if (getenv("SSH_CLIENT")) {
+		char *hg_gateway = HG_GATEWAY;
+		char *hg_host = HG_HOST;
 
-        if (hg_gateway && strcmp(host, hg_gateway) == 0) {
-            forward_through_gateway(argc, argv);
-        }
+		if (hg_gateway && strcmp(host, hg_gateway) == 0) {
+			forward_through_gateway(argc, argv);
+		}
 
-        if (hg_host && strcmp(host, hg_host) != 0) {
-            usage("invoked on unexpected host", EX_USAGE);
-        }
+		if (hg_host && strcmp(host, hg_host) != 0) {
+			usage("invoked on unexpected host", EX_USAGE);
+		}
 
-        serve_data(argc, argv);
-    } else if (HG_SHELL) {
-        run_shell(argc, argv);
-    } else {
-        usage("invalid arguments", EX_DATAERR);
-    }
+		serve_data(argc, argv);
+	} else if (HG_SHELL) {
+		run_shell(argc, argv);
+	} else {
+		usage("invalid arguments", EX_DATAERR);
+	}
 
-    return 0;
+	return 0;
 }