static int start_process(Channel * c, char ** envp, char * dir, char * exe, char ** args, int attach, int * pid, int * selfattach, ChildProcess ** prs) { int err = 0; int fd_tty_master = -1; char * tty_slave_name = NULL; fd_tty_master = posix_openpt(O_RDWR|O_NOCTTY); if (fd_tty_master < 0 || grantpt(fd_tty_master) < 0 || unlockpt(fd_tty_master) < 0 || (tty_slave_name = ptsname(fd_tty_master)) == NULL) err = errno; if (err == 0 && fd_tty_master < 3) { int fd0 = fd_tty_master; if ((fd_tty_master = dup(fd_tty_master)) < 0 || close(fd0)) err = errno; } if (!err) { *pid = fork(); if (*pid < 0) err = errno; if (*pid == 0) { int fd = -1; int fd_tty_slave = -1; setsid(); if (!err && (fd = sysconf(_SC_OPEN_MAX)) < 0) err = errno; if (!err && (fd_tty_slave = open(tty_slave_name, O_RDWR)) < 0) err = errno; if (!err && dup2(fd_tty_slave, 0) < 0) err = errno; if (!err && dup2(fd_tty_slave, 1) < 0) err = errno; if (!err && dup2(fd_tty_slave, 2) < 0) err = errno; while (!err && fd > 3) close(--fd); if (!err && attach && context_attach_self() < 0) err = errno; if (!err) { execve(exe, args, envp); err = errno; } if (!attach) err = 1; else if (err < 1) err = EINVAL; else if (err > 0xff) err = EINVAL; exit(err); } } if (!err) { *prs = loc_alloc_zero(sizeof(ChildProcess)); (*prs)->inp = fd_tty_master; (*prs)->out = fd_tty_master; (*prs)->err = fd_tty_master; (*prs)->pid = *pid; (*prs)->bcg = c->bcg; list_add_first(&(*prs)->link, &prs_list); } *selfattach = 1; if (!err) return 0; errno = err; return -1; }
int run_test_process(ContextAttachCallBack * done, void * data) { #if defined(WIN32) char fnm[FILE_PATH_SIZE]; char cmd[FILE_PATH_SIZE]; int res = 0; STARTUPINFO si; PROCESS_INFORMATION prs; ContextAttachArgs * args; memset(&si, 0, sizeof(si)); memset(&prs, 0, sizeof(prs)); memset(fnm, 0, sizeof(fnm)); if (GetModuleFileName(NULL, fnm, sizeof(fnm)) == 0) { set_win32_errno(GetLastError()); return -1; } si.cb = sizeof(si); strcpy(cmd, "agent.exe -t"); if (CreateProcess(fnm, cmd, NULL, NULL, FALSE, CREATE_SUSPENDED | CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW, NULL, NULL, &si, &prs) == 0) { set_win32_errno(GetLastError()); return -1; } args = (ContextAttachArgs *)loc_alloc(sizeof(ContextAttachArgs)); args->done = done; args->data = data; args->thread = prs.hThread; args->process = prs.hProcess; res = context_attach(prs.dwProcessId, done_context_attach, args, 0); if (res != 0) loc_free(args); return res; #elif defined(_WRS_KERNEL) int tid = taskCreate("tTcf", 100, 0, 0x4000, (FUNCPTR)test_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); if (tid == 0) return -1; taskStop(tid); taskActivate(tid); assert(taskIsStopped(tid)); return context_attach(tid, done, data, 0); #else /* Create child process to debug */ int pid = fork(); if (pid < 0) return -1; if (pid == 0) { int fd; if (context_attach_self() < 0) exit(1); fd = sysconf(_SC_OPEN_MAX); while (fd-- > 2) close(fd); if (tkill(getpid(), SIGSTOP) < 0) exit(1); test_proc(); exit(0); } return context_attach(pid, done, data, CONTEXT_ATTACH_SELF); #endif }
static int start_process(Channel * c, char ** envp, char * dir, char * exe, char ** args, int attach, int * pid, int * selfattach, ChildProcess ** prs) { int err = 0; int p_inp[2]; int p_out[2]; int p_err[2]; if (pipe(p_inp) < 0 || pipe(p_out) < 0 || pipe(p_err) < 0) err = errno; if (err == 0 && (p_inp[0] < 3 || p_out[1] < 3 || p_err[1] < 3)) { int fd0 = p_inp[0]; int fd1 = p_out[1]; int fd2 = p_err[1]; if ((p_inp[0] = dup(p_inp[0])) < 0 || (p_out[1] = dup(p_out[1])) < 0 || (p_err[1] = dup(p_err[1])) < 0 || close(fd0) < 0 || close(fd1) < 0 || close(fd2) < 0) err = errno; } if (!err) { *pid = fork(); if (*pid < 0) err = errno; if (*pid == 0) { int fd = -1; int err = 0; if (err == 0) { fd = sysconf(_SC_OPEN_MAX); if (fd < 0) err = errno; } if (!err && dup2(p_inp[0], 0) < 0) err = errno; if (!err && dup2(p_out[1], 1) < 0) err = errno; if (!err && dup2(p_err[1], 2) < 0) err = errno; if (!err) { while (fd > 3) close(--fd); } if (!err && attach && context_attach_self() < 0) err = errno; if (!err) { execve(exe, args, envp); err = errno; } if (!attach) err = 1; else if (err < 1) err = EINVAL; else if (err > 0xff) err = EINVAL; exit(err); } } if (!err) { if (close(p_inp[0]) < 0 || close(p_out[1]) < 0 || close(p_err[1]) < 0) err = errno; } if (!err) { *prs = loc_alloc_zero(sizeof(ChildProcess)); (*prs)->inp = p_inp[1]; (*prs)->out = p_out[0]; (*prs)->err = p_err[0]; (*prs)->pid = *pid; (*prs)->bcg = c->bcg; list_add_first(&(*prs)->link, &prs_list); } *selfattach = 1; if (!err) return 0; errno = err; return -1; }