1
1
openmpi/opal/mca/installdirs/windows/opal_installdirs_windows.c
Shiqing Fan 2f442799f8 fix several typecasts
This commit was SVN r26957.
2012-08-07 10:41:53 +00:00

149 строки
5.0 KiB
C

/*
* Copyright (c) 2004-2007 The Trustees of the University of Tennessee.
* All rights reserved.
* Copyright (c) 2009 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "opal_config.h"
#include <stdlib.h>
#include <string.h>
#include "opal/mca/installdirs/installdirs.h"
#include "opal/constants.h"
static int installdirs_windows_open(void);
opal_installdirs_base_component_t mca_installdirs_windows_component = {
/* First, the mca_component_t struct containing meta information
about the component itself */
{
OPAL_INSTALLDIRS_BASE_VERSION_2_0_0,
/* Component name and version */
"windows",
OPAL_MAJOR_VERSION,
OPAL_MINOR_VERSION,
OPAL_RELEASE_VERSION,
/* Component open and close functions */
installdirs_windows_open,
NULL
},
{
/* This component is checkpointable */
MCA_BASE_METADATA_PARAM_CHECKPOINT
},
};
char *openmpi_home = NULL;
#define SET_FIELD(field, base_dir) \
do { \
if (NULL != openmpi_home && 0 != strlen(openmpi_home)) { \
char *path = \
(char *) malloc(strlen(openmpi_home) + strlen(base_dir) + 1); \
strcpy(path, openmpi_home); \
strcat(path, base_dir); \
mca_installdirs_windows_component.install_dirs_data.field = path; \
} \
} while (0)
static int
installdirs_windows_open(void)
{
/* check the env first */
openmpi_home = getenv("OPENMPI_HOME");
/* if OPENMPI_HOME is not set, check the registry */
if(NULL == openmpi_home) {
HKEY ompi_key;
int i;
DWORD cbData, valueLength, keyType;
char valueName[1024], vData[1024];
/* The OPENMPI_HOME is the only one which is required to be in the registry.
* All others can be composed starting from OPAL_PREFIX.
*
* On 32 bit Windows, we write in HKEY_LOCAL_MACHINE\Software\Open MPI,
* but on 64 bit Windows, we always use HKEY_LOCAL_MACHINE\Software\Wow6432Node\Open MPI
* for both 32 and 64 bit OMPI, because we only have 32 bit installer, and Windows will
* always consider OMPI as 32 bit application.
*/
if( ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Open MPI", 0, KEY_READ, &ompi_key) ||
ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Wow6432Node\\Open MPI", 0, KEY_READ, &ompi_key) ) {
for( i = 0; true; i++) {
valueLength = 1024;
valueName[0] = '\0';
cbData = 1024;
valueLength = 1024;
if( ERROR_SUCCESS == RegEnumValue( (ompi_key), i, valueName, &valueLength,
NULL, &keyType, (LPBYTE) vData, &cbData ) ) {
if( ((REG_EXPAND_SZ == keyType) || (REG_SZ == keyType)) &&
(0 == strncasecmp( valueName, ("OPENMPI_HOME"), strlen(("OPENMPI_HOME")) )) ) {
openmpi_home = strdup(vData);
break;
}
} else
break;
}
}
RegCloseKey(ompi_key);
}
#if OMPI_RELEASE_BUILD
/* the last try, check the executable path.
* only used for binary releases, so that we
* don't bother with the configured paths in mca_installdirs_config
*/
if(NULL == openmpi_home) {
int ch, i;
static TCHAR szPath[MAX_PATH+1];
szPath[MAX_PATH] = 0;
ch = GetModuleFileName(NULL, szPath, MAX_PATH);
if (ch != 0) {
for (i=ch; i>0; i--) {
if ((szPath[i] != '\\') && (szPath[i] != '/')) {
szPath[i] = 0;
} else {
szPath[i] = 0;
break;
}
}
strcat(szPath, "/..");
openmpi_home = szPath;
}
}
#endif
SET_FIELD(prefix, "");
SET_FIELD(exec_prefix, "/bin");
SET_FIELD(bindir, "/bin");
SET_FIELD(sbindir, "/sbin");
SET_FIELD(libexecdir, "/libexec");
SET_FIELD(datarootdir, "/share");
SET_FIELD(datadir, "/share");
SET_FIELD(sysconfdir, "/etc");
SET_FIELD(sharedstatedir, "/com");
SET_FIELD(localstatedir, "/var");
SET_FIELD(libdir, "/lib");
SET_FIELD(includedir, "/include");
SET_FIELD(infodir, "/share/info");
SET_FIELD(mandir, "/share/man");
SET_FIELD(pkgdatadir, "/share/openmpi");
SET_FIELD(pkglibdir, "/lib/openmpi");
SET_FIELD(pkgincludedir, "/include/openmpi");
return OPAL_SUCCESS;
}