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 void command_help(orcm_notifier_base_severity_t severity, int errcode, const char *filename, const char *topic, va_list ap) { char *output = opal_show_help_vstring(filename, topic, false, ap); if (NULL != output) { send_command(severity, errcode, output); free(output); } }
static void myhelplog(orte_notifier_base_severity_t severity, int errcode, const char *filename, const char *topic, va_list ap) { char *output; output = opal_show_help_vstring(filename, topic, false, ap); if (NULL != output) { if (ORTE_PROC_IS_HNP) { /* output it locally */ orte_show_help("opal_sos_reporter.txt", "notifier message", false, output); } else { send_command(severity, errcode, output); } free(output); } }
/* * Internal function to write a rendered show_help message back up the * pipe to the waiting parent. */ static int write_help_msg(int fd, orte_odls_pipe_err_msg_t *msg, const char *file, const char *topic, va_list ap) { int ret; char *str; if (NULL == file || NULL == topic) { return OPAL_ERR_BAD_PARAM; } str = opal_show_help_vstring(file, topic, true, ap); msg->file_str_len = (int) strlen(file); if (msg->file_str_len > ORTE_ODLS_MAX_FILE_LEN) { ORTE_ERROR_LOG(ORTE_ERR_BAD_PARAM); return ORTE_ERR_BAD_PARAM; } msg->topic_str_len = (int) strlen(topic); if (msg->topic_str_len > ORTE_ODLS_MAX_TOPIC_LEN) { ORTE_ERROR_LOG(ORTE_ERR_BAD_PARAM); return ORTE_ERR_BAD_PARAM; } msg->msg_str_len = (int) strlen(str); /* Only keep writing if each write() succeeds */ if (OPAL_SUCCESS != (ret = opal_fd_write(fd, sizeof(*msg), msg))) { goto out; } if (msg->file_str_len > 0 && OPAL_SUCCESS != (ret = opal_fd_write(fd, msg->file_str_len, file))) { goto out; } if (msg->topic_str_len > 0 && OPAL_SUCCESS != (ret = opal_fd_write(fd, msg->topic_str_len, topic))) { goto out; } if (msg->msg_str_len > 0 && OPAL_SUCCESS != (ret = opal_fd_write(fd, msg->msg_str_len, str))) { goto out; } out: free(str); return ret; }
int orte_show_help(const char *filename, const char *topic, bool want_error_header, ...) { va_list arglist; char *output; 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; } opal_output(0, output); return ORTE_SUCCESS; }
int orte_show_help(const char *filename, const char *topic, bool want_error_header, ...) { int rc = ORTE_SUCCESS; va_list arglist; char *output; 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; } if (!ready) { /* if we are finalizing, then we have no way to process * this through the orte_show_help system - just drop it to * stderr; that's at least better than not showing it. * * If we are not finalizing, then this is probably a show_help * stemming from either a cmd-line request to display the usage * message, or a show_help related to a user error. In either case, * we can't do anything but just print to stderr. */ fprintf(stderr, "%s", output); goto CLEANUP; } /* if we are the HNP, or the RML has not yet been setup, * or we don't yet know our HNP, then all we can do * is process this locally */ if (orte_process_info.hnp || NULL == orte_rml.send_buffer || ORTE_PROC_MY_HNP->vpid == ORTE_VPID_INVALID) { rc = show_help(filename, topic, output, ORTE_PROC_MY_NAME); } /* otherwise, we relay the output message to * the HNP for processing */ else { opal_buffer_t buf; static bool am_inside = false; /* JMS Note that we *may* have a recursion situation here where the RML could call show_help. Need to think about this properly, but put a safeguard in here for sure for the time being. */ if (am_inside) { rc = show_help(filename, topic, output, ORTE_PROC_MY_NAME); } else { am_inside = true; /* build the message to the HNP */ OBJ_CONSTRUCT(&buf, opal_buffer_t); /* pack the filename of the show_help text file */ opal_dss.pack(&buf, &filename, 1, OPAL_STRING); /* pack the topic tag */ opal_dss.pack(&buf, &topic, 1, OPAL_STRING); /* pack the resulting string */ opal_dss.pack(&buf, &output, 1, OPAL_STRING); /* send it to the HNP */ if (0 > (rc = orte_rml.send_buffer(ORTE_PROC_MY_HNP, &buf, ORTE_RML_TAG_SHOW_HELP, 0))) { ORTE_ERROR_LOG(rc); } OBJ_DESTRUCT(&buf); am_inside = false; } } CLEANUP: free(output); return rc; }