Browse Source

Add support for /proc/curproc for FreeBSD

rdb 16 years ago
parent
commit
961a754ec4

+ 7 - 1
dtool/Config.FreeBSD.pp

@@ -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

+ 4 - 5
dtool/Config.Linux.pp

@@ -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>.

+ 5 - 6
dtool/Config.OSX.pp

@@ -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>.

+ 4 - 5
dtool/Config.Win32.pp

@@ -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>.

+ 7 - 5
dtool/LocalSetup.pp

@@ -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]
 

+ 19 - 3
dtool/src/dtoolutil/executionEnvironment.cxx

@@ -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;

+ 12 - 4
makepanda/makepanda.py

@@ -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'):