2004-01-18 02:07:40 +03:00
/*
2005-11-05 22:57:48 +03:00
* Copyright ( c ) 2004 - 2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation . All rights reserved .
* Copyright ( c ) 2004 - 2005 The University of Tennessee and The University
* of Tennessee Research Foundation . All rights
* reserved .
2004-11-28 23:09:25 +03:00
* Copyright ( c ) 2004 - 2005 High Performance Computing Center Stuttgart ,
* University of Stuttgart . All rights reserved .
2005-03-24 15:43:37 +03:00
* Copyright ( c ) 2004 - 2005 The Regents of the University of California .
* All rights reserved .
2014-09-13 02:21:30 +04:00
* Copyright ( c ) 2014 Intel , Inc . All rights reserved .
2015-02-12 23:36:52 +03:00
* Copyright ( c ) 2014 - 2015 Cisco Systems , Inc . All rights reserved .
2004-11-22 04:38:40 +03:00
* $ COPYRIGHT $
*
* Additional copyrights may follow
*
2004-01-18 02:07:40 +03:00
* $ HEADER $
*/
2006-02-12 04:33:29 +03:00
# include "opal_config.h"
2004-01-18 02:07:40 +03:00
# include <stdio.h>
# include <string.h>
2005-07-04 04:13:44 +04:00
# include "opal/util/cmd_line.h"
# include "opal/util/argv.h"
2005-07-04 05:36:20 +04:00
# include "opal/util/opal_environ.h"
2014-09-13 02:21:30 +04:00
# include "opal/util/show_help.h"
2005-08-13 00:46:25 +04:00
# include "opal/mca/base/base.h"
2006-02-12 04:33:29 +03:00
# include "opal/constants.h"
2004-01-18 02:07:40 +03:00
/*
* Private variables
*/
2005-08-08 20:42:28 +04:00
/*
* Private functions
*/
static int process_arg ( const char * param , const char * value ,
char * * * params , char * * * values ) ;
static void add_to_env ( char * * params , char * * values , char * * * env ) ;
2004-01-18 02:07:40 +03:00
/*
* Add - mca to the possible command line options list
*/
2005-07-04 04:13:44 +04:00
int mca_base_cmd_line_setup ( opal_cmd_line_t * cmd )
2004-01-18 02:07:40 +03:00
{
2007-03-01 16:39:20 +03:00
int ret = OPAL_SUCCESS ;
2014-10-23 00:56:37 +04:00
ret = opal_cmd_line_make_opt3 ( cmd , ' \0 ' , OPAL_MCA_CMD_LINE_ID , OPAL_MCA_CMD_LINE_ID , 2 ,
" Pass context-specific MCA parameters; they are considered global if --g " OPAL_MCA_CMD_LINE_ID " is not used and only one context is specified (arg0 is the parameter name; arg1 is the parameter value) " ) ;
2006-02-12 04:33:29 +03:00
if ( OPAL_SUCCESS ! = ret ) {
2005-08-08 20:42:28 +04:00
return ret ;
}
2014-10-23 00:56:37 +04:00
ret = opal_cmd_line_make_opt3 ( cmd , ' \0 ' , " g " OPAL_MCA_CMD_LINE_ID , " g " OPAL_MCA_CMD_LINE_ID , 2 ,
2005-08-08 20:42:28 +04:00
" Pass global MCA parameters that are applicable to all contexts (arg0 is the parameter name; arg1 is the parameter value) " ) ;
2007-03-01 16:39:20 +03:00
if ( OPAL_SUCCESS ! = ret ) {
return ret ;
}
{
opal_cmd_line_init_t entry =
2012-10-30 23:45:18 +04:00
{ " mca_base_param_file_prefix " , ' \0 ' , " am " , NULL , 1 ,
2007-03-01 16:39:20 +03:00
NULL , OPAL_CMD_LINE_TYPE_STRING ,
" Aggregate MCA parameter set file list "
} ;
ret = opal_cmd_line_make_opt_mca ( cmd , entry ) ;
if ( OPAL_SUCCESS ! = ret ) {
return ret ;
}
}
2005-08-08 20:42:28 +04:00
return ret ;
2004-01-18 02:07:40 +03:00
}
/*
* Look for and handle any - mca options on the command line
*/
2005-07-04 04:13:44 +04:00
int mca_base_cmd_line_process_args ( opal_cmd_line_t * cmd ,
2005-08-08 20:42:28 +04:00
char * * * context_env , char * * * global_env )
2004-01-18 02:07:40 +03:00
{
2014-09-13 02:21:30 +04:00
int i , num_insts , rc ;
char * * params ;
char * * values ;
/* If no relevant parameters were given, just return */
2014-10-23 00:56:37 +04:00
if ( ! opal_cmd_line_is_taken ( cmd , OPAL_MCA_CMD_LINE_ID ) & &
! opal_cmd_line_is_taken ( cmd , " g " OPAL_MCA_CMD_LINE_ID ) ) {
2014-09-13 02:21:30 +04:00
return OPAL_SUCCESS ;
}
/* Handle app context-specific parameters */
2014-10-23 00:56:37 +04:00
num_insts = opal_cmd_line_get_ninsts ( cmd , OPAL_MCA_CMD_LINE_ID ) ;
2014-09-13 02:21:30 +04:00
params = values = NULL ;
for ( i = 0 ; i < num_insts ; + + i ) {
2014-10-23 00:56:37 +04:00
if ( OPAL_SUCCESS ! = ( rc = process_arg ( opal_cmd_line_get_param ( cmd , OPAL_MCA_CMD_LINE_ID , i , 0 ) ,
opal_cmd_line_get_param ( cmd , OPAL_MCA_CMD_LINE_ID , i , 1 ) ,
2014-09-13 02:21:30 +04:00
& params , & values ) ) ) {
return rc ;
}
}
if ( NULL ! = params ) {
add_to_env ( params , values , context_env ) ;
opal_argv_free ( params ) ;
opal_argv_free ( values ) ;
}
/* Handle global parameters */
2014-10-23 00:56:37 +04:00
num_insts = opal_cmd_line_get_ninsts ( cmd , " g " OPAL_MCA_CMD_LINE_ID ) ;
2014-09-13 02:21:30 +04:00
params = values = NULL ;
for ( i = 0 ; i < num_insts ; + + i ) {
2014-10-23 00:56:37 +04:00
if ( OPAL_SUCCESS ! = ( rc = process_arg ( opal_cmd_line_get_param ( cmd , " g " OPAL_MCA_CMD_LINE_ID , i , 0 ) ,
opal_cmd_line_get_param ( cmd , " g " OPAL_MCA_CMD_LINE_ID , i , 1 ) ,
2014-09-13 02:21:30 +04:00
& params , & values ) ) ) {
return rc ;
}
}
if ( NULL ! = params ) {
add_to_env ( params , values , global_env ) ;
opal_argv_free ( params ) ;
opal_argv_free ( values ) ;
}
/* All done */
return OPAL_SUCCESS ;
2004-01-18 02:07:40 +03:00
}
/*
2005-08-08 20:42:28 +04:00
* Process a single MCA argument .
2004-01-18 02:07:40 +03:00
*/
2007-02-16 21:17:50 +03:00
static int process_arg ( const char * param , const char * value ,
2005-08-08 20:42:28 +04:00
char * * * params , char * * * values )
2004-01-18 02:07:40 +03:00
{
2005-08-08 20:42:28 +04:00
int i ;
2014-09-09 00:38:46 +04:00
char * p1 ;
/* check for quoted value */
if ( ' \" ' = = value [ 0 ] & & ' \" ' = = value [ strlen ( value ) - 1 ] ) {
p1 = strdup ( & value [ 1 ] ) ;
p1 [ strlen ( p1 ) - 1 ] = ' \0 ' ;
} else {
p1 = strdup ( value ) ;
}
2005-08-08 20:42:28 +04:00
/* Look to see if we've already got an -mca argument for the same
param . Check against the list of MCA param ' s that we ' ve
2014-09-13 02:21:30 +04:00
already saved arguments for - if found , return an error . */
2005-08-08 20:42:28 +04:00
for ( i = 0 ; NULL ! = * params & & NULL ! = ( * params ) [ i ] ; + + i ) {
if ( 0 = = strcmp ( param , ( * params ) [ i ] ) ) {
2014-09-13 02:21:30 +04:00
/* cannot use show_help here as it may not get out prior
* to the process exiting */
fprintf ( stderr ,
" --------------------------------------------------------------------------- \n "
2014-11-12 19:40:17 +03:00
" The following MCA parameter has been listed multiple times on the \n "
" command line: \n \n "
2014-09-13 02:21:30 +04:00
" MCA param: %s \n \n "
2014-11-12 19:40:17 +03:00
" MCA parameters can only be listed once on a command line to ensure there \n "
" is no ambiguity as to its value. Please correct the situation and \n "
2014-09-13 02:21:30 +04:00
" try again. \n "
" --------------------------------------------------------------------------- \n " ,
param ) ;
2015-02-12 23:36:52 +03:00
free ( p1 ) ;
2014-09-13 02:21:30 +04:00
return OPAL_ERROR ;
2005-08-08 20:42:28 +04:00
}
}
2004-01-18 02:07:40 +03:00
2005-08-08 20:42:28 +04:00
/* If we didn't already have an value for the same param, save
this one away */
opal_argv_append_nosize ( params , param ) ;
2014-09-09 00:38:46 +04:00
opal_argv_append_nosize ( values , p1 ) ;
free ( p1 ) ;
2004-01-18 02:07:40 +03:00
2006-02-12 04:33:29 +03:00
return OPAL_SUCCESS ;
2005-08-08 20:42:28 +04:00
}
2004-01-18 02:07:40 +03:00
2005-08-08 20:42:28 +04:00
static void add_to_env ( char * * params , char * * values , char * * * env )
{
int i ;
char * name ;
2004-01-18 02:07:40 +03:00
2005-08-08 20:42:28 +04:00
/* Loop through all the args that we've gotten and make env
2014-10-23 00:56:37 +04:00
vars of the form OPAL_MCA_PREFIX * = value . */
2005-08-08 20:42:28 +04:00
for ( i = 0 ; NULL ! = params & & NULL ! = params [ i ] ; + + i ) {
2013-03-28 01:09:41 +04:00
( void ) mca_base_var_env_name ( params [ i ] , & name ) ;
2005-08-08 20:42:28 +04:00
opal_setenv ( name , values [ i ] , true , env ) ;
free ( name ) ;
}
2004-01-18 02:07:40 +03:00
}
2014-09-09 00:38:46 +04:00
void mca_base_cmd_line_wrap_args ( char * * args )
{
int i ;
char * tstr ;
for ( i = 0 ; NULL ! = args & & NULL ! = args [ i ] ; i + + ) {
2014-10-23 00:56:37 +04:00
if ( 0 = = strcmp ( args [ i ] , " - " OPAL_MCA_CMD_LINE_ID ) | |
0 = = strcmp ( args [ i ] , " -- " OPAL_MCA_CMD_LINE_ID ) ) {
2014-09-13 06:23:30 +04:00
if ( NULL = = args [ i + 1 ] | | NULL = = args [ i + 2 ] ) {
/* this should be impossible as the error would
* have been detected well before here , but just
* be safe */
return ;
}
2014-09-09 00:38:46 +04:00
i + = 2 ;
asprintf ( & tstr , " \" %s \" " , args [ i ] ) ;
free ( args [ i ] ) ;
args [ i ] = tstr ;
}
}
}