Hi, I know, I shouldn't be using git-cvsserver :-( Anyway, I patched git-shell to start git-cvsserver if it is started interactively and the one and only line given to it is "cvs server". The patch to shell.c is below. The trick with the EXEC_PATH is needed because git-cvsserver doesn't appear to be working if you do not include the git bindir in $PATH. I think that should be fixed in git-cvsserver and otherwise we should at least make the value come from the prefix make variable. With this patch I was able to use both Unix and Windows cvs clients using git-shell as login shell. Note that you must provide ~/.gitconfig with user and email in the restricted environment. Enjoy --- Jan --- shell.c.org 2007-10-05 13:08:47.000000000 +0200 +++ shell.c 2007-10-05 14:24:11.000000000 +0200 @@ -18,27 +18,80 @@ return execv_git_cmd(my_argv); } +#define EXEC_PATH "/usr/local/bin" + +static int do_cvs_cmd(const char *me, char *arg) +{ + const char *my_argv[4]; + const char *oldpath; + + if ( !arg ) + die("no argument"); + if ( strcmp(arg, "server") ) + die("only allows git-cvsserver server: %s", arg); + + my_argv[0] = "cvsserver"; + my_argv[1] = "server"; + my_argv[2] = NULL; + + if ( (oldpath=getenv("PATH")) ) { + char *newpath = malloc(strlen(oldpath)+strlen(EXEC_PATH)+5+1+1); + + sprintf(newpath, "PATH=%s:%s", EXEC_PATH, oldpath); + putenv(newpath); + } else { + char *newpath = malloc(strlen(EXEC_PATH)+5+1); + + sprintf(newpath, "PATH=%s", EXEC_PATH); + putenv(newpath); + } + + return execv_git_cmd(my_argv); +} + + static struct commands { const char *name; int (*exec)(const char *me, char *arg); } cmd_list[] = { { "git-receive-pack", do_generic_cmd }, { "git-upload-pack", do_generic_cmd }, + { "cvs", do_cvs_cmd }, { NULL }, }; int main(int argc, char **argv) { char *prog; + char buf[256]; struct commands *cmd; /* We want to see "-c cmd args", and nothing else */ - if (argc != 3 || strcmp(argv[1], "-c")) - die("What do you think I am? A shell?"); + if (argc == 1) { + if (fgets(buf, sizeof(buf)-1, stdin)) { + char *end; + + if ( (end=strchr(buf, '\n')) ) + { while(end>buf && end[-1] <= ' ') + end--; + *end = '\0'; + } else { + die("Bad command"); + } + + prog = buf; + } else { + die("No command"); + } + } else { + if (argc != 3 || strcmp(argv[1], "-c")) + die("What do you think I am? A shell?"); + + prog = argv[2]; + argv += 2; + argc -= 2; + } - prog = argv[2]; - argv += 2; - argc -= 2; for (cmd = cmd_list ; cmd->name ; cmd++) { int len = strlen(cmd->name); char *arg; - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html