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:
Denys Vlasenko
2009-11-15 23:28:11 +01:00
parent 647553a4fc
commit a7ccdeef39
15 changed files with 51 additions and 49 deletions

View File

@ -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 */