aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2020-08-05 15:33:12 +0100
committerRon Yorston <rmy@pobox.com>2020-08-05 15:33:12 +0100
commit4319228f3dcf3a5f941140482c30cca227c6ed0b (patch)
tree6d1203b9607d2f60ef503555872391d881da6163
parentb5fb54b4ac78c801dc4fa7a5b12dd6e296e52f3f (diff)
downloadbusybox-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.c16
-rw-r--r--archival/tar.c28
-rw-r--r--include/mingw.h1
-rw-r--r--win32/popen.c22
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 */
155void FAST_FUNC fork_transformer(int fd, const char *transform_prog) 155void 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 */
607static void NOINLINE vfork_compressor(int tar_fd, const char *gzip) 606static 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 */
681static 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*);
133FILE *mingw_popen(const char *cmd, const char *mode); 133FILE *mingw_popen(const char *cmd, const char *mode);
134int mingw_popen_fd(const char *cmd, const char *mode, int fd0, pid_t *pid); 134int mingw_popen_fd(const char *cmd, const char *mode, int fd0, pid_t *pid);
135int mingw_pclose(FILE *fd); 135int mingw_pclose(FILE *fd);
136pid_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. */
312pid_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}