blob: 973fe44c5d600bfba20e26f9181dab5be12fce48 [file] [log] [blame]
Denis Vlasenko05743d72008-02-10 12:10:08 +00001 This is how hush runs commands:
2
3/* callsite: process_command_subs */
4generate_stream_from_list(struct pipe *head) - handles `cmds`
5 create UNIX pipe
6 [v]fork
7 child:
8 redirect pipe output to stdout
9 _exit(run_list(head)); /* leaks memory */
10 parent:
11 return UNIX pipe's output fd
12 /* head is freed by the caller */
13
14/* callsite: parse_and_run_stream */
15run_and_free_list(struct pipe *)
16 run_list(struct pipe *)
17 free_pipe_list(struct pipe *)
18
19/* callsites: generate_stream_from_list, run_and_free_list, pseudo_exec, run_pipe */
20run_list(struct pipe *) - handles "cmd; cmd2 && cmd3", while/for/do loops
21 run_pipe - for every pipe in list
22
23/* callsite: run_list */
24run_pipe - runs "cmd1 | cmd2 | cmd3 [&]"
Denis Vlasenko0ef240d2008-02-10 16:00:30 +000025 run_list - used if only one cmd and it is of the form "{cmds;}"
Denis Vlasenko05743d72008-02-10 12:10:08 +000026 forks for every cmd if more than one cmd or if & is there
27 pseudo_exec - runs each "cmdN" (handles builtins etc)
28
Denis Vlasenko0ef240d2008-02-10 16:00:30 +000029/* callsite: run_pipe */
Denis Vlasenko05743d72008-02-10 12:10:08 +000030pseudo_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
35 */
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?
39 */