summaryrefslogtreecommitdiff
path: root/perl.c
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2001-11-24 15:23:34 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2001-11-24 15:23:34 +0000
commitb51d9c98646cc7c622f6896e9d6e994eeebd7ba5 (patch)
treec30f9b4f0aa9ee56fdf33c89e57d04072672c031 /perl.c
parent07200f1b93ada43b41fbed10c30b4e657f5b0c60 (diff)
downloadperl-b51d9c98646cc7c622f6896e9d6e994eeebd7ba5.tar.gz
Use /proc/self/auxv in Solaris to figure out the $^X.
(It seems that "./perl" gets resolved to "perl" now.) p4raw-id: //depot/perl@13234
Diffstat (limited to 'perl.c')
-rw-r--r--perl.c43
1 files changed, 38 insertions, 5 deletions
diff --git a/perl.c b/perl.c
index 5d4e5bbb25..13c7d31581 100644
--- a/perl.c
+++ b/perl.c
@@ -3421,7 +3421,7 @@ Perl_init_argv_symbols(pTHX_ register int argc, register char **argv)
#ifdef HAS_PROCSELFEXE
/* This is a function so that we don't hold on to MAXPATHLEN
- bytes of stack longer than necessary
+ bytes of stack longer than necessary.
*/
STATIC void
S_procself_val(pTHX_ SV *sv, char *arg0)
@@ -3437,6 +3437,35 @@ S_procself_val(pTHX_ SV *sv, char *arg0)
}
#endif /* HAS_PROCSELFEXE */
+#if defined(sun) && defined(__svr4__) /* solaris */
+#include <sys/auxv.h>
+STATIC void
+S_procselfauxv(pTHX_ SV *sv, char *arg0) {
+ auxv_t auxv;
+ int fh;
+ int n;
+
+ fh = open("/proc/self/auxv", O_RDONLY);
+ if (fh < 0) {
+ sv_setpv(sv, arg0);
+ return;
+ }
+
+ while (1) {
+ n = read(fh, &auxv, sizeof(auxv));
+ if (n != sizeof(auxv))
+ break;
+ if (auxv.a_type == AT_SUN_EXECNAME) {
+ close(fh);
+ sv_setpv(sv, auxv.a_un.a_ptr);
+ return;
+ }
+ }
+ close(fh);
+ sv_setpv(sv, arg0);
+}
+#endif /* solaris */
+
STATIC void
S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register char **env)
{
@@ -3473,11 +3502,15 @@ S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register
#ifdef HAS_PROCSELFEXE
S_procself_val(aTHX_ GvSV(tmpgv), PL_origargv[0]);
#else
-#ifdef OS2
+# ifdef OS2
sv_setpv(GvSV(tmpgv), os2_execname(aTHX));
-#else
- sv_setpv(GvSV(tmpgv),PL_origargv[0]);
-#endif
+# else
+# if defined(sun) && defined(__svr4__) /* solaris */
+ S_procselfauxv(aTHX_ GvSV(tmpgv), PL_origargv[0]);
+# else
+ sv_setpv(GvSV(tmpgv), PL_origargv[0]);
+# endif
+# endif
#endif
}
if ((PL_envgv = gv_fetchpv("ENV",TRUE, SVt_PVHV))) {