aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2018-02-18 12:23:48 +0000
committerRon Yorston <rmy@pobox.com>2018-02-18 12:23:48 +0000
commitd1da09ea7a88cabdce417041ffa2018b7516de0c (patch)
treecb042c4f3bc01807ee00eaac09d4e707b8ed4460
parent96c9c0044f3c0a8e3b23e1eb05a86a6222cb741c (diff)
downloadbusybox-w32-d1da09ea7a88cabdce417041ffa2018b7516de0c.tar.gz
busybox-w32-d1da09ea7a88cabdce417041ffa2018b7516de0c.tar.bz2
busybox-w32-d1da09ea7a88cabdce417041ffa2018b7516de0c.zip
win32: use built-in shell for popen, if possible
popen uses the shell to run the command provided. If BusyBox has been configured appropriately use the built-in shell for this. - Currently the only user of popen in busybox-w32 is awk, which uses it when piping to or from commands. - If the command is available as an applet the shell will use it. If a different version of the program is required the command will need to specify the full path. - This change means that popen will work even if no shell is present on the path. - Since the binary may have been run as sh.exe or awk.exe it's necessary to use the magic --busybox option.
-rw-r--r--win32/popen.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/win32/popen.c b/win32/popen.c
index 6b8e52ca9..59f5ca9f0 100644
--- a/win32/popen.c
+++ b/win32/popen.c
@@ -1,5 +1,6 @@
1#include <fcntl.h> 1#include <fcntl.h>
2#include "libbb.h" 2#include "libbb.h"
3#include "NUM_APPLETS.h"
3 4
4typedef struct { 5typedef struct {
5 PROCESS_INFORMATION piProcInfo; 6 PROCESS_INFORMATION piProcInfo;
@@ -90,13 +91,22 @@ FILE *mingw_popen(const char *cmd, const char *mode)
90 } 91 }
91 } 92 }
92 93
93 len = strlen(cmd) + 10 + count; 94 len = strlen(bb_busybox_exec_path) + strlen(cmd) + 32 + count;
94 if ( (cmd_buff=malloc(len)) == NULL ) { 95 if ( (cmd_buff=malloc(len)) == NULL ) {
95 return NULL; 96 return NULL;
96 } 97 }
97 98
99#if (ENABLE_FEATURE_PREFER_APPLETS || ENABLE_FEATURE_SH_STANDALONE) && \
100 NUM_APPLETS > 1
101 if (find_applet_by_name("sh") >= 0) {
102 strcpy(cmd_buff, bb_busybox_exec_path);
103 strcat(cmd_buff, " --busybox sh -c \"");
104 }
105 else
106#endif
107 strcpy(cmd_buff, "sh -c \"");
108
98 /* escape double quotes */ 109 /* escape double quotes */
99 strcpy(cmd_buff, "sh -c \"");
100 for ( s=cmd,t=cmd_buff+strlen(cmd_buff); *s; ++s ) { 110 for ( s=cmd,t=cmd_buff+strlen(cmd_buff); *s; ++s ) {
101 if ( *s == '"' ) { 111 if ( *s == '"' ) {
102 *t++ = '\\'; 112 *t++ = '\\';