diff options
| author | Laurent Bercot <ska-skaware@skarnet.org> | 2025-04-02 06:02:35 +0000 |
|---|---|---|
| committer | Laurent Bercot <ska@appnovation.com> | 2025-04-02 06:02:35 +0000 |
| commit | 200a70765a503fc94b546e5a52fdd90a59eee3b3 (patch) | |
| tree | 343e317b83e45454239cdb50a50b3649bcdc174f /src/libstddjb | |
| parent | 56ab53289c60c6fbb06f8d548d353535d5ed1140 (diff) | |
| download | skalibs-200a70765a503fc94b546e5a52fdd90a59eee3b3.tar.gz | |
Add sagetexecname() and all the necessary infrastructure
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/libstddjb')
| -rw-r--r-- | src/libstddjb/sagetexecname.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/libstddjb/sagetexecname.c b/src/libstddjb/sagetexecname.c new file mode 100644 index 0000000..d3c300b --- /dev/null +++ b/src/libstddjb/sagetexecname.c @@ -0,0 +1,111 @@ +/* ISC license. */ + +#include <skalibs/sysdeps.h> + +#if defined(SKALIBS_PROCSELFEXE) + +#include <skalibs/stralloc.h> +#include <skalibs/djbunix.h> + +int sagetexecname (stralloc *sa) +{ + return sareadlink(sa, SKALIBS_PROCSELFEXE) ; +} + +#elif defined(SKALIBS_HASGETEXECNAME) + +#include <skalibs/nonposix.h> +#include <stdlib.h> + +#include <skalibs/stralloc.h> +#include <skalibs/djbunix.h> + +int sagetexecname (stralloc *sa) +{ + return sarealpath(sa, getexecname()) ; +} + +#elif defined(SKALIBS_HASKERNPROCPATHNAME) + +#include <skalibs/nonposix.h> +#ifdef __NetBSD__ +#include <sys/param.h> +#endif +#include <limits.h> +#include <sys/sysctl.h> + +#include <skalibs/stralloc.h> +#include <skalibs/djbunix.h> + +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) + +#include <skalibs/nonposix.h> +#include <sys/types.h> +#include <stdint.h> +#include <macho-o/dyld.h> + +#include <skalibs/stralloc.h> +#include <skalibs/djbunix.h> + +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) + +#include <skalibs/nonposix.h> +#include <sys/auxv.h> + +#include <skalibs/stralloc.h> +#include <skalibs/djbunix.h> + +int sagetexecname (stralloc *sa) +{ + unsigned long x = getauxval(AT_EXECFN) ; + return sarealpath(sa, (char const *)x) ; +} + +#elif defined(SKALIBS_HASDLADDR) + +#include <skalibs/nonposix.h> +#include <dlfcn.h> + +#include <skalibs/stralloc.h> +#include <skalibs/djbunix.h> + +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 ; +} + +#else /* we tried */ + +#include <errno.h> + +#include <skalibs/stralloc.h> +#include <skalibs/djbunix.h> + +int sagetexecname (stralloc *sa) +{ + errno = ENOSYS ; + return -1 ; +} + +#endif |
