diff --git a/src/filesystem/unix/SDL_sysfilesystem.c b/src/filesystem/unix/SDL_sysfilesystem.c index 09db1e55c..1798f3e04 100644 --- a/src/filesystem/unix/SDL_sysfilesystem.c +++ b/src/filesystem/unix/SDL_sysfilesystem.c @@ -26,9 +26,14 @@ /* System dependent filesystem routines */ #include +#include #include #include +#ifdef __FREEBSD__ +#include +#endif + #include "SDL_error.h" #include "SDL_stdinc.h" #include "SDL_filesystem.h" @@ -73,9 +78,41 @@ SDL_GetBasePath(void) { char *retval = NULL; +#if defined(__FREEBSD__) + char fullpath[PATH_MAX]; + size_t buflen = sizeof (fullpath); + int mib[4]; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PATHNAME; + mib[3] = -1; + if (sysctl(mib, 4, fullpath, &buflen, NULL, 0) != -1) { + retval = SDL_strdup(fullpath); + if (!retval) { + SDL_OutOfMemory(); + return NULL; + } + } +#elif defined(__SOLARIS__) + const char *path = getexecname(); + if ((path != NULL) && (path[0] == '/')) { /* must be absolute path... */ + retval = SDL_strdup(fullpath); + if (!retval) { + SDL_OutOfMemory(); + return NULL; + } + } +#endif + /* is a Linux-style /proc filesystem available? */ - if (access("/proc", F_OK) == 0) { - retval = readSymLink("/proc/self/exe"); + if (!retval && (access("/proc", F_OK) == 0)) { + #if defined(__FREEBSD__) + retval = readSymLink("/proc/curproc/file"); + #elif defined(__NETBSD__) + retval = readSymLink("/proc/curproc/exe"); + #else + retval = readSymLink("/proc/self/exe"); /* linux. */ + #endif if (retval == NULL) { /* older kernels don't have /proc/self ... try PID version... */ char path[64];