* fix ompi_ifaddrtoname to return the correct error code (it was returning
OMPI_ERROR if it found something and OMPI_SUCCESS otherwise). Also look for INADDR_NONE instead of INADDR_ANY as the return from inet_addr() * add convinience function ompi_ifislocal to quickly test if a given hostname or IP address (in dotted-quad form) is a local address * don't ssh to the local machine, but fork() / exec() the bootproxy directly if ompi_ifislocal returns true *AND* there is no username specified for the given host * remove the llm hack to translate localhost -> local machine name This commit was SVN r3450.
Этот коммит содержится в:
родитель
4e67bf4646
Коммит
fc8a7868e7
@ -99,13 +99,7 @@ parse_line(int first, mca_llm_base_hostfile_node_t *node)
|
||||
int ret;
|
||||
|
||||
if (MCA_LLM_BASE_STRING == first) {
|
||||
/* don't allow localhost or 127.0.0.1 */
|
||||
if ((strncmp("localhost", mca_llm_base_string, strlen("localhost")) == 0) ||
|
||||
(strcmp("127.0.0.1", mca_llm_base_string) == 0)) {
|
||||
gethostname(node->hostname, MAXHOSTNAMELEN);
|
||||
} else {
|
||||
strncpy(node->hostname, mca_llm_base_string, MAXHOSTNAMELEN);
|
||||
}
|
||||
strncpy(node->hostname, mca_llm_base_string, MAXHOSTNAMELEN);
|
||||
node->given_count = 1;
|
||||
} else {
|
||||
parse_error();
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "mca/ns/base/base.h"
|
||||
#include "util/proc_info.h"
|
||||
#include "util/show_help.h"
|
||||
#include "util/if.h"
|
||||
|
||||
/*
|
||||
* Internal constants
|
||||
@ -306,7 +307,7 @@ internal_spawn_proc(mca_pcm_rsh_module_t *me,
|
||||
int cmdc = 0;
|
||||
char *printable = NULL;
|
||||
int stderr_is_error = me->ignore_stderr == 0 ? 1 : 0;
|
||||
char *username = NULL;
|
||||
char *start_username = NULL;
|
||||
int ret;
|
||||
pid_t pid;
|
||||
FILE *fp;
|
||||
@ -314,37 +315,43 @@ internal_spawn_proc(mca_pcm_rsh_module_t *me,
|
||||
int i;
|
||||
char *tmp;
|
||||
bool high_qos = (0 != (me->constraints & OMPI_RTE_SPAWN_HIGH_QOS));
|
||||
bool is_local;
|
||||
|
||||
start_node = (mca_llm_base_hostfile_node_t*) ompi_list_get_first(hostlist);
|
||||
start_username = mca_pcm_base_get_username(start_node);
|
||||
|
||||
/*
|
||||
* Check to see if we need to do the .profile thing
|
||||
*/
|
||||
ret = internal_need_profile(me, start_node, stderr_is_error,
|
||||
&needs_profile);
|
||||
if (OMPI_SUCCESS != ret) {
|
||||
goto cleanup;
|
||||
}
|
||||
/* add all the startup stuff if needed */
|
||||
is_local = ompi_ifislocal(start_node->hostname) &&
|
||||
start_username == NULL;
|
||||
|
||||
if (!is_local) {
|
||||
/*
|
||||
* Check to see if we need to do the .profile thing
|
||||
*/
|
||||
ret = internal_need_profile(me, start_node, stderr_is_error,
|
||||
&needs_profile);
|
||||
if (OMPI_SUCCESS != ret) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/*
|
||||
* Build up start array
|
||||
*/
|
||||
/*
|
||||
* Build up start array
|
||||
*/
|
||||
|
||||
/* build up the rsh command part */
|
||||
cmdv = ompi_argv_split(me->rsh_agent, ' ');
|
||||
cmdc = ompi_argv_count(cmdv);
|
||||
/* build up the rsh command part */
|
||||
cmdv = ompi_argv_split(me->rsh_agent, ' ');
|
||||
cmdc = ompi_argv_count(cmdv);
|
||||
|
||||
ompi_argv_append(&cmdc, &cmdv, start_node->hostname);
|
||||
username = mca_pcm_base_get_username(start_node);
|
||||
if (NULL != username) {
|
||||
ompi_argv_append(&cmdc, &cmdv, "-l");
|
||||
ompi_argv_append(&cmdc, &cmdv, username);
|
||||
}
|
||||
ompi_argv_append(&cmdc, &cmdv, start_node->hostname);
|
||||
if (NULL != start_username) {
|
||||
ompi_argv_append(&cmdc, &cmdv, "-l");
|
||||
ompi_argv_append(&cmdc, &cmdv, start_username);
|
||||
}
|
||||
|
||||
/* add the start of .profile thing if required */
|
||||
if (needs_profile) {
|
||||
ompi_argv_append(&cmdc, &cmdv, "( ! [ -e ./.profile ] || . ./.profile;");
|
||||
/* add the start of .profile thing if required */
|
||||
if (needs_profile) {
|
||||
ompi_argv_append(&cmdc, &cmdv, "( ! [ -e ./.profile ] || . ./.profile;");
|
||||
}
|
||||
}
|
||||
|
||||
/* build the command to start */
|
||||
@ -374,7 +381,7 @@ internal_spawn_proc(mca_pcm_rsh_module_t *me,
|
||||
}
|
||||
|
||||
/* add the end of the .profile thing if required */
|
||||
if (needs_profile) {
|
||||
if (!is_local && needs_profile) {
|
||||
ompi_argv_append(&cmdc, &cmdv, ")");
|
||||
}
|
||||
|
||||
@ -464,7 +471,7 @@ proc_cleanup:
|
||||
/* free up everything we used on the way */
|
||||
if (NULL != printable) free(printable);
|
||||
if (NULL != cmd0) free(cmd0);
|
||||
if (NULL != username) free(username);
|
||||
if (NULL != start_username) free(start_username);
|
||||
ompi_argv_free(cmdv);
|
||||
cmdv = NULL;
|
||||
cmdc = 0;
|
||||
|
@ -365,11 +365,11 @@ int ompi_ifaddrtoname(const char* if_addr, char* if_name, int length)
|
||||
if(rc != OMPI_SUCCESS)
|
||||
return rc;
|
||||
|
||||
if(inaddr == INADDR_ANY) {
|
||||
if(inaddr == INADDR_NONE) {
|
||||
h = gethostbyname(if_addr);
|
||||
if(h == 0) {
|
||||
ompi_output(0,"ompi_ifaddrtoname: unable to resolve %s\n", if_addr);
|
||||
return OMPI_ERROR;
|
||||
return OMPI_ERR_NOT_FOUND;
|
||||
}
|
||||
memcpy(&inaddr, h->h_addr, sizeof(inaddr));
|
||||
}
|
||||
@ -379,10 +379,10 @@ int ompi_ifaddrtoname(const char* if_addr, char* if_name, int length)
|
||||
intf = (ompi_if_t*)ompi_list_get_next(intf)) {
|
||||
if(intf->if_addr.sin_addr.s_addr == inaddr) {
|
||||
strncpy(if_name, intf->if_name, length);
|
||||
return OMPI_ERROR;
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
}
|
||||
return OMPI_SUCCESS;
|
||||
return OMPI_ERR_NOT_FOUND;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -516,3 +516,17 @@ int ompi_ifindextoname(int if_index, char* if_name, int length)
|
||||
}
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
ompi_ifislocal(char *hostname)
|
||||
{
|
||||
const int len = 100;
|
||||
char addrname[len - 1];
|
||||
int ret;
|
||||
|
||||
ret = ompi_ifaddrtoname(hostname, addrname, len);
|
||||
if (OMPI_SUCCESS == ret) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -88,6 +88,15 @@ OMPI_DECLSPEC int ompi_ifindextoaddr(int if_index, struct sockaddr*, int);
|
||||
* @param size (IN) Interface address buffer size
|
||||
*/
|
||||
OMPI_DECLSPEC int ompi_ifindextomask(int if_index, struct sockaddr*, int);
|
||||
|
||||
/**
|
||||
* Determine if given hostname / IP address is a local address
|
||||
*
|
||||
* @param hostname (IN) Hostname (or stringified IP address)
|
||||
* @return true if \c hostname is local, false otherwise
|
||||
*/
|
||||
OMPI_DECLSPEC bool ompi_ifislocal(char *hostname);
|
||||
|
||||
#if defined(c_plusplus) || defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
@ -7,6 +7,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/test/support -DOMPI_ENABLE_DEBUG_OVERRIDE=1 -g
|
||||
|
||||
noinst_PROGRAMS = \
|
||||
ompi_numtostr \
|
||||
ompi_if \
|
||||
ompi_pack \
|
||||
ompi_os_path \
|
||||
ompi_sys_info \
|
||||
@ -20,6 +21,12 @@ ompi_numtostr_LDADD = \
|
||||
$(top_builddir)/test/support/libsupport.la
|
||||
ompi_numtostr_DEPENDENCIES = $(ompi_numtostr_LDADD)
|
||||
|
||||
ompi_if_SOURCES = ompi_if.c
|
||||
ompi_if_LDADD = \
|
||||
$(top_builddir)/src/libmpi.la \
|
||||
$(top_builddir)/test/support/libsupport.la
|
||||
ompi_if_DEPENDENCIES = $(ompi_if_LDADD)
|
||||
|
||||
ompi_argv_SOURCES = ompi_argv.c
|
||||
ompi_argv_LDADD = \
|
||||
$(top_builddir)/src/libmpi.la \
|
||||
|
115
test/util/ompi_if.c
Обычный файл
115
test/util/ompi_if.c
Обычный файл
@ -0,0 +1,115 @@
|
||||
/*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#include "ompi_config.h"
|
||||
|
||||
#if 0
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#ifdef HAVE_SYS_PARAM_H
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "runtime/runtime.h"
|
||||
#include "util/if.h"
|
||||
#include "support.h"
|
||||
#include "util/bufpack.h"
|
||||
#include "include/constants.h"
|
||||
|
||||
|
||||
static bool
|
||||
test_ifaddrtoname(char *addr)
|
||||
{
|
||||
int ret;
|
||||
char addrname[100];
|
||||
int len = 99;
|
||||
|
||||
ret = ompi_ifaddrtoname(addr, addrname, len);
|
||||
|
||||
if (ret == OMPI_SUCCESS) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
char hostname[MAXHOSTNAMELEN];
|
||||
|
||||
ompi_init(argc, argv);
|
||||
test_init("ompi_if");
|
||||
|
||||
/* 127.0.0.1 */
|
||||
if (test_ifaddrtoname("127.0.0.1")) {
|
||||
test_success();
|
||||
} else {
|
||||
test_failure("ifaddrtoname test failed for 127.0.0.1");
|
||||
}
|
||||
if (ompi_ifislocal("127.0.0.1")) {
|
||||
test_success();
|
||||
} else {
|
||||
test_failure("ifislocal test failed for 127.0.0.1");
|
||||
}
|
||||
|
||||
/* localhost */
|
||||
if (test_ifaddrtoname("localhost")) {
|
||||
test_success();
|
||||
} else {
|
||||
test_failure("ifaddrtoname test failed for localhost");
|
||||
}
|
||||
if (ompi_ifislocal("localhost")) {
|
||||
test_success();
|
||||
} else {
|
||||
test_failure("ifislocal test failed for localhost");
|
||||
}
|
||||
|
||||
/* 0.0.0.0 */
|
||||
if (test_ifaddrtoname("0.0.0.0")) {
|
||||
test_failure("ifaddrtoname test failed for 0.0.0.0");
|
||||
} else {
|
||||
test_success();
|
||||
}
|
||||
if (ompi_ifislocal("0.0.0.0")) {
|
||||
test_failure("ompi_ifislocal test failed for 0.0.0.0");
|
||||
} else {
|
||||
test_success();
|
||||
}
|
||||
|
||||
/* foo.example.com */
|
||||
if (test_ifaddrtoname("foo.example.com")) {
|
||||
test_failure("ifaddrtoname test failed for foo.example.com");
|
||||
} else {
|
||||
test_success();
|
||||
}
|
||||
if (ompi_ifislocal("foo.example.com")) {
|
||||
test_failure("ifislocal test failed for foo.example.com");
|
||||
} else {
|
||||
test_success();
|
||||
}
|
||||
|
||||
/* local host name */
|
||||
gethostname(hostname, MAXHOSTNAMELEN);
|
||||
if (test_ifaddrtoname(hostname)) {
|
||||
test_success();
|
||||
} else {
|
||||
test_failure("ifaddrtoname test failed for local host name");
|
||||
}
|
||||
if (ompi_ifislocal(hostname)) {
|
||||
test_success();
|
||||
} else {
|
||||
test_failure("ifislocal test failed for local host name");
|
||||
}
|
||||
|
||||
test_finalize();
|
||||
ompi_finalize();
|
||||
|
||||
return 0;
|
||||
}
|
Загрузка…
Ссылка в новой задаче
Block a user