Commit 97948aef666fa0237217b9fdc7bcc1fa072e606c

Ryan C. Gordon 2013-08-23T21:38:54

Add support for some BSDs and Solaris to SDL_GetBasePath().

diff --git a/src/filesystem/unix/SDL_sysfilesystem.c b/src/filesystem/unix/SDL_sysfilesystem.c
index 09db1e5..1798f3e 100644
--- a/src/filesystem/unix/SDL_sysfilesystem.c
+++ b/src/filesystem/unix/SDL_sysfilesystem.c
@@ -26,9 +26,14 @@
 /* System dependent filesystem routines                                */
 
 #include <unistd.h>
+#include <stdlib.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#ifdef __FREEBSD__
+#include <sys/sysctl.h>
+#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];