void tm_server_rep::quit () { close_all_pipes (); call ("quit-TeXmacs-scheme"); clear_pending_commands (); exit (0); }
/** * execute the checkEnv command. */ void cmd_check_env(char *args[ARGS_SIZE]) { int fd_descriptor_env_sort[2]; int fd_descriptor_sort_pager[2]; int fd_descriptor_grep_sort[2]; pid_t env_child, sort_child, grep_child, pager_child; int grep = FALSE; int return_value; sighold(SIGCHLD); create_pipe(fd_descriptor_env_sort); create_pipe(fd_descriptor_sort_pager); create_pipe(fd_descriptor_grep_sort); env_child = fork(); if (env_child == 0) { return_value = dup2(fd_descriptor_env_sort[PIPE_WRITE], STDOUT_FILENO); check_return_value(return_value, "Error: cannot dup2 1"); close_all_pipes(fd_descriptor_env_sort, fd_descriptor_sort_pager, fd_descriptor_grep_sort); print_environment(); exit(EXIT_SUCCESS); } else if (env_child == -1) { perror("Error forking."); exit(EXIT_FAILURE); } if(args[1] != NULL) { grep = TRUE; grep_child = fork(); if(grep_child == 0) { return_value = dup2(fd_descriptor_env_sort[PIPE_READ], STDIN_FILENO); check_return_value(return_value, "Error: cannot dup2 2"); return_value = dup2(fd_descriptor_grep_sort[PIPE_WRITE], STDOUT_FILENO); check_return_value(return_value, "Error: cannot dup2 3"); close_all_pipes(fd_descriptor_env_sort, fd_descriptor_sort_pager, fd_descriptor_grep_sort); args[0] = "grep"; return_value = execvp(args[0], args); check_return_value(return_value, "Error: execution failed."); } else if(grep_child == -1){ perror("Error forking."); exit(EXIT_FAILURE); } } sort_child = fork(); if (sort_child == 0) { char * argp[] = {"sort", NULL}; if(grep == TRUE) { return_value = dup2(fd_descriptor_grep_sort[PIPE_READ], STDIN_FILENO); check_return_value(return_value, "Error: cannot dup2 3"); } else { return_value = dup2(fd_descriptor_env_sort[PIPE_READ], STDIN_FILENO); check_return_value(return_value, "Error: cannot dup2 4"); } return_value = dup2(fd_descriptor_sort_pager[PIPE_WRITE], STDOUT_FILENO); check_return_value(return_value, "Error: cannot dup2 5"); close_all_pipes(fd_descriptor_env_sort, fd_descriptor_sort_pager, fd_descriptor_grep_sort); args[0] = "sort"; return_value = execvp(args[0], argp); check_return_value(return_value, "Error: execution failed."); } else if (sort_child == -1) { perror("Error forking."); exit(EXIT_FAILURE); } pager_child = fork(); if (pager_child == 0) { char * argp[] = {"less", NULL}; return_value = dup2(fd_descriptor_sort_pager[PIPE_READ], STDIN_FILENO); check_return_value(return_value, "Error: cannot dup2 6"); close_all_pipes(fd_descriptor_env_sort, fd_descriptor_sort_pager, fd_descriptor_grep_sort); if(getenv("PAGER") != NULL) { argp[0] = getenv("PAGER"); } return_value = execvp(argp[0], argp); check_return_value(return_value, "Error: execution failed."); } else if (pager_child == -1) { perror("Error forking."); exit(EXIT_FAILURE); } close_all_pipes(fd_descriptor_env_sort, fd_descriptor_sort_pager, fd_descriptor_grep_sort); wait_for_child(); wait_for_child(); wait_for_child(); if(grep == TRUE) wait_for_child(); sigrelse(SIGCHLD); }