git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] git-shell and git-cvsserver

From
JWJan Wielemaker <wielemak@science.uva.nl>
Date
Oct 5, 2007, 12:53 UTC
Message-ID
<200710051453.47622.wielemak@science.uva.nl>
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;
Next: Miklos Vajna
Message 1 of 10 in “git-shell and git-cvsserver”
  1. git-shell and git-cvsserverJan Wielemaker, Oct 5, 2007
  2. Miklos VajnaOct 5, 2007
  3. Frank LichtenheldOct 5, 2007
  4. Johannes SchindelinOct 8, 2007
  5. Jan WielemakerOct 8, 2007
  6. Johannes SchindelinOct 9, 2007
  7. Support cvs via git-shellJohannes Schindelin, Oct 9, 2007
  8. Frank LichtenheldOct 9, 2007
  9. Johannes SchindelinOct 10, 2007
  10. Frank LichtenheldOct 10, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.