/* * Process one line from the orte_base_user_debugger MCA param and * look for that debugger in the path. If we find it, fill in * new_argv. */ static int process(char *orig_line, char *basename, opal_cmd_line_t *cmd_line, int argc, char **argv, char ***new_argv, int num_procs) { int ret = ORTE_SUCCESS; int i, j, count; char *line = NULL, *tmp = NULL, *full_line = strdup(orig_line); char **orterun_argv = NULL, **executable_argv = NULL, **line_argv = NULL; char cwd[OPAL_PATH_MAX]; bool used_num_procs = false; bool single_app = false; bool fail_needed_executable = false; line = full_line; if (NULL == line) { ret = ORTE_ERR_OUT_OF_RESOURCE; goto out; } /* Trim off whitespace at the beginning and ending of line */ for (i = 0; '\0' != line[i] && isspace(line[i]); ++line) { continue; } for (i = strlen(line) - 2; i > 0 && isspace(line[i]); ++i) { line[i] = '\0'; } if (strlen(line) <= 0) { ret = ORTE_ERROR; goto out; } /* Get the tail of the command line (i.e., the user executable / argv) */ opal_cmd_line_get_tail(cmd_line, &i, &executable_argv); /* Make a new copy of the orterun command line args, without the orterun token itself, and without the --debug, --debugger, and -tv flags. */ orterun_argv = opal_argv_copy(argv); count = opal_argv_count(orterun_argv); opal_argv_delete(&count, &orterun_argv, 0, 1); for (i = 0; NULL != orterun_argv[i]; ++i) { count = opal_argv_count(orterun_argv); if (0 == strcmp(orterun_argv[i], "-debug") || 0 == strcmp(orterun_argv[i], "--debug")) { opal_argv_delete(&count, &orterun_argv, i, 1); } else if (0 == strcmp(orterun_argv[i], "-tv") || 0 == strcmp(orterun_argv[i], "--tv")) { opal_argv_delete(&count, &orterun_argv, i, 1); } else if (0 == strcmp(orterun_argv[i], "--debugger") || 0 == strcmp(orterun_argv[i], "-debugger")) { opal_argv_delete(&count, &orterun_argv, i, 2); } } /* Replace @@ tokens - line should never realistically be bigger than MAX_INT, so just cast to int to remove compiler warning */ *new_argv = NULL; line_argv = opal_argv_split(line, ' '); if (NULL == line_argv) { ret = ORTE_ERR_NOT_FOUND; goto out; } for (i = 0; NULL != line_argv[i]; ++i) { if (0 == strcmp(line_argv[i], "@mpirun@") || 0 == strcmp(line_argv[i], "@orterun@")) { opal_argv_append_nosize(new_argv, argv[0]); } else if (0 == strcmp(line_argv[i], "@mpirun_args@") || 0 == strcmp(line_argv[i], "@orterun_args@")) { for (j = 0; NULL != orterun_argv && NULL != orterun_argv[j]; ++j) { opal_argv_append_nosize(new_argv, orterun_argv[j]); } } else if (0 == strcmp(line_argv[i], "@np@")) { asprintf(&tmp, "%d", num_procs); opal_argv_append_nosize(new_argv, tmp); free(tmp); } else if (0 == strcmp(line_argv[i], "@single_app@")) { /* This token is only a flag; it is not replaced with any alternate text */ single_app = true; } else if (0 == strcmp(line_argv[i], "@executable@")) { /* If we found the executable, paste it in. Otherwise, this is a possible error. */ if (NULL != executable_argv) { opal_argv_append_nosize(new_argv, executable_argv[0]); } else { fail_needed_executable = true; } } else if (0 == strcmp(line_argv[i], "@executable_argv@")) { /* If we found the tail, paste in the argv. Otherwise, this is a possible error. */ if (NULL != executable_argv) { for (j = 1; NULL != executable_argv[j]; ++j) { opal_argv_append_nosize(new_argv, executable_argv[j]); } } else { fail_needed_executable = true; } } else { /* It wasn't a special token, so just copy it over */ opal_argv_append_nosize(new_argv, line_argv[i]); } } /* Can we find argv[0] in the path? */ getcwd(cwd, OPAL_PATH_MAX); tmp = opal_path_findv((*new_argv)[0], X_OK, environ, cwd); if (NULL != tmp) { free(tmp); /* Ok, we found a good debugger. Check for some error conditions. */ tmp = opal_argv_join(argv, ' '); /* We do not support launching a debugger that requires the -np value if the user did not specify -np on the command line. */ if (used_num_procs && 0 == num_procs) { free(tmp); tmp = opal_argv_join(orterun_argv, ' '); orte_show_help("help-orterun.txt", "debugger requires -np", true, (*new_argv)[0], argv[0], tmp, (*new_argv)[0]); /* Fall through to free / fail, below */ } /* Some debuggers do not support launching MPMD */ else if (single_app && NULL != strchr(tmp, ':')) { orte_show_help("help-orterun.txt", "debugger only accepts single app", true, (*new_argv)[0], (*new_argv)[0]); /* Fall through to free / fail, below */ } /* Some debuggers do not use orterun/mpirun, and therefore must have an executable to run (e.g., cannot use mpirun's app context file feature). */ else if (fail_needed_executable) { orte_show_help("help-orterun.txt", "debugger requires executable", true, (*new_argv)[0], argv[0], (*new_argv)[0], argv[0], (*new_argv)[0]); /* Fall through to free / fail, below */ } /* Otherwise, we succeeded. Return happiness. */ else { goto out; } free(tmp); } /* All done -- didn't find it */ opal_argv_free(*new_argv); *new_argv = NULL; ret = ORTE_ERR_NOT_FOUND; out: if (NULL != orterun_argv) { opal_argv_free(orterun_argv); } if (NULL != executable_argv) { opal_argv_free(executable_argv); } if (NULL != line_argv) { opal_argv_free(line_argv); } if (NULL != tmp) { free(tmp); } if (NULL != full_line) { free(full_line); } return ret; }
static int parse_args(int argc, char *argv[]) { int i, ret, len, exit_status = ORTE_SUCCESS ; opal_cmd_line_t cmd_line; char **app_env = NULL, **global_env = NULL; char * tmp_env_var = NULL; /* Init structure */ memset(&orte_checkpoint_globals, 0, sizeof(orte_checkpoint_globals_t)); orte_checkpoint_globals.help = false; orte_checkpoint_globals.pid = -1; orte_checkpoint_globals.term = false; orte_checkpoint_globals.verbose = false; orte_checkpoint_globals.req_hnp = ORTE_JOBID_INVALID; orte_checkpoint_globals.nowait = false; orte_checkpoint_globals.status = false; orte_checkpoint_globals.output = -1; orte_checkpoint_globals.ckpt_status = ORTE_SNAPC_CKPT_STATE_NONE; /* Parse the command line options */ opal_cmd_line_create(&cmd_line, cmd_line_opts); mca_base_open(); mca_base_cmd_line_setup(&cmd_line); ret = opal_cmd_line_parse(&cmd_line, true, argc, argv); /** * Put all of the MCA arguments in the environment */ mca_base_cmd_line_process_args(&cmd_line, &app_env, &global_env); len = opal_argv_count(app_env); for(i = 0; i < len; ++i) { putenv(app_env[i]); } len = opal_argv_count(global_env); for(i = 0; i < len; ++i) { putenv(global_env[i]); } tmp_env_var = mca_base_param_env_var("opal_cr_is_tool"); opal_setenv(tmp_env_var, "1", true, &environ); free(tmp_env_var); tmp_env_var = NULL; /** * Now start parsing our specific arguments */ /* get the remaining bits */ opal_cmd_line_get_tail(&cmd_line, &argc, &argv); #if OPAL_ENABLE_FT == 0 /* Warn and exit if not configured with Checkpoint/Restart */ { char *args = NULL; args = opal_cmd_line_get_usage_msg(&cmd_line); orte_show_help("help-orte-checkpoint.txt", "usage-no-cr", true, args); free(args); exit_status = ORTE_ERROR; goto cleanup; } #endif if (OPAL_SUCCESS != ret || orte_checkpoint_globals.help || (0 >= argc && ORTE_JOBID_INVALID == orte_checkpoint_globals.req_hnp)) { char *args = NULL; args = opal_cmd_line_get_usage_msg(&cmd_line); orte_show_help("help-orte-checkpoint.txt", "usage", true, args); free(args); exit_status = ORTE_ERROR; goto cleanup; } /* * If the user did not supply an hnp jobid, then they must * supply the PID of MPIRUN */ if(0 >= argc && ORTE_JOBID_INVALID != orte_checkpoint_globals.req_hnp) { exit_status = ORTE_SUCCESS; goto cleanup; } orte_checkpoint_globals.pid = atoi(argv[0]); if ( 0 >= orte_checkpoint_globals.pid ) { orte_show_help("help-orte-checkpoint.txt", "invalid_pid", true, orte_checkpoint_globals.pid); exit_status = ORTE_ERROR; goto cleanup; } /* * JJH: No wait is currently not implemented or tested */ if(orte_checkpoint_globals.nowait) { orte_checkpoint_globals.nowait = false; orte_show_help("help-orte-checkpoint.txt", "not_impl", true, "Disconnected checkpoint"); } if(orte_checkpoint_globals.verbose) { orte_checkpoint_globals.status = true; } cleanup: return exit_status; }
int main(int argc, char *argv[]) { int32_t ret, i; opal_cmd_line_t cmd_line; char **inpt; opal_buffer_t *buf; int count; char cwd[OPAL_PATH_MAX]; orcm_tool_cmd_t flag = ORCM_TOOL_STOP_CMD; int32_t master=0; uint16_t jfam=0; /*************** * Initialize ***************/ /* * Make sure to init util before parse_args * to ensure installdirs is setup properly * before calling mca_base_open(); */ if( ORTE_SUCCESS != (ret = orcm_init_util()) ) { return ret; } /* initialize the globals */ my_globals.help = false; my_globals.replicas = NULL; my_globals.sched = NULL; my_globals.hnp_uri = NULL; /* Parse the command line options */ opal_cmd_line_create(&cmd_line, cmd_line_opts); mca_base_open(); mca_base_cmd_line_setup(&cmd_line); ret = opal_cmd_line_parse(&cmd_line, true, argc, argv); /* extract the MCA/GMCA params */ mca_base_cmd_line_process_args(&cmd_line, &environ, &environ); /** * Now start parsing our specific arguments */ if (OPAL_SUCCESS != ret || my_globals.help) { char *args = NULL; args = opal_cmd_line_get_usage_msg(&cmd_line); orte_show_help("help-orcm-stop.txt", "usage", true, args); free(args); return ORTE_ERROR; } if (NULL != my_globals.sched) { if (0 == strncmp(my_globals.sched, "file", strlen("file")) || 0 == strncmp(my_globals.sched, "FILE", strlen("FILE"))) { char input[1024], *filename; FILE *fp; /* it is a file - get the filename */ filename = strchr(my_globals.sched, ':'); if (NULL == filename) { /* filename is not correctly formatted */ orte_show_help("help-openrcm-runtime.txt", "hnp-filename-bad", true, "scheduler", my_globals.sched); return ORTE_ERROR; } ++filename; /* space past the : */ if (0 >= strlen(filename)) { /* they forgot to give us the name! */ orte_show_help("help-openrcm-runtime.txt", "hnp-filename-bad", true, "scheduler", my_globals.sched); return ORTE_ERROR; } /* open the file and extract the pid */ fp = fopen(filename, "r"); if (NULL == fp) { /* can't find or read file! */ orte_show_help("help-openrcm-runtime.txt", "hnp-filename-access", true, "scheduler", filename); return ORTE_ERROR; } if (NULL == fgets(input, 1024, fp)) { /* something malformed about file */ fclose(fp); orte_show_help("help-openrcm-runtime.txt", "hnp-file-bad", "scheduler", true, filename); return ORTE_ERROR; } fclose(fp); input[strlen(input)-1] = '\0'; /* remove newline */ /* convert the pid */ master = strtoul(input, NULL, 10); } else { /* should just be the master itself */ master = strtoul(my_globals.sched, NULL, 10); } } /* if we were given HNP contact info, parse it and * setup the process_info struct with that info */ if (NULL != my_globals.hnp_uri) { if (0 == strncmp(my_globals.hnp_uri, "file", strlen("file")) || 0 == strncmp(my_globals.hnp_uri, "FILE", strlen("FILE"))) { char input[1024], *filename; FILE *fp; /* it is a file - get the filename */ filename = strchr(my_globals.hnp_uri, ':'); if (NULL == filename) { /* filename is not correctly formatted */ orte_show_help("help-openrcm-runtime.txt", "hnp-filename-bad", true, "uri", my_globals.hnp_uri); goto cleanup; } ++filename; /* space past the : */ if (0 >= strlen(filename)) { /* they forgot to give us the name! */ orte_show_help("help-openrcm-runtime.txt", "hnp-filename-bad", true, "uri", my_globals.hnp_uri); goto cleanup; } /* open the file and extract the uri */ fp = fopen(filename, "r"); if (NULL == fp) { /* can't find or read file! */ orte_show_help("help-openrcm-runtime.txt", "hnp-filename-access", true, filename); goto cleanup; } if (NULL == fgets(input, 1024, fp)) { /* something malformed about file */ fclose(fp); orte_show_help("help-openrcm-runtime.txt", "hnp-file-bad", true, filename); goto cleanup; } fclose(fp); input[strlen(input)-1] = '\0'; /* remove newline */ /* put into the process info struct */ orte_process_info.my_hnp_uri = strdup(input); } else { /* should just be the uri itself */ orte_process_info.my_hnp_uri = strdup(my_globals.hnp_uri); } } if (OPAL_SUCCESS != opal_getcwd(cwd, sizeof(cwd))) { opal_output(orte_clean_output, "failed to get cwd\n"); return ORTE_ERR_NOT_FOUND; } /*************************** * We need all of OPAL and ORTE - this will * automatically connect us to the CM ***************************/ if (ORTE_SUCCESS != orcm_init(ORCM_TOOL)) { orcm_finalize(); return 1; } /* if we were given the hnp uri, extract the job family for the * master id */ if (NULL != my_globals.hnp_uri) { master = ORTE_JOB_FAMILY(ORTE_PROC_MY_HNP->jobid); } /* register to receive responses */ if (ORCM_SUCCESS != (ret = orcm_pnp.register_receive("orcm-stop", "0.1", "alpha", ORCM_PNP_GROUP_INPUT_CHANNEL, ORCM_PNP_TAG_TOOL, ack_recv, NULL))) { ORTE_ERROR_LOG(ret); goto cleanup; } /* announce my existence */ if (ORCM_SUCCESS != (ret = orcm_pnp.announce("orcm-stop", "0.1", "alpha", NULL))) { ORTE_ERROR_LOG(ret); goto cleanup; } /* setup the buffer to send our cmd */ buf = OBJ_NEW(opal_buffer_t); /* indicate the scheduler to be used */ jfam = master & 0x0000ffff; opal_dss.pack(buf, &jfam, 1, OPAL_UINT16); /* get the apps to stop */ inpt = NULL; opal_cmd_line_get_tail(&cmd_line, &count, &inpt); if (0 == count) { /* if no apps were given, then we stop the entire * DVM itself by telling the daemon's to terminate */ if (ORCM_SUCCESS != (ret = orcm_pnp.output_nb(ORCM_PNP_SYS_CHANNEL, NULL, ORCM_PNP_TAG_TERMINATE, NULL, 0, buf, cbfunc, NULL))) { ORTE_ERROR_LOG(ret); } goto cleanup; } else { /* load the stop cmd */ opal_dss.pack(buf, &flag, 1, ORCM_TOOL_CMD_T); /* for each app */ for (i=0; NULL != inpt[i]; i++) { opal_dss.pack(buf, &inpt[i], 1, OPAL_STRING); /* pack the replicas to be stopped */ opal_dss.pack(buf, &my_globals.replicas, 1, OPAL_STRING); } opal_argv_free(inpt); if (ORCM_SUCCESS != (ret = orcm_pnp.output_nb(ORCM_PNP_SYS_CHANNEL, NULL, ORCM_PNP_TAG_TOOL, NULL, 0, buf, cbfunc, NULL))) { ORTE_ERROR_LOG(ret); } } /* now wait for ack */ opal_event_dispatch(opal_event_base); /*************** * Cleanup ***************/ cleanup: orcm_finalize(); return ret; }
static int parse_args(int argc, char *argv[]) { int i, ret, len, exit_status = ORTE_SUCCESS ; opal_cmd_line_t cmd_line; char **app_env = NULL, **global_env = NULL; char * tmp_env_var = NULL; char *argv0 = NULL; /* Init structure */ memset(&orte_migrate_globals, 0, sizeof(orte_migrate_globals_t)); orte_migrate_globals.help = false; orte_migrate_globals.pid = -1; orte_migrate_globals.verbose = false; orte_migrate_globals.verbose_level = 0; orte_migrate_globals.status = false; orte_migrate_globals.output = -1; orte_migrate_globals.off_nodes = NULL; orte_migrate_globals.off_procs = NULL; orte_migrate_globals.onto_nodes = NULL; #if OPAL_ENABLE_FT_CR == 0 /* Warn and exit if not configured with Migrate/Restart */ { char *str, *args = NULL; args = opal_cmd_line_get_usage_msg(&cmd_line); str = opal_show_help_string("help-orte-migrate.txt", "usage-no-cr", true, args); if (NULL != str) { printf("%s", str); free(str); } free(args); exit_status = ORTE_ERROR; goto cleanup; } #endif /* Parse the command line options */ opal_cmd_line_create(&cmd_line, cmd_line_opts); mca_base_open(); mca_base_cmd_line_setup(&cmd_line); ret = opal_cmd_line_parse(&cmd_line, false, argc, argv); if (OPAL_SUCCESS != ret) { if (OPAL_ERR_SILENT != ret) { fprintf(stderr, "%s: command line error (%s)\n", argv[0], opal_strerror(ret)); } exit_status = 1; goto cleanup; } if (orte_migrate_globals.help) { char *str, *args = NULL; args = opal_cmd_line_get_usage_msg(&cmd_line); str = opal_show_help_string("help-orte-migrate.txt", "usage", true, args); if (NULL != str) { printf("%s", str); free(str); } free(args); /* If we show the help message, that should be all we do */ exit(0); } /** * Put all of the MCA arguments in the environment */ mca_base_cmd_line_process_args(&cmd_line, &app_env, &global_env); len = opal_argv_count(app_env); for(i = 0; i < len; ++i) { putenv(app_env[i]); } len = opal_argv_count(global_env); for(i = 0; i < len; ++i) { putenv(global_env[i]); } tmp_env_var = mca_base_param_env_var("opal_cr_is_tool"); opal_setenv(tmp_env_var, "1", true, &environ); free(tmp_env_var); tmp_env_var = NULL; /** * Now start parsing our specific arguments */ /* get the remaining bits */ argv0 = strdup(argv[0]); opal_cmd_line_get_tail(&cmd_line, &argc, &argv); if (NULL == orte_migrate_globals.off_nodes && NULL == orte_migrate_globals.off_procs) { fprintf(stderr, "%s: Nothing to do\n", argv0); fprintf(stderr, "Type '%s --help' for usage.\n", argv0); exit_status = 1; goto cleanup; } if(orte_migrate_globals.verbose_level < 0 ) { orte_migrate_globals.verbose_level = 0; } if(orte_migrate_globals.verbose_level > 0) { orte_migrate_globals.verbose = true; } /* * If the user did not supply an hnp jobid, then they must * supply the PID of MPIRUN */ if(0 >= argc ) { fprintf(stderr, "%s: Nothing to do\n", argv[0]); fprintf(stderr, "Type '%s --help' for usage.\n", argv[0]); exit_status = ORTE_ERROR; goto cleanup; } orte_migrate_globals.pid = atoi(argv[0]); if ( 0 >= orte_migrate_globals.pid ) { opal_show_help("help-orte-migrate.txt", "invalid_pid", true, orte_migrate_globals.pid); exit_status = ORTE_ERROR; goto cleanup; } if(orte_migrate_globals.verbose) { orte_migrate_globals.status = true; } if(orte_migrate_globals.verbose) { pretty_print_migration(); } cleanup: if (NULL != argv0) { free(argv0); } return exit_status; }
/* * Process one line from the orte_base_user_debugger MCA param and * look for that debugger in the path. If we find it, fill in * new_argv. */ static int process(char *orig_line, char *basename, opal_cmd_line_t *cmd_line, int argc, char **argv, char ***new_argv) { int i; char *line, *full_line = strdup(orig_line); char *user_argv, *tmp, *tmp2, **tmp_argv, **executable; char cwd[PATH_MAX]; bool used_num_procs = false; bool fail_single_app = false; bool fail_needed_executable = false; line = full_line; if (NULL == line) { return ORTE_ERR_OUT_OF_RESOURCE; } /* Trim off whitespace at the beginning and ending of line */ for (i = 0; '\0' != line[i] && isspace(line[i]); ++line) { continue; } for (i = strlen(line) - 2; i > 0 && isspace(line[i]); ++i) { line[i] = '\0'; } if (strlen(line) <= 0) { return ORTE_ERROR; } /* Get the tail of the command line (i.e., the user executable / argv) */ opal_cmd_line_get_tail(cmd_line, &i, &executable); /* Remove --debug, --debugger, and -tv from the user command line params */ if (1 == argc) { user_argv = strdup(""); } else { tmp_argv = opal_argv_copy(argv); for (i = 0; NULL != tmp_argv[i]; ++i) { if (0 == strcmp(tmp_argv[i], "-debug") || 0 == strcmp(tmp_argv[i], "--debug")) { free(tmp_argv[i]); tmp_argv[i] = strdup(""); } else if (0 == strcmp(tmp_argv[i], "-tv") || 0 == strcmp(tmp_argv[i], "--tv")) { free(tmp_argv[i]); tmp_argv[i] = strdup(""); } else if (0 == strcmp(tmp_argv[i], "--debugger") || 0 == strcmp(tmp_argv[i], "-debugger")) { free(tmp_argv[i]); tmp_argv[i] = strdup(""); if (NULL != tmp_argv[i + 1]) { ++i; free(tmp_argv[i]); tmp_argv[i] = strdup(""); } } } user_argv = opal_argv_join(tmp_argv + 1, ' '); opal_argv_free(tmp_argv); } /* Replace @@ tokens - line should never realistically be bigger than MAX_INT, so just cast to int to remove compiler warning */ for (i = 0; i < (int) strlen(line); ++i) { tmp = NULL; if (0 == strncmp(line + i, "@mpirun@", 8)) { line[i] = '\0'; asprintf(&tmp, "%s%s%s", line, argv[0], line + i + 8); } else if (0 == strncmp(line + i, "@orterun@", 9)) { line[i] = '\0'; asprintf(&tmp, "%s%s%s", line, argv[0], line + i + 9); } else if (0 == strncmp(line + i, "@mpirun_args@", 13)) { line[i] = '\0'; asprintf(&tmp, "%s%s%s", line, user_argv, line + i + 13); } else if (0 == strncmp(line + i, "@orterun_args@", 14)) { line[i] = '\0'; asprintf(&tmp, "%s%s%s", line, user_argv, line + i + 14); } else if (0 == strncmp(line + i, "@np@", 4)) { line[i] = '\0'; asprintf(&tmp, "%s%d%s", line, orterun_globals.num_procs, line + i + 4); used_num_procs = true; } else if (0 == strncmp(line + i, "@single_app@", 12)) { line[i] = '\0'; /* This token is only a flag; it is not replaced with any alternate text */ asprintf(&tmp, "%s%s", line, line + i + 12); tmp2 = opal_argv_join(executable + 1, ' '); if (NULL != strchr(tmp2, ':')) { fail_single_app = true; } free(tmp2); } else if (0 == strncmp(line + i, "@executable@", 12)) { line[i] = '\0'; /* If we found the executable, paste it in. Otherwise, this is a possible error. */ if (NULL != executable) { asprintf(&tmp, "%s%s%s", line, executable[0], line + i + 12); } else { fail_needed_executable = true; } } else if (0 == strncmp(line + i, "@executable_argv@", 17)) { line[i] = '\0'; /* If we found the tail, paste in the argv. Otherwise, this is a possible error. */ if (NULL != executable) { if (NULL != executable[1]) { /* Put in the argv */ tmp2 = opal_argv_join(executable + 1, ' '); asprintf(&tmp, "%s%s%s", line, tmp2, line + i + 17); free(tmp2); } else { /* There is no argv; just paste the front and back together, removing the @token@ */ asprintf(&tmp, "%s%s", line, line + i + 17); } } else { fail_needed_executable = true; } } if (NULL != tmp) { free(full_line); full_line = line = tmp; --i; } } /* Split up into argv */ *new_argv = opal_argv_split(line, ' '); free(line); /* Can we find argv[0] in the path? */ getcwd(cwd, PATH_MAX); tmp = opal_path_findv((*new_argv)[0], X_OK, environ, cwd); if (NULL != tmp) { free(tmp); /* Ok, we found a good debugger. Check for some error conditions. */ /* We do not support launching a debugger that requires the -np value if the user did not specify -np on the command line. */ if (used_num_procs && 0 == orterun_globals.num_procs) { opal_show_help("help-orterun.txt", "debugger requires -np", true, (*new_argv)[0], argv[0], user_argv, (*new_argv)[0]); /* Fall through to free / fail, below */ } /* Some debuggers do not support launching MPMD */ else if (fail_single_app) { opal_show_help("help-orterun.txt", "debugger only accepts single app", true, (*new_argv)[0], (*new_argv)[0]); /* Fall through to free / fail, below */ } /* Some debuggers do not use orterun/mpirun, and therefore must have an executable to run (e.g., cannot use mpirun's app context file feature). */ else if (fail_needed_executable) { opal_show_help("help-orterun.txt", "debugger requires executable", true, (*new_argv)[0], argv[0], (*new_argv)[0], argv[0], (*new_argv)[0]); /* Fall through to free / fail, below */ } /* Otherwise, we succeeded. Return happiness. */ else { return ORTE_SUCCESS; } } /* All done -- didn't find it */ opal_argv_free(*new_argv); *new_argv = NULL; return ORTE_ERR_NOT_FOUND; }
static int parse_args(int argc, char *argv[]) { int i, ret, len, exit_status = ORTE_SUCCESS ; opal_cmd_line_t cmd_line; char **app_env = NULL, **global_env = NULL; char * tmp_env_var = NULL; char *argv0 = NULL; /* Init structure */ memset(&orte_checkpoint_globals, 0, sizeof(orte_checkpoint_globals_t)); orte_checkpoint_globals.help = false; orte_checkpoint_globals.pid = -1; orte_checkpoint_globals.verbose = false; orte_checkpoint_globals.verbose_level = 0; orte_checkpoint_globals.req_hnp = ORTE_JOBID_INVALID; orte_checkpoint_globals.nowait = false; orte_checkpoint_globals.status = false; orte_checkpoint_globals.output = -1; orte_checkpoint_globals.ckpt_status = ORTE_SNAPC_CKPT_STATE_NONE; orte_checkpoint_globals.list_only = false; #if OPAL_ENABLE_CRDEBUG == 1 orte_checkpoint_globals.enable_crdebug = false; #endif orte_checkpoint_globals.options = OBJ_NEW(opal_crs_base_ckpt_options_t); orte_checkpoint_globals.term = false; orte_checkpoint_globals.stop = false; #if OPAL_ENABLE_CRDEBUG == 1 orte_checkpoint_globals.attach_debugger = false; orte_checkpoint_globals.detach_debugger = false; #endif #if OPAL_ENABLE_FT_CR == 0 /* Warn and exit if not configured with Checkpoint/Restart */ { char *str, *args = NULL; args = opal_cmd_line_get_usage_msg(&cmd_line); str = opal_show_help_string("help-orte-checkpoint.txt", "usage-no-cr", true, args); if (NULL != str) { printf("%s", str); free(str); } free(args); exit_status = ORTE_ERROR; goto cleanup; } #endif /* Parse the command line options */ opal_cmd_line_create(&cmd_line, cmd_line_opts); mca_base_open(); mca_base_cmd_line_setup(&cmd_line); ret = opal_cmd_line_parse(&cmd_line, true, argc, argv); if (OPAL_SUCCESS != ret) { if (OPAL_ERR_SILENT != ret) { fprintf(stderr, "%s: command line error (%s)\n", argv[0], opal_strerror(ret)); } exit_status = 1; goto cleanup; } if (orte_checkpoint_globals.help) { char *str, *args = NULL; args = opal_cmd_line_get_usage_msg(&cmd_line); str = opal_show_help_string("help-orte-checkpoint.txt", "usage", true, args); if (NULL != str) { printf("%s", str); free(str); } free(args); /* If we show the help message, that should be all we do */ exit(0); } /** * Put all of the MCA arguments in the environment */ mca_base_cmd_line_process_args(&cmd_line, &app_env, &global_env); len = opal_argv_count(app_env); for(i = 0; i < len; ++i) { putenv(app_env[i]); } len = opal_argv_count(global_env); for(i = 0; i < len; ++i) { putenv(global_env[i]); } (void) mca_base_var_env_name("opal_cr_is_tool", &tmp_env_var); opal_setenv(tmp_env_var, "1", true, &environ); free(tmp_env_var); tmp_env_var = NULL; /** * Now start parsing our specific arguments */ /* get the remaining bits */ argv0 = strdup(argv[0]); opal_cmd_line_get_tail(&cmd_line, &argc, &argv); if(orte_checkpoint_globals.list_only ) { exit_status = ORTE_SUCCESS; goto cleanup; } if (0 >= argc && ORTE_JOBID_INVALID == orte_checkpoint_globals.req_hnp) { fprintf(stderr, "%s: Nothing to do\n", argv0); fprintf(stderr, "Type '%s --help' for usage.\n", argv0); exit_status = 1; goto cleanup; } orte_checkpoint_globals.options->term = orte_checkpoint_globals.term; orte_checkpoint_globals.options->stop = orte_checkpoint_globals.stop; #if OPAL_ENABLE_CRDEBUG == 1 orte_checkpoint_globals.options->attach_debugger = orte_checkpoint_globals.attach_debugger; orte_checkpoint_globals.options->detach_debugger = orte_checkpoint_globals.detach_debugger; #endif if(orte_checkpoint_globals.verbose_level < 0 ) { orte_checkpoint_globals.verbose_level = 0; } if(orte_checkpoint_globals.verbose_level > 0) { orte_checkpoint_globals.verbose = true; } /* * If the user did not supply an hnp jobid, then they must * supply the PID of MPIRUN */ if(0 >= argc && ORTE_JOBID_INVALID != orte_checkpoint_globals.req_hnp) { exit_status = ORTE_SUCCESS; goto cleanup; } orte_checkpoint_globals.pid = atoi(argv[0]); if ( 0 >= orte_checkpoint_globals.pid ) { opal_show_help("help-orte-checkpoint.txt", "invalid_pid", true, orte_checkpoint_globals.pid); exit_status = ORTE_ERROR; goto cleanup; } /* * JJH: No wait is currently not implemented or tested */ if(orte_checkpoint_globals.nowait) { orte_checkpoint_globals.nowait = false; opal_show_help("help-orte-checkpoint.txt", "not_impl", true, "Disconnected checkpoint"); } if(orte_checkpoint_globals.verbose) { orte_checkpoint_globals.status = true; } cleanup: if (NULL != argv0) { free(argv0); } return exit_status; }
static int parse_args(int argc, char *argv[]) { int i, ret, len; opal_cmd_line_t cmd_line; char **app_env = NULL, **global_env = NULL; char * tmp_env_var = NULL; char *argv0 = NULL; orte_restart_globals_t tmp = { false, /* help */ NULL, /* filename */ NULL, /* appfile */ false, /* verbose */ false, /* forked */ -1, /* seq_number */ NULL, /* hostfile */ -1, /* output*/ false, /* info only */ false, /* app only */ false, /* showme */ NULL}; /* mpirun_opts */ orte_restart_globals = tmp; #if OPAL_ENABLE_CRDEBUG == 1 orte_restart_globals.enable_crdebug = false; #endif #if OPAL_ENABLE_FT_CR == 0 /* Warn and exit if not configured with Checkpoint/Restart */ { char *str, *args = NULL; args = opal_cmd_line_get_usage_msg(&cmd_line); str = opal_show_help_string("help-orte-restart.txt", "usage-no-cr", true, args); if (NULL != str) { printf("%s", str); free(str); } free(args); return ORTE_ERROR; } #endif /* Parse the command line options */ opal_cmd_line_create(&cmd_line, cmd_line_opts); mca_base_open(); mca_base_cmd_line_setup(&cmd_line); ret = opal_cmd_line_parse(&cmd_line, true, argc, argv); if (OPAL_SUCCESS != ret) { if (OPAL_ERR_SILENT != ret) { fprintf(stderr, "%s: command line error (%s)\n", argv[0], opal_strerror(ret)); } return 1; } if (orte_restart_globals.help) { char *str, *args = NULL; args = opal_cmd_line_get_usage_msg(&cmd_line); str = opal_show_help_string("help-orte-restart.txt", "usage", true, args); if (NULL != str) { printf("%s", str); free(str); } free(args); /* If we show the help message, that should be all we do */ exit(0); } /** * Put all of the MCA arguments in the environment */ mca_base_cmd_line_process_args(&cmd_line, &app_env, &global_env); len = opal_argv_count(app_env); for(i = 0; i < len; ++i) { putenv(app_env[i]); } len = opal_argv_count(global_env); for(i = 0; i < len; ++i) { putenv(global_env[i]); } (void) mca_base_var_env_name("opal_cr_is_tool", &tmp_env_var); opal_setenv(tmp_env_var, "1", true, &environ); free(tmp_env_var); tmp_env_var = NULL; /** * Now start parsing our specific arguments */ /* get the remaining bits */ argv0 = strdup(argv[0]); opal_cmd_line_get_tail(&cmd_line, &argc, &argv); if (0 == argc) { fprintf(stderr, "%s: Nothing to do\n", argv0); fprintf(stderr, "Type '%s --help' for usge.\n", argv0); free(argv0); return ORTE_ERROR; } free(argv0); orte_restart_globals.snapshot_ref = strdup(argv[0]); if ( NULL == orte_restart_globals.snapshot_ref || 0 >= strlen(orte_restart_globals.snapshot_ref) ) { opal_show_help("help-orte-restart.txt", "invalid_filename", true, "<none provided>"); return ORTE_ERROR; } /* If we have arguments after the command, then assume they * need to be grouped together. */ if(argc > 1) { orte_restart_globals.snapshot_ref = strdup(opal_argv_join(argv, ' ')); } return ORTE_SUCCESS; }
static int parse_args(int argc, char *argv[]) { int i, ret, len; opal_cmd_line_t cmd_line; char **app_env = NULL, **global_env = NULL; char * tmp_env_var = NULL; char *argv0 = NULL; memset(&opal_checkpoint_globals, 0, sizeof(opal_checkpoint_globals_t)); opal_checkpoint_globals.snapshot_name = NULL; opal_checkpoint_globals.snapshot_loc = NULL; /* Parse the command line options */ opal_cmd_line_create(&cmd_line, cmd_line_opts); mca_base_open(); mca_base_cmd_line_setup(&cmd_line); ret = opal_cmd_line_parse(&cmd_line, true, false, argc, argv); if (OPAL_SUCCESS != ret) { if (OPAL_ERR_SILENT != ret) { fprintf(stderr, "%s: command line error (%s)\n", argv[0], opal_strerror(ret)); } return 1; } if (opal_checkpoint_globals.help) { char *str, *args = NULL; args = opal_cmd_line_get_usage_msg(&cmd_line); str = opal_show_help_string("help-opal-checkpoint.txt", "usage", true, args); if (NULL != str) { printf("%s", str); free(str); } free(args); /* If we show the help message, that should be all we do */ exit(0); } /** * Put all of the MCA arguments in the environment */ mca_base_cmd_line_process_args(&cmd_line, &app_env, &global_env); len = opal_argv_count(app_env); for(i = 0; i < len; ++i) { putenv(app_env[i]); } len = opal_argv_count(global_env); for(i = 0; i < len; ++i) { putenv(global_env[i]); } (void) mca_base_var_env_name("opal_cr_is_tool", &tmp_env_var); opal_setenv(tmp_env_var, "1", true, &environ); free(tmp_env_var); tmp_env_var = NULL; /** * Now start parsing our specific arguments */ if( NULL == opal_checkpoint_globals.snapshot_name ) opal_checkpoint_globals.snapshot_name = strdup(""); if( NULL == opal_checkpoint_globals.snapshot_loc ) { opal_checkpoint_globals.snapshot_loc = strdup(""); } /* get the remaining bits */ argv0 = strdup(argv[0]); opal_cmd_line_get_tail(&cmd_line, &argc, &argv); if (0 == argc) { fprintf(stderr, "%s: Nothing to do\n", argv0); fprintf(stderr, "Type '%s --help' for usage.\n", argv0); free(argv0); return OPAL_ERROR; } free(argv0); opal_checkpoint_globals.pid = atoi(argv[0]); if ( 0 >= opal_checkpoint_globals.pid ) { opal_show_help("help-opal-checkpoint.txt", "invalid_pid", true, opal_checkpoint_globals.pid); return OPAL_ERROR; } return OPAL_SUCCESS; }
static int parse_args(int argc, char *argv[]) { int i, ret, len; opal_cmd_line_t cmd_line; char **app_env = NULL, **global_env = NULL; opal_restart_globals.help = false; opal_restart_globals.verbose = false; opal_restart_globals.snapshot_ref = NULL; opal_restart_globals.snapshot_loc = NULL; opal_restart_globals.snapshot_metadata = NULL; opal_restart_globals.snapshot_cache = NULL; opal_restart_globals.snapshot_compress = NULL; opal_restart_globals.snapshot_compress_postfix = NULL; opal_restart_globals.output = 0; /* Parse the command line options */ opal_cmd_line_create(&cmd_line, cmd_line_opts); mca_base_open(); mca_base_cmd_line_setup(&cmd_line); ret = opal_cmd_line_parse(&cmd_line, false, false, argc, argv); if (OPAL_SUCCESS != ret) { if (OPAL_ERR_SILENT != ret) { fprintf(stderr, "%s: command line error (%s)\n", argv[0], opal_strerror(ret)); } return 1; } if (opal_restart_globals.help ) { char *str, *args = NULL; args = opal_cmd_line_get_usage_msg(&cmd_line); str = opal_show_help_string("help-opal-restart.txt", "usage", true, args); if (NULL != str) { printf("%s", str); free(str); } free(args); /* If we show the help message, that should be all we do */ exit(0); } /** * Put all of the MCA arguments in the environment */ mca_base_cmd_line_process_args(&cmd_line, &app_env, &global_env); len = opal_argv_count(app_env); for(i = 0; i < len; ++i) { putenv(app_env[i]); } len = opal_argv_count(global_env); for(i = 0; i < len; ++i) { putenv(global_env[i]); } /** * Now start parsing our specific arguments */ /* get the remaining bits */ opal_cmd_line_get_tail(&cmd_line, &argc, &argv); if ( NULL == opal_restart_globals.snapshot_ref || 0 >= strlen(opal_restart_globals.snapshot_ref) ) { opal_show_help("help-opal-restart.txt", "invalid_filename", true, "<none provided>"); return OPAL_ERROR; } /* If we have arguments after the command, then assume they * need to be grouped together. * Useful in the 'mca crs self' instance. */ if(argc > 0) { opal_restart_globals.snapshot_ref = strdup(opal_argv_join(argv, ' ')); } return OPAL_SUCCESS; }