diff options
author | Ron Yorston <rmy@pobox.com> | 2020-08-05 15:33:12 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2020-08-05 15:33:12 +0100 |
commit | 4319228f3dcf3a5f941140482c30cca227c6ed0b (patch) | |
tree | 6d1203b9607d2f60ef503555872391d881da6163 | |
parent | b5fb54b4ac78c801dc4fa7a5b12dd6e296e52f3f (diff) | |
download | busybox-w32-4319228f3dcf3a5f941140482c30cca227c6ed0b.tar.gz busybox-w32-4319228f3dcf3a5f941140482c30cca227c6ed0b.tar.bz2 busybox-w32-4319228f3dcf3a5f941140482c30cca227c6ed0b.zip |
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.
-rw-r--r-- | archival/libarchive/open_transformer.c | 16 | ||||
-rw-r--r-- | archival/tar.c | 28 | ||||
-rw-r--r-- | include/mingw.h | 1 | ||||
-rw-r--r-- | 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) | |||
154 | #else /* ENABLE_PLATFORM_MINGW */ | 154 | #else /* ENABLE_PLATFORM_MINGW */ |
155 | void FAST_FUNC fork_transformer(int fd, const char *transform_prog) | 155 | void FAST_FUNC fork_transformer(int fd, const char *transform_prog) |
156 | { | 156 | { |
157 | char *cmd; | 157 | mingw_fork_compressor(fd, transform_prog, "r"); |
158 | int fd1; | ||
159 | |||
160 | if (find_applet_by_name(transform_prog) >= 0) { | ||
161 | cmd = xasprintf("%s --busybox %s -cf -", bb_busybox_exec_path, | ||
162 | transform_prog); | ||
163 | } | ||
164 | else { | ||
165 | cmd = xasprintf("%s -cf -", transform_prog); | ||
166 | } | ||
167 | if ( (fd1=mingw_popen_fd(cmd, "r", fd, NULL)) == -1 ) { | ||
168 | bb_perror_msg_and_die("can't execute '%s'", transform_prog); | ||
169 | } | ||
170 | free(cmd); | ||
171 | xmove_fd(fd1, fd); | ||
172 | } | 158 | } |
173 | #endif | 159 | #endif |
174 | 160 | ||
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 | |||
601 | return TRUE; | 601 | return TRUE; |
602 | } | 602 | } |
603 | 603 | ||
604 | #if SEAMLESS_COMPRESSION | 604 | # if SEAMLESS_COMPRESSION && !ENABLE_PLATFORM_MINGW32 |
605 | #if !ENABLE_PLATFORM_MINGW32 | ||
606 | /* Don't inline: vfork scares gcc and pessimizes code */ | 605 | /* Don't inline: vfork scares gcc and pessimizes code */ |
607 | static void NOINLINE vfork_compressor(int tar_fd, const char *gzip) | 606 | static void NOINLINE vfork_compressor(int tar_fd, const char *gzip) |
608 | { | 607 | { |
@@ -677,28 +676,11 @@ static void NOINLINE vfork_compressor(int tar_fd, const char *gzip) | |||
677 | bb_perror_msg_and_die("can't execute '%s'", gzip); | 676 | bb_perror_msg_and_die("can't execute '%s'", gzip); |
678 | } | 677 | } |
679 | } | 678 | } |
680 | #else | 679 | # endif /* SEAMLESS_COMPRESSION */ |
681 | static pid_t vfork_compressor(int tar_fd, const char *gzip) | ||
682 | { | ||
683 | char *cmd; | ||
684 | int fd1; | ||
685 | pid_t pid; | ||
686 | 680 | ||
687 | if (find_applet_by_name(gzip) >= 0) { | 681 | # if ENABLE_PLATFORM_MINGW32 |
688 | cmd = xasprintf("%s --busybox %s -cf -", bb_busybox_exec_path, gzip); | 682 | # define vfork_compressor(f, g) mingw_fork_compressor((f), (g), "w") |
689 | } | 683 | # endif |
690 | else { | ||
691 | cmd = xasprintf("%s -cf -", gzip); | ||
692 | } | ||
693 | if ( (fd1=mingw_popen_fd(cmd, "w", tar_fd, &pid)) == -1 ) { | ||
694 | bb_perror_msg_and_die("can't execute '%s'", gzip); | ||
695 | } | ||
696 | free(cmd); | ||
697 | xmove_fd(fd1, tar_fd); | ||
698 | return pid; | ||
699 | } | ||
700 | #endif /* ENABLE_PLATFORM_MINGW32 */ | ||
701 | #endif /* SEAMLESS_COMPRESSION */ | ||
702 | 684 | ||
703 | 685 | ||
704 | # if !SEAMLESS_COMPRESSION | 686 | # 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*); | |||
133 | FILE *mingw_popen(const char *cmd, const char *mode); | 133 | FILE *mingw_popen(const char *cmd, const char *mode); |
134 | int mingw_popen_fd(const char *cmd, const char *mode, int fd0, pid_t *pid); | 134 | int mingw_popen_fd(const char *cmd, const char *mode, int fd0, pid_t *pid); |
135 | int mingw_pclose(FILE *fd); | 135 | int mingw_pclose(FILE *fd); |
136 | pid_t mingw_fork_compressor(int fd, const char *compressor, const char *mode); | ||
136 | #undef popen | 137 | #undef popen |
137 | #undef pclose | 138 | #undef pclose |
138 | #define popen mingw_popen | 139 | #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) | |||
306 | 306 | ||
307 | return (ret == WAIT_OBJECT_0) ? 0 : -1; | 307 | return (ret == WAIT_OBJECT_0) ? 0 : -1; |
308 | } | 308 | } |
309 | |||
310 | /* Used with mode "w" and a compressor when creating a compressed tar | ||
311 | * file; with mode "r" and a decompressor in open_transformer. */ | ||
312 | pid_t mingw_fork_compressor(int fd, const char *compressor, const char *mode) | ||
313 | { | ||
314 | char *cmd; | ||
315 | int fd1; | ||
316 | pid_t pid; | ||
317 | |||
318 | if (find_applet_by_name(compressor) >= 0) | ||
319 | cmd = xasprintf("%s --busybox %s -cf -", bb_busybox_exec_path, | ||
320 | compressor); | ||
321 | else | ||
322 | cmd = xasprintf("%s -cf -", compressor); | ||
323 | |||
324 | if ((fd1 = mingw_popen_fd(cmd, mode, fd, &pid)) == -1) | ||
325 | bb_perror_msg_and_die("can't execute '%s'", compressor); | ||
326 | |||
327 | free(cmd); | ||
328 | xmove_fd(fd1, fd); | ||
329 | return pid; | ||
330 | } | ||