/* ISC license. */ #include #if defined(SKALIBS_PROCSELFEXE) /* Linux, midipix, Solaris */ #include #include int sagetexecname (stralloc *sa) { return sareadlink(sa, SKALIBS_PROCSELFEXE) ; } #elif defined(SKALIBS_HASKERNPROCPATHNAME) /* FreeBSD, NetBSD */ #include #ifdef __NetBSD__ #include #endif #include #include #include #include int sagetexecname (stralloc *sa) { int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 } ; char buf[PATH_MAX] ; size_t len = sizeof(buf) ; if (sysctl(mib, 4, buf, &len, 0, 0) == -1) return -1 ; if (!stralloc_catb(sa, buf, len) || !stralloc_0(sa)) return -1 ; return 0 ; } #elif defined(SKALIBS_HAS_NSGETEXECUTABLEPATH) /* MacOS */ #include #include #include #include #include #include int sagetexecname (stralloc *sa) { char buf[4096] ; uint32_t len = sizeof(buf) ; if (_NSGetExecutablePath(buf, &len) == -1) return -1 ; return sarealpath(sa, buf) ; } #elif defined(SKALIBS_HASGETAUXVAL) /* Hurd */ #include #include #include #include int sagetexecname (stralloc *sa) { unsigned long x = getauxval(AT_EXECFN) ; return sarealpath(sa, (char const *)x) ; } #elif defined(SKALIBS_HASDLADDR) /* hack that only works with dynamic binaries */ #include #include #include #include extern int main () ; int sagetexecname (stralloc *sa) { Dl_info info ; if (!dladdr(&main, &info)) return -1 ; if (!stralloc_cats(sa, info.dli_fname) || !stralloc_0(sa)) return -1 ; return 0 ; } #elif defined(SKALIBS_HASGETEXECNAME) /* bad: it will probably give argv[0] */ #include #include #include #include int sagetexecname (stralloc *sa) { return sarealpath(sa, getexecname()) ; } #else /* we tried */ #include #include #include int sagetexecname (stralloc *sa) { errno = ENOSYS ; return -1 ; } #endif