int orte_show_help(const char *filename, const char *topic, bool want_error_header, ...) { int rc = ORTE_SUCCESS; va_list arglist; char *output; if (orte_execute_quiet) { return ORTE_SUCCESS; } va_start(arglist, want_error_header); output = opal_show_help_vstring(filename, topic, want_error_header, arglist); va_end(arglist); /* If nothing came back, there's nothing to do */ if (NULL == output) { return ORTE_SUCCESS; } rc = orte_show_help_norender(filename, topic, want_error_header, output); free(output); return rc; }
static int do_parent(orte_app_context_t* context, orte_proc_t *child, char **environ_copy, orte_job_t *jobdat, int read_fd, orte_iof_base_io_conf_t opts) { int rc; orte_odls_pipe_err_msg_t msg; char file[ORTE_ODLS_MAX_FILE_LEN + 1], topic[ORTE_ODLS_MAX_TOPIC_LEN + 1], *str = NULL; if (NULL != child && ORTE_FLAG_TEST(jobdat, ORTE_JOB_FLAG_FORWARD_OUTPUT)) { /* connect endpoints IOF */ rc = orte_iof_base_setup_parent(&child->name, &opts); if (ORTE_SUCCESS != rc) { ORTE_ERROR_LOG(rc); close(read_fd); if (NULL != child) { child->state = ORTE_PROC_STATE_UNDEF; } return rc; } } /* Block reading a message from the pipe */ while (1) { rc = opal_fd_read(read_fd, sizeof(msg), &msg); /* If the pipe closed, then the child successfully launched */ if (OPAL_ERR_TIMEOUT == rc) { break; } /* If Something Bad happened in the read, error out */ if (OPAL_SUCCESS != rc) { ORTE_ERROR_LOG(rc); close(read_fd); if (NULL != child) { child->state = ORTE_PROC_STATE_UNDEF; } return rc; } /* Otherwise, we got a warning or error message from the child */ if (NULL != child) { if (msg.fatal) { ORTE_FLAG_UNSET(child, ORTE_PROC_FLAG_ALIVE); } else { ORTE_FLAG_SET(child, ORTE_PROC_FLAG_ALIVE); } } /* Read in the strings; ensure to terminate them with \0 */ if (msg.file_str_len > 0) { rc = opal_fd_read(read_fd, msg.file_str_len, file); if (OPAL_SUCCESS != rc) { orte_show_help("help-orte-odls-default.txt", "syscall fail", true, orte_process_info.nodename, context->app, "opal_fd_read", __FILE__, __LINE__); if (NULL != child) { child->state = ORTE_PROC_STATE_UNDEF; } return rc; } file[msg.file_str_len] = '\0'; } if (msg.topic_str_len > 0) { rc = opal_fd_read(read_fd, msg.topic_str_len, topic); if (OPAL_SUCCESS != rc) { orte_show_help("help-orte-odls-default.txt", "syscall fail", true, orte_process_info.nodename, context->app, "opal_fd_read", __FILE__, __LINE__); if (NULL != child) { child->state = ORTE_PROC_STATE_UNDEF; } return rc; } topic[msg.topic_str_len] = '\0'; } if (msg.msg_str_len > 0) { str = calloc(1, msg.msg_str_len + 1); if (NULL == str) { orte_show_help("help-orte-odls-default.txt", "syscall fail", true, orte_process_info.nodename, context->app, "opal_fd_read", __FILE__, __LINE__); if (NULL != child) { child->state = ORTE_PROC_STATE_UNDEF; } return rc; } rc = opal_fd_read(read_fd, msg.msg_str_len, str); } /* Print out what we got. We already have a rendered string, so use orte_show_help_norender(). */ if (msg.msg_str_len > 0) { orte_show_help_norender(file, topic, false, str); free(str); str = NULL; } /* If msg.fatal is true, then the child exited with an error. Otherwise, whatever we just printed was a warning, so loop around and see what else is on the pipe (or if the pipe closed, indicating that the child launched successfully). */ if (msg.fatal) { if (NULL != child) { child->state = ORTE_PROC_STATE_FAILED_TO_START; ORTE_FLAG_UNSET(child, ORTE_PROC_FLAG_ALIVE); } close(read_fd); return ORTE_ERR_FAILED_TO_START; } } /* If we got here, it means that the pipe closed without indication of a fatal error, meaning that the child process launched successfully. */ if (NULL != child) { child->state = ORTE_PROC_STATE_RUNNING; ORTE_FLAG_SET(child, ORTE_PROC_FLAG_ALIVE); } close(read_fd); return ORTE_SUCCESS; }
static int do_parent(orte_odls_spawn_caddy_t *cd, int read_fd) { int rc; orte_odls_pipe_err_msg_t msg; char file[ORTE_ODLS_MAX_FILE_LEN + 1], topic[ORTE_ODLS_MAX_TOPIC_LEN + 1], *str = NULL; if (cd->opts.connect_stdin) { close(cd->opts.p_stdin[0]); } close(cd->opts.p_stdout[1]); if( !orte_iof_base.redirect_app_stderr_to_stdout ) { close(cd->opts.p_stderr[1]); } #if OPAL_PMIX_V1 close(cd->opts.p_internal[1]); #endif /* Block reading a message from the pipe */ while (1) { rc = opal_fd_read(read_fd, sizeof(msg), &msg); /* If the pipe closed, then the child successfully launched */ if (OPAL_ERR_TIMEOUT == rc) { break; } /* If Something Bad happened in the read, error out */ if (OPAL_SUCCESS != rc) { ORTE_ERROR_LOG(rc); close(read_fd); if (NULL != cd->child) { cd->child->state = ORTE_PROC_STATE_UNDEF; } return rc; } /* Otherwise, we got a warning or error message from the child */ if (NULL != cd->child) { if (msg.fatal) { ORTE_FLAG_UNSET(cd->child, ORTE_PROC_FLAG_ALIVE); } else { ORTE_FLAG_SET(cd->child, ORTE_PROC_FLAG_ALIVE); } } /* Read in the strings; ensure to terminate them with \0 */ if (msg.file_str_len > 0) { rc = opal_fd_read(read_fd, msg.file_str_len, file); if (OPAL_SUCCESS != rc) { orte_show_help("help-orte-odls-alps.txt", "syscall fail", true, orte_process_info.nodename, cd->app, "opal_fd_read", __FILE__, __LINE__); if (NULL != cd->child) { cd->child->state = ORTE_PROC_STATE_UNDEF; } return rc; } file[msg.file_str_len] = '\0'; } if (msg.topic_str_len > 0) { rc = opal_fd_read(read_fd, msg.topic_str_len, topic); if (OPAL_SUCCESS != rc) { orte_show_help("help-orte-odls-alps.txt", "syscall fail", true, orte_process_info.nodename, cd->app, "opal_fd_read", __FILE__, __LINE__); if (NULL != cd->child) { cd->child->state = ORTE_PROC_STATE_UNDEF; } return rc; } topic[msg.topic_str_len] = '\0'; } if (msg.msg_str_len > 0) { str = calloc(1, msg.msg_str_len + 1); if (NULL == str) { orte_show_help("help-orte-odls-alps.txt", "syscall fail", true, orte_process_info.nodename, cd->app, "opal_fd_read", __FILE__, __LINE__); if (NULL != cd->child) { cd->child->state = ORTE_PROC_STATE_UNDEF; } return rc; } rc = opal_fd_read(read_fd, msg.msg_str_len, str); } /* Print out what we got. We already have a rendered string, so use orte_show_help_norender(). */ if (msg.msg_str_len > 0) { orte_show_help_norender(file, topic, false, str); free(str); str = NULL; } /* If msg.fatal is true, then the child exited with an error. Otherwise, whatever we just printed was a warning, so loop around and see what else is on the pipe (or if the pipe closed, indicating that the child launched successfully). */ if (msg.fatal) { if (NULL != cd->child) { cd->child->state = ORTE_PROC_STATE_FAILED_TO_START; ORTE_FLAG_UNSET(cd->child, ORTE_PROC_FLAG_ALIVE); } close(read_fd); return ORTE_ERR_FAILED_TO_START; } } /* If we got here, it means that the pipe closed without indication of a fatal error, meaning that the child process launched successfully. */ if (NULL != cd->child) { cd->child->state = ORTE_PROC_STATE_RUNNING; ORTE_FLAG_SET(cd->child, ORTE_PROC_FLAG_ALIVE); } close(read_fd); return ORTE_SUCCESS; }