From 4319228f3dcf3a5f941140482c30cca227c6ed0b Mon Sep 17 00:00:00 2001 From: Ron Yorston Date: Wed, 5 Aug 2020 15:33:12 +0100 Subject: win32: move code to fork (de)compressor to a function Use a new common function, mingw_fork_compressor(), to implement fork_transformer() in open_transformer.c and vfork_compressor() in tar.c. Saves 160 bytes. --- archival/libarchive/open_transformer.c | 16 +--------------- archival/tar.c | 28 +++++----------------------- include/mingw.h | 1 + win32/popen.c | 22 ++++++++++++++++++++++ 4 files changed, 29 insertions(+), 38 deletions(-) diff --git a/archival/libarchive/open_transformer.c b/archival/libarchive/open_transformer.c index 1ac72af79..3d202ad26 100644 --- a/archival/libarchive/open_transformer.c +++ b/archival/libarchive/open_transformer.c @@ -154,21 +154,7 @@ void FAST_FUNC fork_transformer(int fd, const char *transform_prog) #else /* ENABLE_PLATFORM_MINGW */ void FAST_FUNC fork_transformer(int fd, const char *transform_prog) { - char *cmd; - int fd1; - - if (find_applet_by_name(transform_prog) >= 0) { - cmd = xasprintf("%s --busybox %s -cf -", bb_busybox_exec_path, - transform_prog); - } - else { - cmd = xasprintf("%s -cf -", transform_prog); - } - if ( (fd1=mingw_popen_fd(cmd, "r", fd, NULL)) == -1 ) { - bb_perror_msg_and_die("can't execute '%s'", transform_prog); - } - free(cmd); - xmove_fd(fd1, fd); + mingw_fork_compressor(fd, transform_prog, "r"); } #endif diff --git a/archival/tar.c b/archival/tar.c index c57bff779..c7642a50e 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -601,8 +601,7 @@ static int FAST_FUNC writeFileToTarball(const char *fileName, struct stat *statb return TRUE; } -#if SEAMLESS_COMPRESSION -#if !ENABLE_PLATFORM_MINGW32 +# if SEAMLESS_COMPRESSION && !ENABLE_PLATFORM_MINGW32 /* Don't inline: vfork scares gcc and pessimizes code */ static void NOINLINE vfork_compressor(int tar_fd, const char *gzip) { @@ -677,28 +676,11 @@ static void NOINLINE vfork_compressor(int tar_fd, const char *gzip) bb_perror_msg_and_die("can't execute '%s'", gzip); } } -#else -static pid_t vfork_compressor(int tar_fd, const char *gzip) -{ - char *cmd; - int fd1; - pid_t pid; +# endif /* SEAMLESS_COMPRESSION */ - if (find_applet_by_name(gzip) >= 0) { - cmd = xasprintf("%s --busybox %s -cf -", bb_busybox_exec_path, gzip); - } - else { - cmd = xasprintf("%s -cf -", gzip); - } - if ( (fd1=mingw_popen_fd(cmd, "w", tar_fd, &pid)) == -1 ) { - bb_perror_msg_and_die("can't execute '%s'", gzip); - } - free(cmd); - xmove_fd(fd1, tar_fd); - return pid; -} -#endif /* ENABLE_PLATFORM_MINGW32 */ -#endif /* SEAMLESS_COMPRESSION */ +# if ENABLE_PLATFORM_MINGW32 +# define vfork_compressor(f, g) mingw_fork_compressor((f), (g), "w") +# endif # if !SEAMLESS_COMPRESSION diff --git a/include/mingw.h b/include/mingw.h index a67b161c7..16f0396db 100644 --- a/include/mingw.h +++ b/include/mingw.h @@ -133,6 +133,7 @@ int mingw_rename(const char*, const char*); FILE *mingw_popen(const char *cmd, const char *mode); int mingw_popen_fd(const char *cmd, const char *mode, int fd0, pid_t *pid); int mingw_pclose(FILE *fd); +pid_t mingw_fork_compressor(int fd, const char *compressor, const char *mode); #undef popen #undef pclose #define popen mingw_popen diff --git a/win32/popen.c b/win32/popen.c index 0da5cde23..8810b8de0 100644 --- a/win32/popen.c +++ b/win32/popen.c @@ -306,3 +306,25 @@ int mingw_pclose(FILE *fp) return (ret == WAIT_OBJECT_0) ? 0 : -1; } + +/* Used with mode "w" and a compressor when creating a compressed tar + * file; with mode "r" and a decompressor in open_transformer. */ +pid_t mingw_fork_compressor(int fd, const char *compressor, const char *mode) +{ + char *cmd; + int fd1; + pid_t pid; + + if (find_applet_by_name(compressor) >= 0) + cmd = xasprintf("%s --busybox %s -cf -", bb_busybox_exec_path, + compressor); + else + cmd = xasprintf("%s -cf -", compressor); + + if ((fd1 = mingw_popen_fd(cmd, mode, fd, &pid)) == -1) + bb_perror_msg_and_die("can't execute '%s'", compressor); + + free(cmd); + xmove_fd(fd1, fd); + return pid; +} -- cgit v1.2.3-55-g6feb