Index: configure =================================================================== RCS file: /cvsroot/gnustep/gnustep/core/base/configure,v retrieving revision 1.218 diff -u -r1.218 configure --- configure 18 Mar 2005 09:42:53 -0000 1.218 +++ configure 25 Jul 2005 15:51:30 -0000 @@ -13370,6 +13370,7 @@ fi case "$target_os" in mingw*) enable_fake_main=no; GS_FAKE_MAIN=0;; + solaris*) enable_fake_main=no; GS_FAKE_MAIN=0;; esac echo "$as_me:$LINENO: result: $enable_fake_main" >&5 Index: configure.ac =================================================================== RCS file: /cvsroot/gnustep/gnustep/core/base/configure.ac,v retrieving revision 1.69 diff -u -r1.69 configure.ac --- configure.ac 15 Jul 2005 22:51:20 -0000 1.69 +++ configure.ac 25 Jul 2005 15:51:37 -0000 @@ -936,6 +936,7 @@ fi case "$target_os" in mingw*) enable_fake_main=no; GS_FAKE_MAIN=0;; + solaris*) enable_fake_main=no; GS_FAKE_MAIN=0;; esac AC_SUBST(GS_FAKE_MAIN) AC_MSG_RESULT($enable_fake_main) Index: Source/NSProcessInfo.m =================================================================== RCS file: /cvsroot/gnustep/gnustep/core/base/Source/NSProcessInfo.m,v retrieving revision 1.106 diff -u -r1.106 Source/NSProcessInfo.m --- Source/NSProcessInfo.m 15 Jul 2005 04:46:17 -0000 1.106 +++ Source/NSProcessInfo.m 25 Jul 2005 16:11:19 -0000 @@ -78,6 +78,10 @@ #include #endif /* HAVE_KVM_ENV */ +#if defined(__sun__) && defined(__svr4__) // Solaris +#include +#endif + #include "GSConfig.h" #include "Foundation/NSString.h" #include "Foundation/NSArray.h" @@ -337,7 +341,7 @@ IF_NO_GC(RELEASE(arp)); } -#if !GS_FAKE_MAIN && ((defined(HAVE_PROCFS) || defined(HAVE_KVM_ENV)) && (defined(HAVE_LOAD_METHOD))) +#if !GS_FAKE_MAIN && ((defined(HAVE_PROCFS) || defined(HAVE_KVM_ENV) || (defined(__sun__) && defined(__svr4__))) && (defined(HAVE_LOAD_METHOD))) /* * We have to save program arguments and environment before main () is * executed, because main () could modify their values before we get a @@ -424,6 +428,73 @@ abort(); } + /* copy the argument strings */ + for (_gnu_noobjc_argc = 0; vectors[_gnu_noobjc_argc]; _gnu_noobjc_argc++) + ; + _gnu_noobjc_argv = (char**)malloc(sizeof(char*) * (_gnu_noobjc_argc + 1)); + if (!_gnu_noobjc_argv) + goto malloc_error; + for (i = 0; i < _gnu_noobjc_argc; i++) + { + _gnu_noobjc_argv[i] = (char *)strdup(vectors[i]); + if (!_gnu_noobjc_argv[i]) + goto malloc_error; + } + _gnu_noobjc_argv[i] = NULL; + + return; +#elif defined(__sun__) && defined(__svr4__) + char *proc_file_name = NULL; + FILE *ifp; + psinfo_t pinfo; + char **vectors; + int i, count; + + // Read commandline + proc_file_name = (char*)malloc(sizeof(char) * 2048); + sprintf(proc_file_name, "/proc/%d/psinfo", (int) getpid()); + + ifp = fopen(proc_file_name, "r"); + if (ifp == NULL) + { + fprintf(stderr, "Error: Your system appears to be solaris, but fails to open the process info file:%s\n", proc_file_name); + abort(); + } + + fread(&pinfo, sizeof(pinfo), 1, ifp); + fclose(ifp); + + vectors = pinfo.pr_envp; + if (!vectors) + { + fprintf(stderr, "Error: for some reason, environ == NULL " + "during GNUstep base initialization\n" + "Please check the linking process\n"); + abort(); + } + + /* copy the environment strings */ + for (count = 0; vectors[count]; count++) + ; + _gnu_noobjc_env = (char**)malloc(sizeof(char*) * (count + 1)); + if (!_gnu_noobjc_env) + goto malloc_error; + for (i = 0; i < count; i++) + { + _gnu_noobjc_env[i] = (char *)strdup(vectors[i]); + if (!_gnu_noobjc_env[i]) + goto malloc_error; + } + _gnu_noobjc_env[i] = NULL; + + /* get the argument vectors */ + vectors = pinfo.pr_argv; + if (!vectors) + { + fprintf(stderr, "Error: psinfo does not return arguments for the current + process\n"); + abort(); + } /* copy the argument strings */ for (_gnu_noobjc_argc = 0; vectors[_gnu_noobjc_argc]; _gnu_noobjc_argc++) ;