Add support for /proc/curproc for FreeBSD

This commit is contained in:
rdb 2009-07-22 05:52:38 +00:00
parent ea3a9ffaa8
commit 961a754ec4
7 changed files with 58 additions and 29 deletions

View File

@ -84,9 +84,15 @@
#define GLOBAL_ARGV
#define GLOBAL_ARGC
// Can we read the file /proc/self/cmdline to determine our
// Can we read the file /proc/curproc/* to determine our
// command-line arguments at static init time?
#define HAVE_PROC_SELF_EXE
#define HAVE_PROC_SELF_MAPS
#define HAVE_PROC_SELF_ENVIRON
#define HAVE_PROC_SELF_CMDLINE
#define HAVE_PROC_CURPROC_FILE 1
#define HAVE_PROC_CURPROC_MAP 1
#define HAVE_PROC_CURPROC_CMDLINE 1
// Should we include <iostream> or <iostream.h>? Define HAVE_IOSTREAM
// to nonempty if we should use <iostream>, or empty if we should use

View File

@ -235,9 +235,12 @@
// Can we safely call getenv() at static init time?
#define STATIC_INIT_GETENV 1
// Can we read the file /proc/self/environ to determine our
// Can we read the files /proc/self/* to determine our
// environment variables at static init time?
#define HAVE_PROC_SELF_EXE 1
#define HAVE_PROC_SELF_MAPS 1
#define HAVE_PROC_SELF_ENVIRON 1
#define HAVE_PROC_SELF_CMDLINE 1
// Do we have a global pair of argc/argv variables that we can read at
// static init time? Should we prototype them? What are they called?
@ -246,10 +249,6 @@
#define GLOBAL_ARGV
#define GLOBAL_ARGC
// Can we read the file /proc/self/cmdline to determine our
// command-line arguments at static init time?
#define HAVE_PROC_SELF_CMDLINE 1
// Should we include <iostream> or <iostream.h>? Define HAVE_IOSTREAM
// to nonempty if we should use <iostream>, or empty if we should use
// <iostream.h>.

View File

@ -187,9 +187,12 @@
// Can we safely call getenv() at static init time?
#define STATIC_INIT_GETENV 1
// Can we read the file /proc/self/environ to determine our
// Can we read the file /proc/self/* to determine our
// environment variables at static init time?
#define HAVE_PROC_SELF_ENVIRON 1
#define HAVE_PROC_SELF_EXE
#define HAVE_PROC_SELF_MAPS
#define HAVE_PROC_SELF_ENVIRON
#define HAVE_PROC_SELF_CMDLINE
// Do we have a global pair of argc/argv variables that we can read at
// static init time? Should we prototype them? What are they called?
@ -198,10 +201,6 @@
#define GLOBAL_ARGV __Argv
#define GLOBAL_ARGC __Argc
// Can we read the file /proc/self/cmdline to determine our
// command-line arguments at static init time?
#define HAVE_PROC_SELF_CMDLINE
// Should we include <iostream> or <iostream.h>? Define HAVE_IOSTREAM
// to nonempty if we should use <iostream>, or empty if we should use
// <iostream.h>.

View File

@ -74,9 +74,12 @@
// Can we safely call getenv() at static init time?
#define STATIC_INIT_GETENV 1
// Can we read the file /proc/self/environ to determine our
// Can we read the file /proc/self/* to determine our
// environment variables at static init time?
#define HAVE_PROC_SELF_EXE
#define HAVE_PROC_SELF_MAPS
#define HAVE_PROC_SELF_ENVIRON
#define HAVE_PROC_SELF_CMDLINE
// Do we have a global pair of argc/argv variables that we can read at
// static init time? Should we prototype them? What are they called?
@ -85,10 +88,6 @@
#define GLOBAL_ARGV __argv
#define GLOBAL_ARGC __argc
// Can we read the file /proc/self/cmdline to determine our
// command-line arguments at static init time?
#define HAVE_PROC_SELF_CMDLINE
// Should we include <iostream> or <iostream.h>? Define HAVE_IOSTREAM
// to nonempty if we should use <iostream>, or empty if we should use
// <iostream.h>.

View File

@ -529,9 +529,15 @@ $[cdefine HAVE_IOS_BINARY]
/* Can we safely call getenv() at static init time? */
$[cdefine STATIC_INIT_GETENV]
/* Can we read the file /proc/self/environ to determine our
/* Can we read the file /proc/self/* to determine our
environment variables at static init time? */
$[cdefine HAVE_PROC_SELF_EXE]
$[cdefine HAVE_PROC_SELF_MAPS]
$[cdefine HAVE_PROC_SELF_ENVIRON]
$[cdefine HAVE_PROC_SELF_CMDLINE]
$[cdefine HAVE_PROC_CURPROC_FILE]
$[cdefine HAVE_PROC_CURPROC_MAP]
$[cdefine HAVE_PROC_CURPROC_CMDLINE]
/* Do we have a global pair of argc/argv variables that we can read at
static init time? Should we prototype them? What are they called? */
@ -540,10 +546,6 @@ $[cdefine PROTOTYPE_GLOBAL_ARGV]
$[cdefine GLOBAL_ARGV]
$[cdefine GLOBAL_ARGC]
/* Can we read the file /proc/self/cmdline to determine our
command-line arguments at static init time? */
$[cdefine HAVE_PROC_SELF_CMDLINE]
/* Define if you have the <io.h> header file. */
$[cdefine HAVE_IO_H]

View File

@ -460,10 +460,14 @@ read_args() {
}
#endif
#if defined(HAVE_PROC_SELF_MAPS)
#if defined(HAVE_PROC_SELF_MAPS) || defined(HAVE_PROC_CURPROC_MAP)
// This is how you tell whether or not libdtool.so is loaded,
// and if so, where it was loaded from.
#ifdef HAVE_PROC_CURPROC_MAP
pifstream maps("/proc/curproc/map");
#else
pifstream maps("/proc/self/maps");
#endif
while (!maps.fail() && !maps.eof()) {
char buffer[PATH_MAX];
buffer[0] = 0;
@ -502,11 +506,15 @@ read_args() {
}
#endif // WIN32_VC
#if defined(HAVE_PROC_SELF_EXE)
#if defined(HAVE_PROC_SELF_EXE) || defined(HAVE_PROC_CURPROC_FILE)
// This is more reliable than using (argc,argv), so it given precedence.
if (_binary_name.empty()) {
char readlinkbuf[PATH_MAX];
#ifdef HAVE_PROC_CURPROC_FILE
int pathlen = readlink("/proc/curproc/file",readlinkbuf,PATH_MAX-1);
#else
int pathlen = readlink("/proc/self/exe",readlinkbuf,PATH_MAX-1);
#endif
if (pathlen > 0) {
readlinkbuf[pathlen] = 0;
_binary_name = readlinkbuf;
@ -538,18 +546,26 @@ read_args() {
_args.push_back(GLOBAL_ARGV[i]);
}
#elif defined(HAVE_PROC_SELF_CMDLINE)
#elif defined(HAVE_PROC_SELF_CMDLINE) || defined(HAVE_PROC_CURPROC_CMDLINE)
// In Linux, and possibly in other systems as well, we might not be
// able to use the global ARGC/ARGV variables at static init time.
// However, we may be lucky and have a file called
// /proc/self/cmdline that may be read to determine all of our
// command-line arguments.
#ifdef HAVE_PROC_CURPROC_CMDLINE
pifstream proc("/proc/curproc/cmdline");
if (proc.fail()) {
cerr << "Cannot read /proc/curproc/cmdline; command-line arguments unavailable to config.\n";
return;
}
#else
pifstream proc("/proc/self/cmdline");
if (proc.fail()) {
cerr << "Cannot read /proc/self/cmdline; command-line arguments unavailable to config.\n";
return;
}
#endif
int ch = proc.get();
int index = 0;

View File

@ -994,6 +994,9 @@ DTOOL_CONFIG=[
("HAVE_PROC_SELF_MAPS", 'UNDEF', '1'),
("HAVE_PROC_SELF_ENVIRON", 'UNDEF', '1'),
("HAVE_PROC_SELF_CMDLINE", 'UNDEF', '1'),
("HAVE_PROC_CURPROC_FILE", 'UNDEF', 'UNDEF'),
("HAVE_PROC_CURPROC_MAP", 'UNDEF', 'UNDEF'),
("HAVE_PROC_SELF_CMDLINE", 'UNDEF', 'UNDEF'),
("HAVE_GLOBAL_ARGV", '1', 'UNDEF'),
("PROTOTYPE_GLOBAL_ARGV", 'UNDEF', 'UNDEF'),
("GLOBAL_ARGV", '__argv', 'UNDEF'),
@ -1112,6 +1115,12 @@ def WriteConfigSettings():
dtool_config["HAVE_CGGL"] = '1'
dtool_config["HAVE_CGDX9"] = '1'
if (not sys.platform.startswith("linux")):
dtool_config["HAVE_PROC_SELF_EXE"] = 'UNDEF'
dtool_config["HAVE_PROC_SELF_MAPS"] = 'UNDEF'
dtool_config["HAVE_PROC_SELF_CMDLINE"] = 'UNDEF'
dtool_config["HAVE_PROC_SELF_ENVIRON"] = 'UNDEF'
if (sys.platform == "darwin"):
dtool_config["PYTHON_FRAMEWORK"] = 'Python'
dtool_config["HAVE_MALLOC_H"] = 'UNDEF'
@ -1121,16 +1130,15 @@ def WriteConfigSettings():
dtool_config["HAVE_XF86DGA"] = 'UNDEF'
dtool_config["IS_LINUX"] = 'UNDEF'
dtool_config["IS_OSX"] = '1'
dtool_config["HAVE_PROC_SELF_EXE"] = 'UNDEF'
dtool_config["HAVE_PROC_SELF_MAPS"] = 'UNDEF'
dtool_config["HAVE_PROC_SELF_CMDLINE"] = 'UNDEF'
dtool_config["HAVE_PROC_SELF_ENVIRON"] = 'UNDEF'
if (sys.platform.startswith("freebsd")):
dtool_config["IS_LINUX"] = 'UNDEF'
dtool_config["IS_FREEBSD"] = '1'
dtool_config["HAVE_ALLOCA_H"] = 'UNDEF'
dtool_config["HAVE_MALLOC_H"] = 'UNDEF'
dtool_config["HAVE_PROC_CURPROC_FILE"] = '1'
dtool_config["HAVE_PROC_CURPROC_MAP"] = '1'
dtool_config["HAVE_PROC_CURPROC_CMDLINE"] = '1'
if (OPTIMIZE <= 3):
if (dtool_config["HAVE_NET"] != 'UNDEF'):