summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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))) {