]> git.cameronkatri.com Git - cgit.git/blobdiff - ui-snapshot.c
ui-snapshot: use cgit_{open|close}_filter() to execute compressors
[cgit.git] / ui-snapshot.c
index 5f813fc1d99bae806cd5f91028c68b2650c18099..4136b3eb8d05001b614b4f3ce3423dd897d4db0e 100644 (file)
 
 static int write_compressed_tar_archive(struct archiver_args *args,const char *filter)
 {
-       int rw[2];
-       pid_t gzpid;
-       int stdout2;
-       int status;
        int rv;
+       struct cgit_filter f;
 
-       stdout2 = chk_non_negative(dup(STDIN_FILENO), "Preserving STDOUT before compressing");
-       chk_zero(pipe(rw), "Opening pipe from compressor subprocess");
-       gzpid = chk_non_negative(fork(), "Forking compressor subprocess");
-       if(gzpid==0) {
-               /* child */
-               chk_zero(close(rw[1]), "Closing write end of pipe in child");
-               chk_zero(close(STDIN_FILENO), "Closing STDIN");
-               chk_non_negative(dup2(rw[0],STDIN_FILENO), "Redirecting compressor input to stdin");
-               execlp(filter,filter,NULL);
-               _exit(-1);
-       }
-       /* parent */
-       chk_zero(close(rw[0]), "Closing read end of pipe");
-       chk_non_negative(dup2(rw[1],STDOUT_FILENO), "Redirecting output to compressor");
-
+       f.cmd = xstrdup(filter);
+       f.argv = malloc(2 * sizeof(char *));
+       f.argv[0] = f.cmd;
+       f.argv[1] = NULL;
+       cgit_open_filter(&f);
        rv = write_tar_archive(args);
-
-       chk_zero(close(STDOUT_FILENO), "Closing STDOUT redirected to compressor");
-       chk_non_negative(dup2(stdout2,STDOUT_FILENO), "Restoring uncompressed STDOUT");
-       chk_zero(close(stdout2), "Closing uncompressed STDOUT");
-       chk_zero(close(rw[1]), "Closing write end of pipe in parent");
-       chk_positive(waitpid(gzpid,&status,0), "Waiting on compressor process");
-       if(! ( WIFEXITED(status) && WEXITSTATUS(status)==0 ) )
-               cgit_print_error("Failed to compress archive");
-
+       cgit_close_filter(&f);
        return rv;
 }
 
@@ -156,29 +135,42 @@ static const char *get_ref_from_filename(const char *url, const char *filename,
        return NULL;
 }
 
+void show_error(char *msg)
+{
+       ctx.page.mimetype = "text/html";
+       cgit_print_http_headers(&ctx);
+       cgit_print_docstart(&ctx);
+       cgit_print_pageheader(&ctx);
+       cgit_print_error(msg);
+       cgit_print_docend();
+}
+
 void cgit_print_snapshot(const char *head, const char *hex,
                         const char *filename, int snapshots, int dwim)
 {
        const struct cgit_snapshot_format* f;
        char *prefix = NULL;
 
+       if (!filename) {
+               show_error("No snapshot name specified");
+               return;
+       }
+
        f = get_format(filename);
        if (!f) {
-               ctx.page.mimetype = "text/html";
-               cgit_print_http_headers(&ctx);
-               cgit_print_docstart(&ctx);
-               cgit_print_pageheader(&ctx);
-               cgit_print_error(fmt("Unsupported snapshot format: %s", filename));
-               cgit_print_docend();
+               show_error(xstrdup(fmt("Unsupported snapshot format: %s",
+                                      filename)));
                return;
        }
 
        if (!hex && dwim) {
                hex = get_ref_from_filename(ctx.repo->url, filename, f);
-               if (hex != NULL) {
-                       prefix = xstrdup(filename);
-                       prefix[strlen(filename) - strlen(f->suffix)] = '\0';
+               if (hex == NULL) {
+                       html_status(404, "Not found", 0);
+                       return;
                }
+               prefix = xstrdup(filename);
+               prefix[strlen(filename) - strlen(f->suffix)] = '\0';
        }
 
        if (!hex)