nm_so_opt=''
runnm=''
usenm=''
+usensgetexecutablepath=''
useperlio=''
usesocks=''
d_oldpthreads=''
set usekernprocpathname
eval $setvar
+: Determine if we can use _NSGetExecutablePath to find executing program
+echo " "
+echo "Determining whether we can use _NSGetExecutablePath to find executing program..." >&4
+$cat >try.c <<'EOM'
+/* Intentionally a long probe as I'd like to sanity check that the exact
+ approach is going to work, as thinking it will work, but only having it
+ part working at runtime is worse than not having it. */
+#include <mach-o/dyld.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/param.h>
+#include <string.h>
+
+int
+main(int argc, char **argv) {
+ char buf[1];
+ uint32_t size = sizeof(buf);
+ int result;
+ char *buffer;
+ char *tidied;
+ char *argv_leaf = strrchr(argv[0], '/');
+ char *tidied_leaf;
+
+ if (!argv_leaf) {
+ fprintf(stderr, "Can't locate / in '%s'\n", argv[0]);
+ return 1;
+ }
+
+ _NSGetExecutablePath(buf, &size);
+ if (size > MAXPATHLEN * MAXPATHLEN) {
+ fprintf(stderr, "_NSGetExecutablePath size %u is too long for a path\n",
+ (unsigned int) size);
+ return 2;
+ }
+
+ buffer = malloc(size);
+ if (!buffer) {
+ perror("malloc");
+ return 3;
+ }
+
+ result = _NSGetExecutablePath(buffer, &size);
+ if (result != 0) {
+ fprintf(stderr, "_NSGetExecutablePath returned %i for a size of %u\n",
+ result, (unsigned int) size);
+ return 4;
+ }
+
+ tidied = realpath(buffer, NULL);
+ if (!tidied) {
+ perror("realpath");
+ return 5;
+ }
+
+ free(buffer);
+
+ if (*tidied != '/') {
+ fprintf(stderr, "Not an absolute path: '%s'\n", tidied);
+ return 6;
+ }
+
+ if (strstr(tidied, "/./")) {
+ fprintf(stderr, "Contains /./: '%s'\n", tidied);
+ return 7;
+ }
+
+ if (strstr(tidied, "/../")) {
+ fprintf(stderr, "Contains /../: '%s'\n", tidied);
+ return 8;
+ }
+
+ tidied_leaf = strrchr(tidied, '/');
+ if (strcmp(tidied_leaf, argv_leaf) != 0) {
+ fprintf(stderr, "Leafnames differ: '%s' vs '%s'\n", argv[0], tidied);
+ return 9;
+ }
+
+ free(tidied);
+
+ return 0;
+}
+EOM
+
+val=$undef
+set try
+if eval $compile_ok; then
+ if $run ./try; then
+ echo "You can use _NSGetExecutablePath to find the executing program." >&4
+ val="$define"
+ else
+ echo "Nope, _NSGetExecutablePath doesn't work here." >&4
+ fi
+else
+ echo "I'm unable to compile the test program." >&4
+ echo "I'll assume no _NSGetExecutablePath here." >&4
+fi
+$rm_try
+set usensgetexecutablepath
+eval $setvar
+
: Check how to flush
echo " "
$cat >&4 <<EOM
usemultiplicity='$usemultiplicity'
usemymalloc='$usemymalloc'
usenm='$usenm'
+usensgetexecutablepath='$usensgetexecutablepath'
useopcode='$useopcode'
useperlio='$useperlio'
useposix='$useposix'
usemultiplicity='undef'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='define'
useposix='true'
usemultiplicity='define'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='undef'
useposix='true'
This variable contains 'true' or 'false' depending whether the
nm extraction is wanted or not.
+usensgetexecutablepath (usensgetexecutablepath.U):
+ This symbol, if defined, indicates that we can use _NSGetExecutablePath
+ and realpath to get a full path for the executable, and hence convert
+ $^X to an absolute path.
+
useopcode (Extensions.U):
This variable holds either 'true' or 'false' to indicate
whether the Opcode extension should be used. The sole
usemultiplicity='undef'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='define'
useposix='true'
*/
#$usekernprocpathname USE_KERN_PROC_PATHNAME /**/
+/* USE_NSGETEXECUTABLEPATH:
+ * This symbol, if defined, indicates that we can use _NSGetExecutablePath
+ * and realpath to get a full path for the executable, and hence convert
+ * $^X to an absolute path.
+ */
+#$usensgetexecutablepath USE_NSGETEXECUTABLEPATH /**/
+
/* Fpos_t:
* This symbol holds the type used to declare file positions in libc.
* It can be fpos_t, long, uint, etc... It may be necessary to include
$ WC "useithreads='" + useithreads + "'"
$ WC "usekernelthreads='" + usekernelthreads + "'" ! VMS-specific
$ WC "usekernprocpathname='undef'"
+$ WC "usensgetexecutablepath='undef'"
$ WC "uselargefiles='" + uselargefiles + "'"
$ WC "uselongdouble='" + uselongdouble + "'"
$ WC "usemorebits='" + usemorebits + "'"
usemultiplicity='undef'
usemymalloc='n'
usenm=''
+usensgetexecutablepath='undef'
useopcode=''
useperlio='undef'
useposix=''
# include <sys/sysctl.h>
#endif
+#ifdef USE_NSGETEXECUTABLEPATH
+# include <mach-o/dyld.h>
+#endif
+
#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
# ifdef I_SYSUIO
# include <sys/uio.h>
return;
}
}
+# elif defined(USE_NSGETEXECUTABLEPATH)
+ char buf[1];
+ uint32_t size = sizeof(buf);
+ int result;
+
+ _NSGetExecutablePath(buf, &size);
+ if (size < MAXPATHLEN * MAXPATHLEN) {
+ sv_grow(caret_x, size);
+ if (_NSGetExecutablePath(SvPVX(caret_x), &size) == 0) {
+ char *const tidied = realpath(SvPVX(caret_x), NULL);
+ if (tidied) {
+ sv_setpv(caret_x, tidied);
+ free(tidied);
+ } else {
+ SvPOK_only(caret_x);
+ SvCUR_set(caret_x, size);
+ }
+ return;
+ }
+ }
# elif defined(HAS_PROCSELFEXE)
char buf[MAXPATHLEN];
int len = readlink(PROCSELFEXE_PATH, buf, sizeof(buf) - 1);
usemultiplicity='undef'
usemymalloc='y'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='define'
useposix='true'
usemultiplicity='undef'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='define'
useposix='true'
# $^X and $0
{
- my $is_abs = $Config{d_procselfexe} || $Config{usekernprocpathname};
+ my $is_abs = $Config{d_procselfexe} || $Config{usekernprocpathname}
+ || $Config{usensgetexecutablepath};
if ($^O eq 'qnx') {
chomp($wd = `/usr/bin/fullpath -t`);
}
*/
/*#define USE_KERN_PROC_PATHNAME / **/
+/* USE_NSGETEXECUTABLEPATH:
+ * This symbol, if defined, indicates that we can use _NSGetExecutablePath
+ * and realpath to get a full path for the executable, and hence convert
+ * $^X to an absolute path.
+ */
+/*#define USE_NSGETEXECUTABLEPATH / **/
+
/* Fpos_t:
* This symbol holds the type used to declare file positions in libc.
* It can be fpos_t, long, uint, etc... It may be necessary to include
#endif
/* Generated from:
- * e6513dfa5f1449ab9266aee521d6d5908873d1dc68bf4f049316ebc4921732e1 config_h.SH
- * e940950d07a2be0354d6ae7e4316ec8465ed581607bbb958d8bfda024b9941fe uconfig.sh
+ * 5b5dacbb00f53ae9b440c79cf6d5c8bbf80a7adfa1db3f3814aa77dc6f461fa7 config_h.SH
+ * b5e74633486412bbc4d2a1c3847f3e85b10a86e96fb5d1efb7b8bc885956d746 uconfig.sh
* ex: set ro: */
usemultiplicity='undef'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='undef'
useposix='true'
usemultiplicity='undef'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='undef'
useposix='true'
usemultiplicity='undef'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='~USE_PERLIO~'
useposix='true'
usemultiplicity='undef'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='undef'
useposix='true'
usemultiplicity='undef'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='undef'
useposix='true'
usemultiplicity='undef'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='undef'
useposix='true'
usemultiplicity='undef'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='undef'
useposix='true'
usemultiplicity='undef'
usemymalloc='n'
usenm='false'
+usensgetexecutablepath='undef'
useopcode='true'
useperlio='undef'
useposix='true'