static void launch_input_program (void) { /* Launch the diff program. */ if (ignore_case) { input_file = readpipe (DIFF_PROGRAM, "-i", left_side->temp_name, right_side->temp_name, NULL); } else { input_file = readpipe (DIFF_PROGRAM, left_side->temp_name, right_side->temp_name, NULL); } if (!input_file) { errexit (EXIT_FAILURE, errno, "%s", DIFF_PROGRAM); } character = getc (input_file); }
void setbacktick(int num, int lifespan, int tick, char **cmdv) { struct backtick **btp, *bt; char **v; for (btp = &backticks; (bt = *btp) != 0; btp = &bt->next) if (bt->num == num) break; if (!bt && !cmdv) return; if (bt) { for (v = bt->cmdv; *v; v++) free(*v); free(bt->cmdv); if (bt->buf) free(bt->buf); if (bt->ev.fd >= 0) close(bt->ev.fd); evdeq(&bt->ev); } if (bt && !cmdv) { *btp = bt->next; free(bt); return; } if (!bt) { bt = malloc(sizeof *bt); if (!bt) { Msg(0, "%s", strnomem); return; } memset(bt, 0, sizeof(*bt)); bt->next = 0; *btp = bt; } bt->num = num; bt->tick = tick; bt->lifespan = lifespan; bt->bestbefore = 0; bt->result[0] = 0; bt->buf = 0; bt->bufi = 0; bt->cmdv = cmdv; bt->ev.fd = -1; if (bt->tick == 0 && bt->lifespan == 0) { bt->buf = malloc(MAXSTR); if (bt->buf == 0) { Msg(0, "%s", strnomem); setbacktick(num, 0, 0, (char **)0); return; } bt->ev.type = EV_READ; bt->ev.fd = readpipe(bt->cmdv); bt->ev.handler = backtick_fn; bt->ev.data = (char *)bt; if (bt->ev.fd >= 0) evenq(&bt->ev); } }
static int readresponse(char *buf) { int len; len = readpipe(buf, BUFSIZE); /* all ispell responses of any reasonable length should end in \n\n. * depending on the speed of the spell checker, this may require more * reading. */ if (len >= 2 && (buf[len-1] != '\n' || buf[len-2] != '\n')) { len += readpipe(buf+len, BUFSIZE-len); } /* now we can remove all of the the trailing newlines. */ while (len > 0 && buf[len-1] == '\n') buf[--len] = 0; return len; }
char *runbacktick(Backtick *bt, int *tickp, time_t now) { int f, i, l, j; time_t now2; if (bt->tick && (!*tickp || bt->tick < *tickp)) *tickp = bt->tick; if ((bt->lifespan == 0 && bt->tick == 0) || now < bt->bestbefore) { return bt->result; } f = readpipe(bt->cmdv); if (f == -1) return bt->result; i = 0; while ((l = read(f, bt->result + i, sizeof(bt->result) - i)) > 0) { i += l; for (j = 1; j < l; j++) if (bt->result[i - j - 1] == '\n') break; if (j == l && i == sizeof(bt->result)) { j = sizeof(bt->result) / 2; l = j + 1; } if (j < l) { memmove(bt->result, bt->result + i - j, j); i = j; } } close(f); bt->result[sizeof(bt->result) - 1] = '\n'; if (i && bt->result[i - 1] == '\n') i--; bt->result[i] = 0; backtick_filter(bt); (void)time(&now2); bt->bestbefore = now2 + bt->lifespan; return bt->result; }
static int readline(char *buf) { return readpipe(buf, BUFSIZE); }
int main(int argc, char *argv[]) { int upload_pipe_fd; char *who; char *file; #ifdef HAVE_SETLOCALE # ifdef LC_MESSAGES (void) setlocale(LC_MESSAGES, ""); # endif # ifdef LC_CTYPE (void) setlocale(LC_CTYPE, ""); # endif # ifdef LC_COLLATE (void) setlocale(LC_COLLATE, ""); # endif #endif if (init() < 0) { return -1; } if (parseoptions(argc, argv) < 0) { return -1; } if (script == NULL) { fprintf(stderr, "Sorry, but I need -r <program to run>\n\n"); usage(); } if (daemonize != 0) { dodaemonize(); } if ((upload_pipe_fd = upload_pipe_ropen()) == -1) { return -1; } updatepidfile(); if (changeuidgid() < 0) { perror("Identity change"); (void) unlink(uploadscript_pid_file); return -1; } #ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); #endif #ifdef SIGCHLD signal(SIGCHLD, SIG_DFL); #endif for (;;) { if (readpipe(upload_pipe_fd, &who, &file) != 0) { (void) sleep(1); continue; } file = checkvirtual(file); if (file != NULL && who != NULL) { run(who, file, upload_pipe_fd); } } /* NOTREACHED */ #if 0 close(upload_pipe_fd); (void) unlink(uploadscript_pid_file); #endif return 0; }