From 94eea1e7324e6599decb73b78d13b111dd5b2621 Mon Sep 17 00:00:00 2001 From: Mike Pavone Date: Mon, 28 Oct 2013 21:48:46 -0700 Subject: Extract function to determine executable directory from load_config so it can be used elsewhere --- util.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) (limited to 'util.c') diff --git a/util.c b/util.c index c41547a..0b8d8cb 100644 --- a/util.c +++ b/util.c @@ -3,6 +3,10 @@ #include #include +#include +#include +#include + char * alloc_concat(char * first, char * second) { int flen = strlen(first); @@ -63,3 +67,73 @@ char * split_keyval(char * text) *text = 0; return text+1; } + +static char * exe_str; + +void set_exe_str(char * str) +{ + exe_str = str; +} + +char * readlink_alloc(char * path) +{ + char * linktext = NULL; + ssize_t linksize = 512; + ssize_t cursize = 0; + do { + if (linksize > cursize) { + cursize = linksize; + if (linktext) { + free(linktext); + } + } + linktext = malloc(cursize); + linksize = readlink(path, linktext, cursize-1); + if (linksize == -1) { + perror("readlink"); + free(linktext); + linktext = NULL; + } + } while (linksize > cursize); + return linktext; +} + +char * get_exe_dir() +{ + static char * exe_dir; + if (!exe_dir) { + char * linktext = readlink_alloc("/proc/self/exe"); + if (!linktext) { + goto fallback; + } + char * cur; + int linksize = strlen(linktext); + for(cur = linktext + linksize - 1; cur != linktext; cur--) + { + if (*cur == '/') { + *cur = 0; + break; + } + } + if (cur == linktext) { + free(linktext); +fallback: + if (!exe_str) { + fputs("/proc/self/exe is not available and set_exe_str was not called!", stderr); + } + int pathsize = strlen(exe_str); + for(cur = exe_str + pathsize - 1; cur != exe_str; cur--) + { + if (*cur == '/') { + exe_dir = malloc(cur-exe_str+1); + memcpy(exe_dir, exe_str, cur-exe_str); + exe_dir[cur-exe_str] = 0; + break; + } + } + } else { + exe_dir = linktext; + } + } + return exe_dir; +} -- cgit v1.2.3