aboutsummaryrefslogtreecommitdiff
path: root/findutils/xargs.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2000-09-25 18:41:18 +0000
committerEric Andersen <andersen@codepoet.org>2000-09-25 18:41:18 +0000
commitbf73909f23a00bdcc4f4e12459c64b99b2ebcddb (patch)
tree6b1ed235a82cea62302e873815f4bdf52320cb10 /findutils/xargs.c
parent944be90b21318902a091ca285e19895369a2caea (diff)
downloadbusybox-w32-bf73909f23a00bdcc4f4e12459c64b99b2ebcddb.tar.gz
busybox-w32-bf73909f23a00bdcc4f4e12459c64b99b2ebcddb.tar.bz2
busybox-w32-bf73909f23a00bdcc4f4e12459c64b99b2ebcddb.zip
Be ever so pedantic about escaping chars that the shell might not like...
Diffstat (limited to 'findutils/xargs.c')
-rw-r--r--findutils/xargs.c76
1 files changed, 59 insertions, 17 deletions
diff --git a/findutils/xargs.c b/findutils/xargs.c
index 478e0ee6d..21bfb6bbe 100644
--- a/findutils/xargs.c
+++ b/findutils/xargs.c
@@ -29,6 +29,59 @@
29#include <getopt.h> 29#include <getopt.h>
30#include <ctype.h> 30#include <ctype.h>
31 31
32/* get_sh_safe_line_from_file() - This function reads an entire line from a text file
33 * up to a newline. It returns a malloc'ed char * which must be stored and
34 * free'ed by the caller. */
35extern char *get_sh_safe_line_from_file(FILE *file)
36{
37 static const int GROWBY = 80; /* how large we will grow strings by */
38
39 char ch, last_ch = 0;
40 char tmp[]=" ";
41 int idx = 0;
42 char *linebuf = NULL;
43 int linebufsz = 0;
44
45 while (1) {
46 ch = fgetc(file);
47 if (ch == EOF)
48 break;
49
50 /* grow the line buffer as necessary */
51 while (idx > linebufsz-4)
52 linebuf = xrealloc(linebuf, linebufsz += GROWBY);
53
54 /* Remove any extra spaces */
55 if (last_ch == ' ' && ch == ' ')
56 continue;
57
58 /* Replace any tabs with spaces */
59 if (ch == '\t')
60 ch=' ';
61
62 /* Escape any characters that are treated specially by /bin/sh */
63 *tmp=ch;
64 if (strpbrk(tmp, "\\~`!$^&*()=|{}[];\"'<>?#") != NULL && last_ch!='\\') {
65 linebuf[idx++] = '\\';
66 }
67
68 linebuf[idx++] = ch;
69 last_ch=ch;
70
71 if (ch == '\n')
72 break;
73 }
74 if (idx == 0 && last_ch!=0)
75 linebuf[idx++]=' ';
76
77 if (idx == 0)
78 return NULL;
79
80 linebuf[idx] = 0;
81 return linebuf;
82}
83
84
32 85
33int xargs_main(int argc, char **argv) 86int xargs_main(int argc, char **argv)
34{ 87{
@@ -54,7 +107,7 @@ int xargs_main(int argc, char **argv)
54 } 107 }
55 108
56 /* Store the command and arguments to be executed (from the command line) */ 109 /* Store the command and arguments to be executed (from the command line) */
57 if (argc == 1) { 110 if (argc == 0) {
58 len_args_from_cmdline = 6; 111 len_args_from_cmdline = 6;
59 args_from_cmdline = xmalloc(len_args_from_cmdline); 112 args_from_cmdline = xmalloc(len_args_from_cmdline);
60 strcat(args_from_cmdline, "echo "); 113 strcat(args_from_cmdline, "echo ");
@@ -72,6 +125,7 @@ int xargs_main(int argc, char **argv)
72 } 125 }
73 strcat(args_from_cmdline, *argv); 126 strcat(args_from_cmdline, *argv);
74 strcat(args_from_cmdline, " "); 127 strcat(args_from_cmdline, " ");
128 ++argv;
75 } 129 }
76 } 130 }
77 131
@@ -79,30 +133,19 @@ int xargs_main(int argc, char **argv)
79 len_cmd_to_be_executed=10; 133 len_cmd_to_be_executed=10;
80 cmd_to_be_executed = xcalloc(len_cmd_to_be_executed, sizeof(char)); 134 cmd_to_be_executed = xcalloc(len_cmd_to_be_executed, sizeof(char));
81 strcpy(cmd_to_be_executed, args_from_cmdline); 135 strcpy(cmd_to_be_executed, args_from_cmdline);
82 strcat(cmd_to_be_executed, " \"");
83 136
84 /* Now, read in one line at a time from stdin, and run command+args on it */ 137 /* Now, read in one line at a time from stdin, and run command+args on it */
85 in_from_stdin = get_line_from_file(stdin); 138 in_from_stdin = get_sh_safe_line_from_file(stdin);
86 for (;in_from_stdin!=NULL;) { 139 for (;in_from_stdin!=NULL;) {
87 char *tmp; 140 char *tmp;
88 opt = strlen(in_from_stdin); 141 opt = strlen(in_from_stdin);
89 len = opt + len_args_from_cmdline; 142 len = opt + len_args_from_cmdline;
90 len_cmd_to_be_executed+=len+3; 143 len_cmd_to_be_executed+=len+3;
91 cmd_to_be_executed=xrealloc(cmd_to_be_executed, len_cmd_to_be_executed); 144 cmd_to_be_executed=xrealloc(cmd_to_be_executed, len_cmd_to_be_executed);
92 145
93 /* Strip out the final \n */ 146 /* Strip out the final \n */
94 in_from_stdin[opt-1]=' '; 147 in_from_stdin[opt-1]=' ';
95 148
96 /* Replace any tabs with spaces */
97 while( (tmp = strchr(in_from_stdin, '\t')) != NULL )
98 *tmp=' ';
99
100 /* Strip out any extra intra-word spaces */
101 while( (tmp = strstr(in_from_stdin, " ")) != NULL ) {
102 opt = strlen(in_from_stdin);
103 memmove(tmp, tmp+1, opt-(tmp-in_from_stdin));
104 }
105
106 /* trim trailing whitespace */ 149 /* trim trailing whitespace */
107 opt = strlen(in_from_stdin) - 1; 150 opt = strlen(in_from_stdin) - 1;
108 while (isspace(in_from_stdin[opt])) 151 while (isspace(in_from_stdin[opt]))
@@ -118,10 +161,9 @@ int xargs_main(int argc, char **argv)
118 strcat(cmd_to_be_executed, " "); 161 strcat(cmd_to_be_executed, " ");
119 162
120 free(in_from_stdin); 163 free(in_from_stdin);
121 in_from_stdin = get_line_from_file(stdin); 164 in_from_stdin = get_sh_safe_line_from_file(stdin);
122 } 165 }
123 166
124 strcat(cmd_to_be_executed, "\"");
125 if (traceflag==1) 167 if (traceflag==1)
126 fputs(cmd_to_be_executed, stderr); 168 fputs(cmd_to_be_executed, stderr);
127 169