int main () { runner_t runner; char buf[80]; char *wdbuf;; int ret; long pathmax = pathconf ("/", _PC_PATH_MAX); wdbuf = malloc (pathmax); assert (wdbuf); getcwd (wdbuf, pathmax); TBANNER ("basic functionality"); runcmd ("echo", "a", "b", NULL); TBANNER ("argv extension"); runcmd ("echo", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "100", NULL); TBANNER ("add_args, argprintf, log, and popen-style functionality"); runinit (&runner); runner_add_args (&runner, "echo", "pid:", NULL); runner_argprintf (&runner, "%d\n", getpid()); runner_add_arg (&runner, "wd:"); runner_add_arg (&runner, wdbuf); runner_redir (&runner, 1, RUN_PIPE); runner_start (&runner); runner_log (&runner, "(x)", LOG_DEBUG, "starting program"); while (fgets (buf, sizeof(buf), runner_chio (&runner, 1))) printf ("got: %s", buf); runner_end (&runner); TBANNER ("execve error reporting"); ret = runcmd ("bafflavvitty", NULL); printf ("%d %d [%s]\n", ret, errno, strerror (errno)); return 0; }
static void runner_va_add_args (runner_t *runner, va_list argp) { const char *arg; while ((arg = va_arg (argp, const char *))) runner_add_arg (runner, arg); }
int runcmd (const char *arg, ...) { runner_t runner; va_list argp; runinit (&runner); /* ISO C requires a named argument before '...' */ runner_add_arg (&runner, arg); va_start (argp, arg); runner_va_add_args (&runner, argp); va_end (argp); return runner_run (&runner); }
int main (int argc, char **argv) { runner_t runner; char buf[80]; char *wdbuf;; int ret; int fd; long pathmax = pathconf ("/", _PC_PATH_MAX); struct timeval tv = {0,}; struct timeval *tvp = NULL; wdbuf = malloc (pathmax); assert (wdbuf); getcwd (wdbuf, pathmax); TBANNER ("basic functionality"); runcmd ("echo", "a", "b", NULL); TBANNER ("argv extension"); runcmd ("echo", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "100", NULL); TBANNER ("add_args, argprintf, log, and popen-style functionality"); runinit (&runner); runner_add_args (&runner, "echo", "pid:", NULL); runner_argprintf (&runner, "%d\n", getpid()); runner_add_arg (&runner, "wd:"); runner_add_arg (&runner, wdbuf); runner_redir (&runner, 1, RUN_PIPE); runner_start (&runner); runner_log (&runner, "(x)", LOG_DEBUG, "starting program"); while (fgets (buf, sizeof(buf), runner_chio (&runner, 1))) printf ("got: %s", buf); runner_end (&runner); TBANNER ("execve error reporting"); ret = runcmd ("bafflavvitty", NULL); printf ("%d %d [%s]\n", ret, errno, strerror (errno)); TBANNER ("output redirection"); fd = mkstemp ("/tmp/foof"); assert (fd != -1); runinit (&runner); runner_add_args (&runner, "echo", "foo", NULL); runner_redir (&runner, 1, fd); ret = runner_run (&runner); printf ("%d", ret); if (ret != 0) printf (" %d [%s]", errno, strerror (errno)); putchar ('\n'); if (argc > 1) { tv.tv_sec = strtoul (argv[1], NULL, 10); if (tv.tv_sec > 0) tvp = &tv; select (0, 0, 0, 0, tvp); } return 0; }