diff --git a/config/opal_configure_options.m4 b/config/opal_configure_options.m4 index 4a01c7a65d..9c83ba69d5 100644 --- a/config/opal_configure_options.m4 +++ b/config/opal_configure_options.m4 @@ -464,4 +464,19 @@ AC_ARG_WITH([libltdl], AC_DEFINE_UNQUOTED([OPAL_ENABLE_CRDEBUG], [0], [Whether we want checkpoint/restart enabled debugging functionality or not]) +# some systems don't want/like getpwuid +AC_MSG_CHECKING([if want getpwuid support]) +AC_ARG_ENABLE([getpwuid], + [AC_HELP_STRING([--disable-getpwuid], + [Disable getpwuid support (default: enabled)])]) +if test "$enable_getpwuid" = "no"; then + AC_MSG_RESULT([no]) + opal_want_getpwuid=0 +else + AC_MSG_RESULT([yes]) + opal_want_getpwuid=1 +fi +AC_DEFINE_UNQUOTED([OPAL_ENABLE_GETPWUID], [$opal_want_getpwuid], + [Disable getpwuid support (default: enabled)]) + ])dnl diff --git a/orte/mca/plm/rsh/plm_rsh_module.c b/orte/mca/plm/rsh/plm_rsh_module.c index e1b1ee74ee..9131cd3f45 100644 --- a/orte/mca/plm/rsh/plm_rsh_module.c +++ b/orte/mca/plm/rsh/plm_rsh_module.c @@ -1492,26 +1492,32 @@ static int setup_shell(orte_plm_rsh_shell_t *rshell, char *nodename, int *argc, char ***argv) { orte_plm_rsh_shell_t remote_shell, local_shell; - struct passwd *p; char *param; int rc; - + /* What is our local shell? */ local_shell = ORTE_PLM_RSH_SHELL_UNKNOWN; - p = getpwuid(getuid()); - if( NULL == p ) { - /* This user is unknown to the system. Therefore, there is no reason we - * spawn whatsoever in his name. Give up with a HUGE error message. - */ - orte_show_help( "help-plm-rsh.txt", "unknown-user", true, (int)getuid() ); - return ORTE_ERR_FATAL; + +#if OPAL_ENABLE_GETPWUID + { + struct passwd *p; + + p = getpwuid(getuid()); + if( NULL == p ) { + /* This user is unknown to the system. Therefore, there is no reason we + * spawn whatsoever in his name. Give up with a HUGE error message. + */ + orte_show_help( "help-plm-rsh.txt", "unknown-user", true, (int)getuid() ); + return ORTE_ERR_FATAL; + } + param = p->pw_shell; + local_shell = find_shell(p->pw_shell); } - param = p->pw_shell; - local_shell = find_shell(p->pw_shell); - +#endif + /* If we didn't find it in getpwuid(), try looking at the $SHELL - environment variable (see https://svn.open-mpi.org/trac/ompi/ticket/1060) - */ + environment variable (see https://svn.open-mpi.org/trac/ompi/ticket/1060) + */ if (ORTE_PLM_RSH_SHELL_UNKNOWN == local_shell && NULL != (param = getenv("SHELL"))) { local_shell = find_shell(param); @@ -1554,12 +1560,12 @@ static int setup_shell(orte_plm_rsh_shell_t *rshell, remote_shell, orte_plm_rsh_shell_name[remote_shell])); /* Do we need to source .profile on the remote side? - - sh: yes (see bash(1)) - - ksh: yes (see ksh(1)) - - bash: no (see bash(1)) - - [t]csh: no (see csh(1) and tcsh(1)) - - zsh: no (see http://zsh.sourceforge.net/FAQ/zshfaq03.html#l19) - */ + - sh: yes (see bash(1)) + - ksh: yes (see ksh(1)) + - bash: no (see bash(1)) + - [t]csh: no (see csh(1) and tcsh(1)) + - zsh: no (see http://zsh.sourceforge.net/FAQ/zshfaq03.html#l19) + */ if (ORTE_PLM_RSH_SHELL_SH == remote_shell || ORTE_PLM_RSH_SHELL_KSH == remote_shell) { diff --git a/orte/tools/orte-clean/orte-clean.c b/orte/tools/orte-clean/orte-clean.c index 69512a8a30..b31d2fa833 100644 --- a/orte/tools/orte-clean/orte-clean.c +++ b/orte/tools/orte-clean/orte-clean.c @@ -62,6 +62,7 @@ #include "opal/util/show_help.h" #include "orte/util/proc_info.h" +#include "orte/util/show_help.h" #include "opal/runtime/opal.h" #if OPAL_ENABLE_FT_CR == 1 @@ -268,7 +269,6 @@ void kill_procs(void) { char *inputline; char *this_user; int uid; - struct passwd *pwdent; char *separator = " \t"; /* output can be delimited by space or tab */ /* @@ -303,18 +303,31 @@ void kill_procs(void) { /* get the name of the user */ uid = getuid(); +#if OPAL_ENABLE_GETPWUID + { + struct passwd *pwdent; + #ifdef HAVE_GETPWUID - pwdent = getpwuid(uid); + pwdent = getpwuid(uid); + if (NULL == pwdent) { + /* this indicates a problem with the passwd system, + * so pretty-print a message just for info + */ + orte_show_help("help-orte-runtime.txt", + "orte:session:dir:nopwname", true); + } #else - pwdent = NULL; + pwdent = NULL; #endif - if (NULL != pwdent) { - this_user = strdup(pwdent->pw_name); - } else { - if (0 > asprintf(&this_user, "%d", uid)) { - return; + if (NULL != pwdent) { + this_user = strdup(pwdent->pw_name); + } else { + asprintf(&this_user, "%d", uid); } } +#else + asprintf(&this_user, "%d", uid); +#endif /* * There is a race condition here. The problem is that we are looking diff --git a/orte/util/session_dir.c b/orte/util/session_dir.c index 2e64a7cc45..cc801b4b14 100644 --- a/orte/util/session_dir.c +++ b/orte/util/session_dir.c @@ -132,23 +132,38 @@ orte_session_dir_get_name(char **fulldirpath, int exit_status = ORTE_SUCCESS; size_t len; int uid; - struct passwd *pwdent; /* Ensure that system info is set */ orte_proc_info(); - /* get the name of the user */ + /* get the name of the user */ uid = getuid(); +#if OPAL_ENABLE_GETPWUID + { + struct passwd *pwdent; + #ifdef HAVE_GETPWUID - pwdent = getpwuid(uid); + pwdent = getpwuid(uid); + if (NULL == pwdent) { + /* this indicates a problem with the passwd system, + * so pretty-print a message just for info + */ + orte_show_help("help-orte-runtime.txt", + "orte:session:dir:nopwname", true); + } #else - pwdent = NULL; + pwdent = NULL; #endif - if (NULL != pwdent) { - user = strdup(pwdent->pw_name); - } else { - asprintf(&user, "%d", uid); + if (NULL != pwdent) { + user = strdup(pwdent->pw_name); + } else { + asprintf(&user, "%d", uid); + } } +#else + asprintf(&user, "%d", uid); +#endif + /* * set the 'hostname' @@ -253,7 +268,7 @@ orte_session_dir_get_name(char **fulldirpath, } } /* If we were not given a proc at all, then we just set it to frontend - */ + */ else { sessions = strdup(frontend); /* must dup this to avoid double-free later */ }