Merge branch 'rs/daemon-plug-child-leak'
[gitweb.git] / fetch-pack.c
index 820251a8d80518508514b728b4b2afd8a171e296..2dabee97b28915ccf5c06b58dd0193bf03a01db8 100644 (file)
@@ -681,11 +681,10 @@ static int get_pack(struct fetch_pack_args *args,
                    int xd[2], char **pack_lockfile)
 {
        struct async demux;
-       const char *argv[22];
-       char keep_arg[256];
-       char hdr_arg[256];
-       const char **av, *cmd_name;
        int do_keep = args->keep_pack;
+       const char *cmd_name;
+       struct pack_header header;
+       int pass_header = 0;
        struct child_process cmd = CHILD_PROCESS_INIT;
        int ret;
 
@@ -705,17 +704,11 @@ static int get_pack(struct fetch_pack_args *args,
        else
                demux.out = xd[0];
 
-       cmd.argv = argv;
-       av = argv;
-       *hdr_arg = 0;
        if (!args->keep_pack && unpack_limit) {
-               struct pack_header header;
 
                if (read_pack_header(demux.out, &header))
                        die("protocol error: bad pack header");
-               snprintf(hdr_arg, sizeof(hdr_arg),
-                        "--pack_header=%"PRIu32",%"PRIu32,
-                        ntohl(header.hdr_version), ntohl(header.hdr_entries));
+               pass_header = 1;
                if (ntohl(header.hdr_entries) < unpack_limit)
                        do_keep = 0;
                else
@@ -723,44 +716,49 @@ static int get_pack(struct fetch_pack_args *args,
        }
 
        if (alternate_shallow_file) {
-               *av++ = "--shallow-file";
-               *av++ = alternate_shallow_file;
+               argv_array_push(&cmd.args, "--shallow-file");
+               argv_array_push(&cmd.args, alternate_shallow_file);
        }
 
        if (do_keep) {
                if (pack_lockfile)
                        cmd.out = -1;
-               *av++ = cmd_name = "index-pack";
-               *av++ = "--stdin";
+               cmd_name = "index-pack";
+               argv_array_push(&cmd.args, cmd_name);
+               argv_array_push(&cmd.args, "--stdin");
                if (!args->quiet && !args->no_progress)
-                       *av++ = "-v";
+                       argv_array_push(&cmd.args, "-v");
                if (args->use_thin_pack)
-                       *av++ = "--fix-thin";
+                       argv_array_push(&cmd.args, "--fix-thin");
                if (args->lock_pack || unpack_limit) {
-                       int s = sprintf(keep_arg,
-                                       "--keep=fetch-pack %"PRIuMAX " on ", (uintmax_t) getpid());
-                       if (gethostname(keep_arg + s, sizeof(keep_arg) - s))
-                               strcpy(keep_arg + s, "localhost");
-                       *av++ = keep_arg;
+                       char hostname[256];
+                       if (gethostname(hostname, sizeof(hostname)))
+                               xsnprintf(hostname, sizeof(hostname), "localhost");
+                       argv_array_pushf(&cmd.args,
+                                       "--keep=fetch-pack %"PRIuMAX " on %s",
+                                       (uintmax_t)getpid(), hostname);
                }
                if (args->check_self_contained_and_connected)
-                       *av++ = "--check-self-contained-and-connected";
+                       argv_array_push(&cmd.args, "--check-self-contained-and-connected");
        }
        else {
-               *av++ = cmd_name = "unpack-objects";
+               cmd_name = "unpack-objects";
+               argv_array_push(&cmd.args, cmd_name);
                if (args->quiet || args->no_progress)
-                       *av++ = "-q";
+                       argv_array_push(&cmd.args, "-q");
                args->check_self_contained_and_connected = 0;
        }
-       if (*hdr_arg)
-               *av++ = hdr_arg;
+
+       if (pass_header)
+               argv_array_pushf(&cmd.args, "--pack_header=%"PRIu32",%"PRIu32,
+                                ntohl(header.hdr_version),
+                                ntohl(header.hdr_entries));
        if (fetch_fsck_objects >= 0
            ? fetch_fsck_objects
            : transfer_fsck_objects >= 0
            ? transfer_fsck_objects
            : 0)
-               *av++ = "--strict";
-       *av++ = NULL;
+               argv_array_push(&cmd.args, "--strict");
 
        cmd.in = demux.out;
        cmd.git_cmd = 1;