aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstddjb/sagetexecname.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-04-02 06:02:35 +0000
committerLaurent Bercot <ska@appnovation.com>2025-04-02 06:02:35 +0000
commit200a70765a503fc94b546e5a52fdd90a59eee3b3 (patch)
tree343e317b83e45454239cdb50a50b3649bcdc174f /src/libstddjb/sagetexecname.c
parent56ab53289c60c6fbb06f8d548d353535d5ed1140 (diff)
downloadskalibs-200a70765a503fc94b546e5a52fdd90a59eee3b3.tar.gz
Add sagetexecname() and all the necessary infrastructure
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/libstddjb/sagetexecname.c')
-rw-r--r--src/libstddjb/sagetexecname.c111
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