Denis Vlasenko | 05743d7 | 2008-02-10 12:10:08 +0000 | [diff] [blame] | 1 | This is how hush runs commands: |
| 2 | |
| 3 | /* callsite: process_command_subs */ |
| 4 | generate_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 */ |
| 15 | run_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 */ |
| 20 | run_list(struct pipe *) - handles "cmd; cmd2 && cmd3", while/for/do loops |
| 21 | run_pipe - for every pipe in list |
| 22 | |
| 23 | /* callsite: run_list */ |
| 24 | run_pipe - runs "cmd1 | cmd2 | cmd3 [&]" |
Denis Vlasenko | 0ef240d | 2008-02-10 16:00:30 +0000 | [diff] [blame] | 25 | run_list - used if only one cmd and it is of the form "{cmds;}" |
Denis Vlasenko | 05743d7 | 2008-02-10 12:10:08 +0000 | [diff] [blame] | 26 | forks for every cmd if more than one cmd or if & is there |
| 27 | pseudo_exec - runs each "cmdN" (handles builtins etc) |
| 28 | |
Denis Vlasenko | 0ef240d | 2008-02-10 16:00:30 +0000 | [diff] [blame] | 29 | /* callsite: run_pipe */ |
Denis Vlasenko | 05743d7 | 2008-02-10 12:10:08 +0000 | [diff] [blame] | 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 |
| 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 | */ |