int my_exec(t_config *conf, char *line, int *ret) { t_ll_list commands; int sig; t_ll_node *w; ll_init_list(&commands); sig = MYSH_SIGNAL_NOPE; split_commands(&commands, line, ";", 0); w = commands.head; while (w) { if (*((char *)w->data) && (sig = manage_conditions(w->data, conf, ret)) == MYSH_SIGNAL_EXIT) break; w = w->next; } ll_clear_list(&commands, free); return (sig); }
int exec() { int pid; int pipe_sdf[2]; int there_was_pipe; int new_input; int i; int bcg; int status; command_s* cmds; there_was_pipe = 0; new_input = -1; bcg = in_background(input_buf+beg); cmds = split_commands(input_buf+beg); if(cmds[0].argv==NULL) { return 0; } sigprocmask(SIG_BLOCK, &block_sig, NULL); if(shell_commands(cmds[0])) { sigprocmask(SIG_UNBLOCK, &block_sig, NULL); return 1; } there_was_pipe = 0; chld_pids_size = 0; chld_active = 0; new_input = -1; for(i = 0; cmds[i].argv != NULL; i++) { if(cmds[i+1].argv != NULL) { /* mamy pipe'a */ pipe(pipe_sdf); there_was_pipe = 1; } chld_pids_size++; chld_active++; pid = fork(); if(pid == 0) { sigaction(SIGINT, &default_sigint_action, NULL); sigaction(SIGCHLD, &default_sigchld_action, NULL); /* tworzenie nowej sesji */ if(bcg) setsid(); /* wpp odblokowujemy SIGCHLD */ sigprocmask(SIG_UNBLOCK, &block_sig, NULL); /*trzeba przekierowac wyjscie*/ if(there_was_pipe) { dup2(pipe_sdf[1], STDOUT_FILENO); close(pipe_sdf[1]); close(pipe_sdf[0]); } /*przek wyjscia*/ if(new_input != -1) { dup2(new_input, STDIN_FILENO); close(new_input); } /*wywolywanie pojedynczej komendy*/ exec_one(cmds[i]); } else if(pid > 0) { if(!bcg) chld_pids[i] = pid; if(there_was_pipe) { close(new_input); close(pipe_sdf[1]); } } if(there_was_pipe) { new_input = pipe_sdf[0]; } there_was_pipe = 0; } if(!bcg) { while(chld_active > 0) { sigsuspend(&wait_for_us); /* ---FOR LINUX--- pid = waitpid(-1,&status,0); bcg = 1; if (pid <= 0) { continue; } for (i=0;i<chld_pids_size;i++) if(chld_pids[i] == pid) bcg = 0; if (!bcg) { chld_active--; } else if (ended_processes < MAX_COMMANDS) { save_process(pid,status); }*/ } } chld_pids_size = 0; sigprocmask(SIG_UNBLOCK, &block_sig, NULL); return 1; }