X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=rsh.c;h=5754a230e2c23ce3fea255fccd8726af76c13317;hb=ed8ad7e2e29d4adf342964f6cc15d6b84f62c700;hp=bad5cff2c287d3c7dd288308428b89e0cb12299d;hpb=348c4c66dacb1810a9bcd592e72f98a465233488;p=git.git diff --git a/rsh.c b/rsh.c index bad5cff2c..5754a230e 100644 --- a/rsh.c +++ b/rsh.c @@ -1,79 +1,10 @@ -#include "rsh.h" - -#include -#include -#include - #include "cache.h" +#include "rsh.h" +#include "quote.h" #define COMMAND_SIZE 4096 -/* - * Write a shell-quoted version of a string into a buffer, and - * return bytes that ought to be output excluding final null. - */ -static int shell_quote(char *buf, int nmax, const char *str) -{ - char ch; - int nq; - int oc = 0; - - while ( (ch = *str++) ) { - nq = 0; - if ( strchr(" !\"#$%&\'()*;<=>?[\\]^`{|}", ch) ) - nq = 1; - - if ( nq ) { - if ( nmax > 1 ) { - *buf++ = '\\'; - nmax--; - } - oc++; - } - - if ( nmax > 1 ) { - *buf++ = ch; - nmax--; - } - oc++; - } - - if ( nmax ) - *buf = '\0'; - - return oc; -} - -/* - * Append a string to a string buffer, with or without quoting. Return true - * if the buffer overflowed. - */ -static int add_to_string(char **ptrp, int *sizep, const char *str, int quote) -{ - char *p = *ptrp; - int size = *sizep; - int oc; - int err = 0; - - if ( quote ) { - oc = shell_quote(p, size, str); - } else { - oc = strlen(str); - memcpy(p, str, (oc >= size) ? size-1 : oc); - } - - if ( oc >= size ) { - err = 1; - oc = size-1; - } - - *ptrp += oc; - **ptrp = '\0'; - *sizep -= oc; - return err; -} - -int setup_connection(int *fd_in, int *fd_out, const char *remote_prog, +int setup_connection(int *fd_in, int *fd_out, const char *remote_prog, char *url, int rmt_argc, char **rmt_argv) { char *host; @@ -84,6 +15,7 @@ int setup_connection(int *fd_in, int *fd_out, const char *remote_prog, int sizen; int of; int i; + pid_t pid; if (!strcmp(url, "-")) { *fd_in = 0; @@ -104,13 +36,12 @@ int setup_connection(int *fd_in, int *fd_out, const char *remote_prog, if (!path) { return error("Bad URL: %s", url); } - /* $GIT_RSH "env GIR_DIR= " */ + /* $GIT_RSH "env GIT_DIR= " */ sizen = COMMAND_SIZE; posn = command; of = 0; of |= add_to_string(&posn, &sizen, "env ", 0); - of |= add_to_string(&posn, &sizen, GIT_DIR_ENVIRONMENT, 0); - of |= add_to_string(&posn, &sizen, "=", 0); + of |= add_to_string(&posn, &sizen, GIT_DIR_ENVIRONMENT "=", 0); of |= add_to_string(&posn, &sizen, path, 1); of |= add_to_string(&posn, &sizen, " ", 0); of |= add_to_string(&posn, &sizen, remote_prog, 1); @@ -128,7 +59,10 @@ int setup_connection(int *fd_in, int *fd_out, const char *remote_prog, if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv)) return error("Couldn't create socket"); - if (!fork()) { + pid = fork(); + if (pid < 0) + return error("Couldn't fork"); + if (!pid) { const char *ssh, *ssh_basename; ssh = getenv("GIT_SSH"); if (!ssh) ssh = "ssh";