diff options
author | Jarkko Hietaniemi <jhi@iki.fi> | 2001-11-24 15:23:34 +0000 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2001-11-24 15:23:34 +0000 |
commit | b51d9c98646cc7c622f6896e9d6e994eeebd7ba5 (patch) | |
tree | c30f9b4f0aa9ee56fdf33c89e57d04072672c031 /perl.c | |
parent | 07200f1b93ada43b41fbed10c30b4e657f5b0c60 (diff) | |
download | perl-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.c | 43 |
1 files changed, 38 insertions, 5 deletions
@@ -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))) { |