--- 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;
}