static inline bool isSymbolicLink(const std::string& filename) { return isSymbolicLink(filename.c_str()); }
int main_get_executable_name (char *argv0, char **result) { #if defined(LINUX) return readSymbolicLink ("/proc/self/exe", result); #else IDATA retval = -1; IDATA length; char *p; char *currentName = NULL; char *currentPath = NULL; char *originalWorkingDirectory = NULL; if (!argv0) { return -1; } currentPath = main_mem_allocate_memory(strlen (argv0) + 1); if (currentPath) { strcpy(currentPath, argv0); } if (!currentPath) { retval = -1; goto cleanup; } retval = cwdname(&originalWorkingDirectory); if (retval) { retval = -1; goto cleanup; } gotPathName: /* split path into directory part and filename part. */ p = strrchr (currentPath, '/'); if (p) { *p++ = '\0'; currentName = main_mem_allocate_memory(strlen (p) + 1); if (!currentName) { retval = -1; goto cleanup; } strcpy (currentName, p); } else { currentName = currentPath; currentPath = NULL; retval = searchSystemPath (currentName, ¤tPath); if (retval) { retval = -1; goto cleanup; } } /* go there */ if (currentPath) { if (currentPath[0]) { if (0 != chdir (currentPath)) { retval = -1; goto cleanup; } } main_mem_free_memory(currentPath); currentPath = NULL; } if (isSymbolicLink (currentName)) { /* try to follow the link. */ retval = readSymbolicLink (currentName, ¤tPath); if (retval) { retval = -1; goto cleanup; } main_mem_free_memory(currentName); currentName = NULL; goto gotPathName; } retval = cwdname (¤tPath); if (retval) { retval = -1; goto cleanup; } /* Put name and path back together */ *result = main_mem_allocate_memory(strlen(currentPath) + strlen(currentName) + 2); if (!*result) { retval = -1; goto cleanup; } strcpy (*result, currentPath); if (currentPath[0] && (currentPath[strlen (currentPath) - 1] != '/')) { strcat (*result, "/"); } strcat (*result, currentName); /* Finished. */ retval = 0; cleanup: if (originalWorkingDirectory) { chdir (originalWorkingDirectory); main_mem_free_memory(originalWorkingDirectory); originalWorkingDirectory = NULL; } if (currentPath) { main_mem_free_memory(currentPath); currentPath = NULL; } if (currentName) { main_mem_free_memory(currentName); currentName = NULL; } return retval; #endif }