4 static const char usage_msg[] =
 
   5         "git remote-fd <remote> <url>";
 
   9  *      'fd::<inoutfd>[/<anything>]'            Read/write socket pair
 
  11  *      'fd::<infd>,<outfd>[/<anything>]'       Read pipe <infd> and write
 
  13  *      [foo] indicates 'foo' is optional. <anything> is any string.
 
  15  * The data output to <outfd>/<inoutfd> should be passed unmolested to
 
  16  * git-receive-pack/git-upload-pack/git-upload-archive and output of
 
  17  * git-receive-pack/git-upload-pack/git-upload-archive should be passed
 
  18  * unmolested to <infd>/<inoutfd>.
 
  22 #define MAXCOMMAND 4096
 
  24 static void command_loop(int input_fd, int output_fd)
 
  26         char buffer[MAXCOMMAND];
 
  30                 if (!fgets(buffer, MAXCOMMAND - 1, stdin)) {
 
  35                 /* Strip end of line characters. */
 
  37                 while (i > 0 && isspace(buffer[i - 1]))
 
  40                 if (!strcmp(buffer, "capabilities")) {
 
  41                         printf("*connect\n\n");
 
  43                 } else if (!strncmp(buffer, "connect ", 8)) {
 
  46                         if (bidirectional_transfer_loop(input_fd,
 
  48                                 die("Copying data between file descriptors failed");
 
  51                         die("Bad command: %s", buffer);
 
  56 int cmd_remote_fd(int argc, const char **argv, const char *prefix)
 
  65         input_fd = (int)strtoul(argv[2], &end, 10);
 
  67         if ((end == argv[2]) || (*end != ',' && *end != '/' && *end))
 
  68                 die("Bad URL syntax");
 
  70         if (*end == '/' || !*end) {
 
  74                 output_fd = (int)strtoul(end + 1, &end2, 10);
 
  76                 if ((end2 == end + 1) || (*end2 != '/' && *end2))
 
  77                         die("Bad URL syntax");
 
  80         command_loop(input_fd, output_fd);