t/README: start testing porcelainish
[gitweb.git] / rsh.c
diff --git a/rsh.c b/rsh.c
index 1c636861ddec037854240d6d3f5fa517d605bc2f..07166addd9629675c4b0c7c065564a283014b69d 100644 (file)
--- a/rsh.c
+++ b/rsh.c
@@ -1,76 +1,40 @@
-#include "rsh.h"
-
 #include <string.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 
+#include "rsh.h"
+#include "quote.h"
 #include "cache.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.
+ * Append a string to a string buffer, with or without shell 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);
+               oc = sq_quote_buf(p, size, str);
        } else {
                oc = strlen(str);
                memcpy(p, str, (oc >= size) ? size-1 : oc);
        }
 
        if ( oc >= size ) {
-               p[size-1] = '\0';
-               *ptrp += size-1;
-               *sizep = 1;
-               return 1;       /* Overflow, string unusable */
+               err = 1;
+               oc = size-1;
        }
 
        *ptrp  += oc;
+       **ptrp  = '\0';
        *sizep -= oc;
-       return 0;
+       return err;
 }
 
 int setup_connection(int *fd_in, int *fd_out, const char *remote_prog, 
@@ -84,6 +48,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 +69,12 @@ int setup_connection(int *fd_in, int *fd_out, const char *remote_prog,
        if (!path) {
                return error("Bad URL: %s", url);
        }
-       /* $GIT_RSH <host> "env GIR_DIR=<path> <remote_prog> <args...>" */
+       /* $GIT_RSH <host> "env GIT_DIR=<path> <remote_prog> <args...>" */
        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 +92,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";