char *run_test(int nr, int threads, int gens, int hot, char *fail_msg) { debug("TEST IS: %s", fail_msg); struct timeval stv, etv; long long usecs, passes_per_sec; int rc = 0; FILE *perf = NULL; check(nr >= threads, "You can't have the nr less than threads."); max_threads = threads; max_generation = gens; perf = fopen("tests/perf.log", "a+"); check(perf, "Failed to open tests/perf.log"); pid_t mypid = getpid(); fprintf(perf, "%s %d %d %d %ld %d ", hot ? "poll" : "epoll", mypid, nr, max_threads, max_generation, BUFSIZE); makepipes(nr, hot); send_pending_tokes(); gettimeofday(&stv, NULL); seedthreads(max_threads); rc = run_main_loop(hot); check(rc == 0, "Looks like the main loop failed for '%s'", fail_msg); gettimeofday(&etv, NULL); etv.tv_sec -= stv.tv_sec; etv.tv_usec -= stv.tv_usec; if (etv.tv_usec < 0) { etv.tv_usec += 1000000; etv.tv_sec -= 1; } fprintf(perf, "%ld %ld.%06ld ", nr_token_passes, etv.tv_sec, (long int)etv.tv_usec); usecs = etv.tv_usec + etv.tv_sec * 1000000LL; if(usecs == 0) usecs++; // avoid divide-by-zero on some computers passes_per_sec = nr_token_passes * 1000000LL * 100; passes_per_sec /= usecs ; fprintf(perf, "%Ld.%02Ld\n", passes_per_sec / 100, passes_per_sec % 100); closepipes(nr); fclose(perf); return NULL; error: closepipes(nr); if(perf) fclose(perf); return fail_msg; }
int main(int argc,char **argv) { if (chdir("/") == -1) die(errno); umask(077); if (prot_gid(auto_gidq) == -1) die(errno); if (fd_copy(2,0) == -1) die(errno); if (fd_copy(3,0) == -1) die(errno); if (fd_copy(4,0) == -1) die(errno); if (fd_copy(5,0) == -1) die(errno); if (fd_copy(6,0) == -1) die(errno); if (argv[1]) { qlargs[1] = argv[1]; ++argv; } if (argv[1]) { if (pipe(pi0) == -1) die(errno); switch(fork()) { case -1: die(errno); case 0: if (prot_gid(auto_gidn) == -1) die(errno); if (prot_uid(auto_uidl) == -1) die(errno); close(pi0[1]); if (fd_move(0,pi0[0]) == -1) die(errno); close23456(); execvp(argv[1],argv + 1); die(errno); } close(pi0[0]); if (fd_move(1,pi0[1]) == -1) die(errno); } if (pipe(pi1) == -1) die(errno); if (pipe(pi2) == -1) die(errno); if (pipe(pi3) == -1) die(errno); if (pipe(pi4) == -1) die(errno); if (pipe(pi5) == -1) die(errno); if (pipe(pi6) == -1) die(errno); /* start qmail-lspawn */ switch(fork()) { case -1: die(errno); case 0: if (fd_copy(0,pi1[0]) == -1) die(errno); if (fd_copy(1,pi2[1]) == -1) die(errno); close23456(); closepipes(); execvp(*qlargs,qlargs); die(errno); } /* start qmail-rspawn */ switch(fork()) { case -1: die(errno); case 0: if (prot_uid(auto_uidr) == -1) die(errno); if (fd_copy(0,pi3[0]) == -1) die(errno); if (fd_copy(1,pi4[1]) == -1) die(errno); close23456(); closepipes(); execvp(*qrargs,qrargs); die(errno); } /* start qmail-clean */ switch(fork()) { case -1: die(errno); case 0: if (prot_uid(auto_uidq) == -1) die(errno); if (fd_copy(0,pi5[0]) == -1) die(errno); if (fd_copy(1,pi6[1]) == -1) die(errno); close23456(); closepipes(); execvp(*qcargs,qcargs); die(errno); } if (prot_uid(auto_uids) == -1) die(errno); if (fd_copy(0,1) == -1) die(errno); if (fd_copy(1,pi1[1]) == -1) die(errno); if (fd_copy(2,pi2[0]) == -1) die(errno); if (fd_copy(3,pi3[1]) == -1) die(errno); if (fd_copy(4,pi4[0]) == -1) die(errno); if (fd_copy(5,pi5[1]) == -1) die(errno); if (fd_copy(6,pi6[0]) == -1) die(errno); closepipes(); execvp(*qsargs,qsargs); /* start qmail-send */ die(errno); return(0); /* never reached */ }
void execline(programlist *pgl, path *pth) { /*printf("\n\n\n====\n\n\n"); */ int i; /* set up pipes/filters */ /*int filterfd[2]; */ int **filterfds; int pipecnt = pgl->count - 1; if (pipecnt > 0) { filterfds = (int **)malloc(sizeof(int *) * pipecnt); if (filterfds == NULL) { /*printf("failed to malloc filterfds\n"); */ exit(1); } for (i = 0; i < pipecnt; i++) { filterfds[i] = (int *)malloc(sizeof(int) * 2); if (filterfds[i] == NULL) { /*printf("failed to malloc pipe\n"); */ exit(1); } if (pipe(filterfds[i]) == -1) { /*printf("failed to create pipe. i = %d, err= %d\n", i, errno); */ } /*printf("in = %d, out = %d\n", filterfds[i][0], filterfds[i][1]); */ } } /*set up standard in/out */ int infd, outfd, errfd; if (pgl->in != NULL) { //infd = setstd(pgl->in, 0, stdin); infd = setstdin(pgl->in); } if (pgl->out != NULL) { /*printf("setting out\n=====\n"); */ outfd = setstd(pgl->out, 1, stdout); } if (pgl->err != NULL) { errfd = setstd(pgl->err, 2, stderr); } /*set up commands */ program **programs; programs = (program **)malloc(sizeof(program *) * pgl->count); if (programs == NULL) { exit(1); } program *crntprg; crntprg = pgl->tail; for (i = 0; i < pgl->count; i++) { programs[i] = (program *)malloc(sizeof(program)); if (programs[i] == NULL) { fprintf(stderr, "failed to malloc\n"); exit(1); } programs[i] = crntprg; crntprg = crntprg->prev; } char ***execs; execs = (char ***)malloc(sizeof(char **) * pgl->count); if (execs == NULL) { fprintf(stderr, "Failed to mallocs execs"); exit(1); } memset(execs, 0, pgl->count); //printf("pgl count = %d\n", pgl->count); for (i = 0; i < pgl->count; i++) { execs[i] = createcmd(programs[i], pth); //printf("exec[i] = %s\n", execs[i][0]); if (execs[i] == NULL) { printf("Failed to find cmd: %s\n", programs[i]->cmd); exit(1); } } free(programs); for (i = 0; i < pgl->count; i++) { /* Set in for the command as a pipe. */ pid_t child; child = fork(); if (child == 0) { /*printf("My parent is %d\n", getppid()); */ if (i == 0 && pgl->filtered == 1) { //printf("setting pipe1\n"); /*last in list, don't set stdout, only in */ dup2(filterfds[i][0], STDIN_FILENO); } else if (i == pgl->count - 1 && pgl->filtered == 1) { //printf("setting pipe2\n"); /*first in list dont set in, only out */ dup2(filterfds[i - 1][1], STDOUT_FILENO); } else if (pgl->filtered == 1) { //printf("setting pipe3\n"); dup2(filterfds[i - 1][1], STDOUT_FILENO); dup2(filterfds[i][0], STDIN_FILENO); } if (closepipes(filterfds, pipecnt) == -1) { /*printf("Failed to close pipe\n"); */ exit(1); } if (execv(execs[i][0], execs[i]) == -1) { /*printf("Failed to execute\n"); */ exit(1); } exit(0); } else { continue; } } if (closepipes(filterfds, pipecnt) == -1) { /*printf("parent failed to close pipes\n"); */ exit(1); } int status; for (i = 0; i < pgl->count; i++) { wait(&status); /*printf("\ti = %d, wait = %d\n", pgl->count, wait(&status)); */ } if (pgl->in != NULL && infd != -1) { infd = resetstd(infd, 0, stdin); } if (pgl->out != NULL && outfd != -1) { outfd = resetstd(outfd, 1, stdout); } if (pgl->err != NULL && errfd != -1) { errfd = resetstd(errfd, 2, stderr); } //clean up pipes cleanuppipes(filterfds, pipecnt); //clean up execs cleanupexecs(execs, pgl); exit(0); }