libbb: added xfdopen_for_read/write
function old new delta xfdopen_helper - 40 +40 logdir_open 1163 1184 +21 process_stdin 433 443 +10 xfdopen_for_write - 9 +9 doCommands 2465 2474 +9 patch_main 1214 1222 +8 bbunpack 457 465 +8 xfdopen_for_read - 7 +7 scan_tree 258 262 +4 xstrtoul_range_sfx 230 231 +1 sendmail_main 957 955 -2 passwd_main 1027 1023 -4 parse 969 964 -5 test_main 253 247 -6 sed_main 655 649 -6 dos2unix_main 437 429 -8 fbsplash_main 950 938 -12 handle_dir_common 371 354 -17 expand_vars_to_list 2197 2169 -28 update_passwd 1275 1246 -29 ------------------------------------------------------------------------------ (add/remove: 3/0 grow/shrink: 7/10 up/down: 117/-117) Total: 0 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
15
shell/hush.c
15
shell/hush.c
@ -5301,25 +5301,22 @@ static FILE *generate_stream_from_string(const char *s, pid_t *pid_p)
|
||||
free(to_free);
|
||||
# endif
|
||||
close(channel[1]);
|
||||
//TODO: libbb: fdopen_or_die?
|
||||
return fdopen(channel[0], "r");
|
||||
close_on_exec_on(channel[0]);
|
||||
return xfdopen_for_read(channel[0]);
|
||||
}
|
||||
|
||||
/* Return code is exit status of the process that is run. */
|
||||
static int process_command_subs(o_string *dest, const char *s)
|
||||
{
|
||||
FILE *pf;
|
||||
FILE *fp;
|
||||
struct in_str pipe_str;
|
||||
pid_t pid;
|
||||
int status, ch, eol_cnt;
|
||||
|
||||
pf = generate_stream_from_string(s, &pid);
|
||||
if (pf == NULL)
|
||||
return 1;
|
||||
close_on_exec_on(fileno(pf));
|
||||
fp = generate_stream_from_string(s, &pid);
|
||||
|
||||
/* Now send results of command back into original context */
|
||||
setup_file_in_str(&pipe_str, pf);
|
||||
setup_file_in_str(&pipe_str, fp);
|
||||
eol_cnt = 0;
|
||||
while ((ch = i_getch(&pipe_str)) != EOF) {
|
||||
if (ch == '\n') {
|
||||
@ -5334,7 +5331,7 @@ static int process_command_subs(o_string *dest, const char *s)
|
||||
}
|
||||
|
||||
debug_printf("done reading from `cmd` pipe, closing it\n");
|
||||
fclose(pf);
|
||||
fclose(fp);
|
||||
/* We need to extract exitcode. Test case
|
||||
* "true; echo `sleep 1; false` $?"
|
||||
* should print 1 */
|
||||
|
Reference in New Issue
Block a user