Revision 60d0526aaa5d29589420bfadd0623ec878c5edf3 authored by Junio C Hamano on 14 September 2005, 20:15:53 UTC, committed by Junio C Hamano on 15 September 2005, 19:46:32 UTC
The code did not catch the case where you removed an existing ref
without changing anything else.  We are not talking about hundreds of
refs anyway, so remove that optimization.

Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent 0f56479
Raw File
rsh.c
#include "rsh.h"

#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>

#include "cache.h"

#define COMMAND_SIZE 4096

int setup_connection(int *fd_in, int *fd_out, const char *remote_prog, 
		     char *url, int rmt_argc, char **rmt_argv)
{
	char *host;
	char *path;
	int sv[2];
	char command[COMMAND_SIZE];
	char *posn;
	int i;

	if (!strcmp(url, "-")) {
		*fd_in = 0;
		*fd_out = 1;
		return 0;
	}

	host = strstr(url, "//");
	if (host) {
		host += 2;
		path = strchr(host, '/');
	} else {
		host = url;
		path = strchr(host, ':');
		if (path)
			*(path++) = '\0';
	}
	if (!path) {
		return error("Bad URL: %s", url);
	}
	/* ssh <host> 'cd <path>; stdio-pull <arg...> <commit-id>' */
	snprintf(command, COMMAND_SIZE, 
		 "%s='%s' %s",
		 GIT_DIR_ENVIRONMENT, path, remote_prog);
	*path = '\0';
	posn = command + strlen(command);
	for (i = 0; i < rmt_argc; i++) {
		*(posn++) = ' ';
		strncpy(posn, rmt_argv[i], COMMAND_SIZE - (posn - command));
		posn += strlen(rmt_argv[i]);
		if (posn - command + 4 >= COMMAND_SIZE) {
			return error("Command line too long");
		}
	}
	strcpy(posn, " -");
	if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv)) {
		return error("Couldn't create socket");
	}
	if (!fork()) {
		const char *ssh, *ssh_basename;
		ssh = getenv("GIT_SSH");
		if (!ssh) ssh = "ssh";
		ssh_basename = strrchr(ssh, '/');
		if (!ssh_basename)
			ssh_basename = ssh;
		else
			ssh_basename++;
		close(sv[1]);
		dup2(sv[0], 0);
		dup2(sv[0], 1);
		execlp(ssh, ssh_basename, host, command, NULL);
	}
	close(sv[0]);
	*fd_in = sv[1];
	*fd_out = sv[1];
	return 0;
}
back to top