Annotation of tftpd/src/exec.c, revision 1.2
1.2 ! misho 1: #include "global.h"
! 2: #include "exec.h"
! 3:
! 4:
! 5: void *
! 6: execProg(sched_task_t *task)
! 7: {
! 8: pid_t pid, res;
! 9: const char *str, *addr;
! 10: char port[STRSIZ] = { [0 ... STRSIZ - 1] = 0 },
! 11: opc[STRSIZ] = { [0 ... STRSIZ - 1] = 0 };
! 12: ait_val_t v = AIT_VAL_INITIALIZER(v);
! 13: int stat;
! 14:
! 15: ETRACE();
! 16:
! 17: str = cfg_getAttribute(&cfg, "exec_on", TASK_ARG(task));
! 18: if (!str)
! 19: taskExit(task, NULL);
! 20:
! 21: switch (pid = vfork()) {
! 22: case -1:
! 23: ESYSERR(0);
! 24: break;
! 25: case 0:
! 26: snprintf(opc, STRSIZ, "%hu", (u_short) TASK_DATLEN(task));
! 27: snprintf(port, STRSIZ, "%hu", (u_short) e_n2port(&cli.addr));
! 28: addr = e_n2addr(&cli.addr, &v);
! 29: EVERBOSE(1, "Execute %s %s %s %s %s %s %s", str, TASK_ARG(task), opc,
! 30: cli.file, cli.mode, addr, port);
! 31: execl(_PATH_BSHELL, _PATH_BSHELL, str, TASK_ARG(task), opc,
! 32: cli.file, cli.mode, addr, port, NULL);
! 33: AIT_FREE_VAL(&v);
! 34: _exit(127);
! 35: break;
! 36: default:
! 37: EVERBOSE(2, "Wait to finish executed program %s", str);
! 38: do {
! 39: res = waitpid(pid, &stat, 0);
! 40: } while (res == -1 && errno == EINTR);
! 41: break;
! 42: }
! 43:
! 44: taskExit(task, NULL);
! 45: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>