rsh.con commit Add "rev-list" program that uses the new time-based commit listing. (6474510)
   1#include "rsh.h"
   2
   3#include <string.h>
   4#include <sys/socket.h>
   5
   6#include "cache.h"
   7
   8#define COMMAND_SIZE 4096
   9
  10int setup_connection(int *fd_in, int *fd_out, char *remote_prog, 
  11                     char *url, int rmt_argc, char **rmt_argv)
  12{
  13        char *host;
  14        char *path;
  15        int sv[2];
  16        char command[COMMAND_SIZE];
  17        char *posn;
  18        int i;
  19
  20        if (!strcmp(url, "-")) {
  21                *fd_in = 0;
  22                *fd_out = 1;
  23                return 0;
  24        }
  25
  26        host = strstr(url, "//");
  27        if (!host) {
  28                return error("Bad URL: %s", url);
  29        }
  30        host += 2;
  31        path = strchr(host, '/');
  32        if (!path) {
  33                return error("Bad URL: %s", url);
  34        }
  35        *(path++) = '\0';
  36        /* ssh <host> 'cd /<path>; stdio-pull <arg...> <commit-id>' */
  37        snprintf(command, COMMAND_SIZE, 
  38                 "cd /%s; SHA1_FILE_DIRECTORY=objects %s",
  39                 path, remote_prog);
  40        posn = command + strlen(command);
  41        for (i = 0; i < rmt_argc; i++) {
  42                *(posn++) = ' ';
  43                strncpy(posn, rmt_argv[i], COMMAND_SIZE - (posn - command));
  44                posn += strlen(rmt_argv[i]);
  45                if (posn - command + 4 >= COMMAND_SIZE) {
  46                        return error("Command line too long");
  47                }
  48        }
  49        strcpy(posn, " -");
  50        if (socketpair(AF_LOCAL, SOCK_STREAM, 0, sv)) {
  51                return error("Couldn't create socket");
  52        }
  53        if (!fork()) {
  54                close(sv[1]);
  55                dup2(sv[0], 0);
  56                dup2(sv[0], 1);
  57                execlp("ssh", "ssh", host, command, NULL);
  58        }
  59        close(sv[0]);
  60        *fd_in = sv[1];
  61        *fd_out = sv[1];
  62        return 0;
  63}