1
1
openmpi/opal/mca/installdirs/autodetect/opal_installdirs_solaris.c
Iain Bason 2250be582d Added autodetect installdirs component. Currently supports Solaris and Linux.
* Installation directories will be inferred from the actual location
  of the shared library that contains the component.

* OPAL_PREFIX and other environment variables allow users to override
  the inferred directories.  They should no longer be necessary in
  most cases, though.

* Any directories that cannot be inferred will fall back to whatever
  is provided by the config installdirs component.

This commit was SVN r21723.
2009-07-21 20:19:38 +00:00

92 строки
2.0 KiB
C

/* -*- Mode: C; c-basic-offset:4 ; -*- */
/*
* Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*
* Read /proc/<pid>/map and /proc/<pid>/path to find the file mapped
* into the process over the given address.
*/
#include "opal_config.h"
#include "opal_stdint.h"
#include "opal/constants.h"
#include <procfs.h>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
const char *
opal_installdirs_autodetect_path(uintptr_t my_addr)
{
pid_t my_pid;
char *map_path;
prmap_t map;
int map_fd;
char *obj_name;
ssize_t path_size, ls;
char *path;
my_pid = getpid();
asprintf(&map_path, "/proc/%d/map", my_pid);
if (NULL == map_path) {
return NULL;
}
map_fd = open(map_path, O_RDONLY);
free(map_path);
if (map_fd < 0) {
return NULL;
}
for (;;) {
if (read(map_fd, &map, sizeof(map)) < sizeof(map)) {
return OPAL_ERR_NOT_FOUND;
}
if (map.pr_vaddr <= my_addr && map.pr_vaddr + map.pr_size > my_addr) {
break;
}
}
close(map_fd);
asprintf(&obj_name, "/proc/%d/path/%s", my_pid, map.pr_mapname);
if (NULL == obj_name) {
return NULL;
}
/*
We don't know how long the path to the load object might be.
Try allocating a reasonable length. If the readlink system
call doesn't use the entire buffer passed to it then we know
the path is complete.
*/
for (path_size = 100; ; path_size += 100) {
path = malloc(path_size);
if (NULL == path) {
free(obj_name);
return OPAL_ERR_OUT_OF_RESOURCE;
}
ls = readlink(obj_name, path, path_size);
if (ls < 0) {
free(obj_name);
free(path);
return OPAL_ERR_NOT_FOUND;
}
if (ls < path_size) {
path[ls] = '\0';
break;
}
free(path);
}
free(obj_name);
return path;
}