- const char *sent_argv[MAX_ARGS];
- struct child_process cld = { sent_argv };
- cld.out = cld.err = -1;
- cld.git_cmd = 1;
-
- if (argc != 2)
- usage(upload_archive_usage);
-
- if (!enter_repo(argv[1], 0))
- die("'%s' does not appear to be a git repository", argv[1]);
-
- prepare_argv(sent_argv, argv);
- if (start_command(&cld)) {
+ pid_t writer;
+ int fd1[2], fd2[2];
+ /*
+ * Set up sideband subprocess.
+ *
+ * We (parent) monitor and read from child, sending its fd#1 and fd#2
+ * multiplexed out to our fd#1. If the child dies, we tell the other
+ * end over channel #3.
+ */
+ if (pipe(fd1) < 0 || pipe(fd2) < 0) {
+ int err = errno;
+ packet_write(1, "NACK pipe failed on the remote side\n");
+ die("upload-archive: %s", strerror(err));
+ }
+ writer = fork();
+ if (writer < 0) {