1 This is how hush runs commands:
3 /* callsite: process_command_subs */
4 generate_stream_from_list(struct pipe *head) - handles `cmds`
8 redirect pipe output to stdout
9 _exit(run_list(head)); /* leaks memory */
11 return UNIX pipe's output fd
12 /* head is freed by the caller */
14 /* callsite: parse_and_run_stream */
15 run_and_free_list(struct pipe *)
16 run_list(struct pipe *)
17 free_pipe_list(struct pipe *)
19 /* callsites: generate_stream_from_list, run_and_free_list, pseudo_exec, run_pipe */
20 run_list(struct pipe *) - handles "cmd; cmd2 && cmd3", while/for/do loops
21 run_pipe - for every pipe in list
23 /* callsite: run_list */
24 run_pipe - runs "cmd1 | cmd2 | cmd3 [&]"
25 run_list - used if only one cmd and it is of the form "{cmds;}"
26 forks for every cmd if more than one cmd or if & is there
27 pseudo_exec - runs each "cmdN" (handles builtins etc)
29 /* callsite: run_pipe */
30 pseudo_exec - runs "cmd" (handles builtins etc)
31 exec - execs external programs
32 run_list - used if cmdN is "(cmds)" or "{cmds;}"
33 /* problem: putenv's malloced strings into environ -
34 ** with vfork they will leak into parent process
36 /* problem with ENABLE_FEATURE_SH_STANDALONE:
37 ** run_applet_no_and_exit(a, argv) uses exit - this can interfere
38 ** with vfork - switch to _exit there?