From f25eafa586c84168afe6362c8d30df4627c741de Mon Sep 17 00:00:00 2001 From: Will Dormann Date: Tue, 2 Feb 2016 13:28:09 -0500 Subject: [PATCH 1/2] Retain file extension in copy mode. --- src/zzuf.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/zzuf.c b/src/zzuf.c index c46b84b..dcf0414 100644 --- a/src/zzuf.c +++ b/src/zzuf.c @@ -47,6 +47,7 @@ #include #include #include +#include #if defined HAVE_SYS_TIME_H # include #endif @@ -730,7 +731,7 @@ static void spawn_children(zzuf_opts_t *opts) if (!tmpdir || !*tmpdir) tmpdir = "/tmp"; - int k = 0; + int k = 0, extlen; for (int j = zz_optind + 1; j < opts->oldargc; ++j) { @@ -738,12 +739,24 @@ static void spawn_children(zzuf_opts_t *opts) if (!fpin) continue; + // Copy the path name since basename() might clobber it + char *tmpcopy = alloca(strlen(opts->oldargv[j])+1); + strcpy(tmpcopy, opts->oldargv[j]); + char *fbasename = basename(tmpcopy); + char *extension = strrchr(fbasename, '.'); + if (!extension) { + extlen = 0; + extension = ""; + } + else + extlen = strlen(extension); + #ifdef _WIN32 sprintf(tmpname, "%s/zzuf.%i.XXXXXX", tmpdir, GetCurrentProcessId()); int fdout = _open(mktemp(tmpname), _O_RDWR, 0600); #else - sprintf(tmpname, "%s/zzuf.%i.XXXXXX", tmpdir, (int)getpid()); - int fdout = mkstemp(tmpname); + sprintf(tmpname, "%s/zzuf.%i.XXXXXX%s", tmpdir, (int)getpid(), extension); + int fdout = mkstemps(tmpname, extlen); #endif if (fdout < 0) { From 17f2ef46b2e07cdc844a076063db0d37c9cb8b2c Mon Sep 17 00:00:00 2001 From: "Edward J. Schwartz" Date: Fri, 5 Feb 2016 11:16:01 -0500 Subject: [PATCH 2/2] Also include alloca.h --- src/zzuf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zzuf.c b/src/zzuf.c index dcf0414..97218a5 100644 --- a/src/zzuf.c +++ b/src/zzuf.c @@ -48,6 +48,7 @@ #include #include #include +#include #if defined HAVE_SYS_TIME_H # include #endif