int redirection_right(t_info *info, t_tree *cmd) { int fd; int ret; fd = -1; ret = 0; save_fd(1); if (cmd->right && cmd->right->cmd) fd = open(cmd->right->cmd[0], O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (fd != -1) { dup2(fd, 1); close(fd); ret = execution_motor(info, cmd->left, 1); save_fd(0); return (ret); } return (1); }
static void cmd_ei_connect(char* buf, int len) { int index = 0; char node[256]; int i; if (ei_decode_atom(buf, &index, node) < 0) fail("expected atom"); i=ei_connect(&ec, node); #ifdef VXWORKS if(i >= 0) { save_fd(i); } #endif send_errno_result(i); }
void start_index( int createindex, int input, int mesg, int index, char * cmd) { int pipefd[2]; FILE *pipe_fp; int exitcode; if (!createindex) return; if (pipe(pipefd) != 0) { error(_("creating index pipe: %s"), strerror(errno)); /*NOTREACHED*/ } switch(indexpid = fork()) { case -1: error(_("forking index tee process: %s"), strerror(errno)); /*NOTREACHED*/ default: aclose(pipefd[0]); if (dup2(pipefd[1], input) == -1) { error(_("dup'ping index tee output: %s"), strerror(errno)); /*NOTREACHED*/ } aclose(pipefd[1]); return; case 0: break; } /* now in a child process */ save_fd(&pipefd[0], 4); save_fd(&index, 4); save_fd(&mesg, 4); save_fd(&input, 4); dup2(pipefd[0], 0); dup2(index, 1); dup2(mesg, 2); dup2(input, 3); for(index = 4; index < (int)FD_SETSIZE; index++) { if (index != dbfd()) { close(index); } } if ((pipe_fp = popen(cmd, "w")) == NULL) { error(_("couldn't start index creator [%s]"), strerror(errno)); /*NOTREACHED*/ } dbprintf(_("Started index creator: \"%s\"\n"), cmd); while(1) { char buffer[BUFSIZ], *ptr; ssize_t bytes_read; size_t bytes_written; size_t just_written; do { bytes_read = read(0, buffer, SIZEOF(buffer)); } while ((bytes_read < 0) && ((errno == EINTR) || (errno == EAGAIN))); if (bytes_read < 0) { error(_("index tee cannot read [%s]"), strerror(errno)); /*NOTREACHED*/ } if (bytes_read == 0) break; /* finished */ /* write the stuff to the subprocess */ ptr = buffer; bytes_written = 0; just_written = full_write(fileno(pipe_fp), ptr, (size_t)bytes_read); if (just_written < (size_t)bytes_read) { /* * just as we waited for write() to complete. */ if (errno != EPIPE) { dbprintf(_("Index tee cannot write to index creator [%s]\n"), strerror(errno)); } } else { bytes_written += just_written; ptr += just_written; } /* write the stuff to stdout, ensuring none lost when interrupt occurs */ ptr = buffer; bytes_written = 0; just_written = full_write(3, ptr, bytes_read); if (just_written < (size_t)bytes_read) { error(_("index tee cannot write [%s]"), strerror(errno)); /*NOTREACHED*/ } else { bytes_written += just_written; ptr += just_written; } } aclose(pipefd[1]); /* finished */ /* check the exit code of the pipe and moan if not 0 */ if ((exitcode = pclose(pipe_fp)) != 0) { char *exitstr = str_exit_status("Index pipe", exitcode); dbprintf("%s\n", exitstr); amfree(exitstr); } else { dbprintf(_("Index created successfully\n")); } pipe_fp = NULL; exit(exitcode); }