root/orte/tools/orte-info/orte-info.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2004-2010 The Trustees of Indiana University and Indiana
   4  *                         University Research and Technology
   5  *                         Corporation.  All rights reserved.
   6  * Copyright (c) 2004-2006 The University of Tennessee and The University
   7  *                         of Tennessee Research Foundation.  All rights
   8  *                         reserved.
   9  * Copyright (c) 2004-2007 High Performance Computing Center Stuttgart,
  10  *                         University of Stuttgart.  All rights reserved.
  11  * Copyright (c) 2004-2005 The Regents of the University of California.
  12  *                         All rights reserved.
  13  * Copyright (c) 2007-2012 Cisco Systems, Inc.  All rights reserved.
  14  * Copyright (c) 2010-2016 Los Alamos National Security, LLC.
  15  *                         All rights reserved.
  16  * Copyright (c) 2014      Intel, Inc. All rights reserved.
  17  * Copyright (c) 2015      Research Organization for Information Science
  18  *                         and Technology (RIST). All rights reserved.
  19  * $COPYRIGHT$
  20  *
  21  * Additional copyrights may follow
  22  *
  23  * $HEADER$
  24  */
  25 
  26 #include "orte_config.h"
  27 
  28 #include <stdio.h>
  29 #include <string.h>
  30 #include <ctype.h>
  31 #ifdef HAVE_UNISTD_H
  32 #include <unistd.h>
  33 #endif
  34 #ifdef HAVE_NETDB_H
  35 #include <netdb.h>
  36 #endif
  37 #ifdef HAVE_SYS_PARAM_H
  38 #include <sys/param.h>
  39 #endif
  40 #include <errno.h>
  41 #include <signal.h>
  42 
  43 #include "opal/mca/installdirs/installdirs.h"
  44 #include "opal/class/opal_object.h"
  45 #include "opal/class/opal_pointer_array.h"
  46 #include "opal/runtime/opal.h"
  47 #include "opal/runtime/opal_info_support.h"
  48 #include "opal/util/cmd_line.h"
  49 #include "opal/util/error.h"
  50 #include "opal/util/argv.h"
  51 #include "opal/mca/base/base.h"
  52 #include "opal/util/show_help.h"
  53 
  54 #include "orte/constants.h"
  55 #include "orte/util/show_help.h"
  56 #include "orte/runtime/orte_info_support.h"
  57 #include "orte/runtime/orte_locks.h"
  58 
  59 #include "orte/tools/orte-info/orte-info.h"
  60 
  61 /*
  62  * Public variables
  63  */
  64 
  65 bool orte_info_pretty = true;
  66 opal_cmd_line_t *orte_info_cmd_line = NULL;
  67 
  68 const char *orte_info_type_all = "all";
  69 const char *orte_info_type_opal = "opal";
  70 const char *orte_info_type_base = "base";
  71 
  72 opal_pointer_array_t mca_types = {{0}};
  73 
  74 int main(int argc, char *argv[])
  75 {
  76     int ret = 0;
  77     bool want_help = false;
  78     bool cmd_error = false;
  79     bool acted = false;
  80     bool want_all = false;
  81     char **app_env = NULL, **global_env = NULL;
  82     int i, len;
  83     char *str;
  84 
  85     /* protect against problems if someone passes us thru a pipe
  86      * and then abnormally terminates the pipe early */
  87     signal(SIGPIPE, SIG_IGN);
  88 
  89     /* Initialize the argv parsing handle */
  90     if (ORTE_SUCCESS != opal_init_util(&argc, &argv)) {
  91         orte_show_help("help-orte-info.txt", "lib-call-fail", true,
  92                        "opal_init_util", __FILE__, __LINE__, NULL);
  93         exit(ret);
  94     }
  95 
  96     orte_info_cmd_line = OBJ_NEW(opal_cmd_line_t);
  97     if (NULL == orte_info_cmd_line) {
  98         ret = errno;
  99         orte_show_help("help-orte-info.txt", "lib-call-fail", true,
 100                        "opal_cmd_line_create", __FILE__, __LINE__, NULL);
 101         opal_finalize_util();
 102         exit(ret);
 103     }
 104 
 105     opal_cmd_line_make_opt3(orte_info_cmd_line, 'v', NULL, "version", 2,
 106                             "Show version of ORTE or a component.  The first parameter can be the keywords \"orte\" or \"all\", a framework name (indicating all components in a framework), or a framework:component string (indicating a specific component).  The second parameter can be one of: full, major, minor, release, greek, svn.");
 107     opal_cmd_line_make_opt3(orte_info_cmd_line, '\0', NULL, "param", 2,
 108                             "Show MCA parameters.  The first parameter is the framework (or the keyword \"all\"); the second parameter is the specific component name (or the keyword \"all\").");
 109     opal_cmd_line_make_opt3(orte_info_cmd_line, '\0', NULL, "internal", 0,
 110                             "Show internal MCA parameters (not meant to be modified by users)");
 111     opal_cmd_line_make_opt3(orte_info_cmd_line, '\0', NULL, "path", 1,
 112                             "Show paths that Open MPI was configured with.  Accepts the following parameters: prefix, bindir, libdir, incdir, mandir, pkglibdir, sysconfdir");
 113     opal_cmd_line_make_opt3(orte_info_cmd_line, '\0', NULL, "arch", 0,
 114                             "Show architecture Open MPI was corteled on");
 115     opal_cmd_line_make_opt3(orte_info_cmd_line, 'c', NULL, "config", 0,
 116                             "Show configuration options");
 117     opal_cmd_line_make_opt3(orte_info_cmd_line, 'h', NULL, "help", 0,
 118                             "Show this help message");
 119     opal_cmd_line_make_opt3(orte_info_cmd_line, '\0', NULL, "orte_info_pretty", 0,
 120                             "When used in conjunction with other parameters, the output is displayed in 'orte_info_prettyprint' format (default)");
 121     opal_cmd_line_make_opt3(orte_info_cmd_line, '\0', NULL, "parsable", 0,
 122                             "When used in conjunction with other parameters, the output is displayed in a machine-parsable format");
 123     opal_cmd_line_make_opt3(orte_info_cmd_line, '\0', NULL, "parseable", 0,
 124                             "Synonym for --parsable");
 125     opal_cmd_line_make_opt3(orte_info_cmd_line, '\0', NULL, "hostname", 0,
 126                             "Show the hostname that Open MPI was configured "
 127                             "and built on");
 128     opal_cmd_line_make_opt3(orte_info_cmd_line, 'a', NULL, "all", 0,
 129                             "Show all configuration options and MCA parameters");
 130 
 131     /* Call some useless functions in order to guarantee to link in some
 132      * global variables.  Only check the return value so that the
 133      * corteler doesn't optimize out the useless function.
 134      */
 135 
 136     if (ORTE_SUCCESS != orte_locks_init()) {
 137         /* Stop .. or I'll say stop again! */
 138         ++ret;
 139     } else {
 140         --ret;
 141     }
 142 
 143     /* set our threading level */
 144     opal_set_using_threads(false);
 145 
 146     /* Get MCA parameters, if any */
 147 
 148     if( ORTE_SUCCESS != mca_base_open() ) {
 149         orte_show_help("help-orte-info.txt", "lib-call-fail", true, "mca_base_open", __FILE__, __LINE__ );
 150         OBJ_RELEASE(orte_info_cmd_line);
 151         opal_finalize_util();
 152         exit(1);
 153     }
 154     mca_base_cmd_line_setup(orte_info_cmd_line);
 155 
 156     /* Do the parsing */
 157 
 158     ret = opal_cmd_line_parse(orte_info_cmd_line, false, false, argc, argv);
 159     if (OPAL_SUCCESS != ret) {
 160         if (OPAL_ERR_SILENT != ret) {
 161             fprintf(stderr, "%s: command line error (%s)\n", argv[0],
 162                     opal_strerror(ret));
 163         }
 164         cmd_error = true;
 165     }
 166     if (!cmd_error &&
 167         (opal_cmd_line_is_taken(orte_info_cmd_line, "help") ||
 168          opal_cmd_line_is_taken(orte_info_cmd_line, "h"))) {
 169         char *str, *usage;
 170 
 171         want_help = true;
 172         usage = opal_cmd_line_get_usage_msg(orte_info_cmd_line);
 173         str = opal_show_help_string("help-orte-info.txt", "usage", true,
 174                                     usage);
 175         if (NULL != str) {
 176             printf("%s", str);
 177             free(str);
 178         }
 179         free(usage);
 180     }
 181     if (cmd_error || want_help) {
 182         mca_base_close();
 183         OBJ_RELEASE(orte_info_cmd_line);
 184         opal_finalize_util();
 185         exit(cmd_error ? 1 : 0);
 186     }
 187 
 188     mca_base_cmd_line_process_args(orte_info_cmd_line, &app_env, &global_env);
 189 
 190     /* putenv() all the stuff that we got back from env (in case the
 191      * user specified some --mca params on the command line).  This
 192      * creates a memory leak, but that's unfortunately how putenv()
 193      * works.  :-(
 194      */
 195 
 196     len = opal_argv_count(app_env);
 197     for (i = 0; i < len; ++i) {
 198         putenv(app_env[i]);
 199     }
 200     len = opal_argv_count(global_env);
 201     for (i = 0; i < len; ++i) {
 202         putenv(global_env[i]);
 203     }
 204 
 205     /* setup the mca_types array */
 206     OBJ_CONSTRUCT(&mca_types, opal_pointer_array_t);
 207     opal_pointer_array_init(&mca_types, 256, INT_MAX, 128);
 208 
 209     opal_info_register_types(&mca_types);
 210     orte_info_register_types(&mca_types);
 211 
 212     /* Execute the desired action(s) */
 213 
 214     if (opal_cmd_line_is_taken(orte_info_cmd_line, "orte_info_pretty")) {
 215         orte_info_pretty = true;
 216     } else if (opal_cmd_line_is_taken(orte_info_cmd_line, "parsable") || opal_cmd_line_is_taken(orte_info_cmd_line, "parseable")) {
 217         orte_info_pretty = false;
 218     }
 219 
 220     want_all = opal_cmd_line_is_taken(orte_info_cmd_line, "all");
 221     if (want_all || opal_cmd_line_is_taken(orte_info_cmd_line, "version")) {
 222         orte_info_do_version(want_all, orte_info_cmd_line);
 223         acted = true;
 224     }
 225     if (want_all || opal_cmd_line_is_taken(orte_info_cmd_line, "path")) {
 226         orte_info_do_path(want_all, orte_info_cmd_line);
 227         acted = true;
 228     }
 229     if (want_all || opal_cmd_line_is_taken(orte_info_cmd_line, "arch")) {
 230         orte_info_do_arch();
 231         acted = true;
 232     }
 233     if (want_all || opal_cmd_line_is_taken(orte_info_cmd_line, "hostname")) {
 234         orte_info_do_hostname();
 235         acted = true;
 236     }
 237     if (want_all || opal_cmd_line_is_taken(orte_info_cmd_line, "config")) {
 238         orte_info_do_config(true);
 239         acted = true;
 240     }
 241     if (want_all || opal_cmd_line_is_taken(orte_info_cmd_line, "param")) {
 242         orte_info_do_params(want_all, opal_cmd_line_is_taken(orte_info_cmd_line, "internal"));
 243         acted = true;
 244     }
 245 
 246     /* If no command line args are specified, show default set */
 247 
 248     if (!acted) {
 249         orte_info_show_orte_version(orte_info_ver_full);
 250         orte_info_show_path(orte_info_path_prefix, opal_install_dirs.prefix);
 251         orte_info_do_arch();
 252         orte_info_do_hostname();
 253         orte_info_do_config(false);
 254         orte_info_components_open();
 255         for (i = 0; i < mca_types.size; ++i) {
 256             if (NULL == (str = (char*)opal_pointer_array_get_item(&mca_types, i))) {
 257                 continue;
 258             }
 259             orte_info_show_component_version(str, orte_info_component_all,
 260                                              orte_info_ver_full, orte_info_type_all);
 261         }
 262     }
 263 
 264     /* All done */
 265 
 266     if (NULL != app_env) {
 267         opal_argv_free(app_env);
 268     }
 269     if (NULL != global_env) {
 270         opal_argv_free(global_env);
 271     }
 272     orte_info_components_close ();
 273     OBJ_RELEASE(orte_info_cmd_line);
 274     OBJ_DESTRUCT(&mca_types);
 275     mca_base_close();
 276 
 277     opal_finalize_util();
 278 
 279     return 0;
 280 }

/* [<][>][^][v][top][bottom][index][help] */