소스 검색

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

Ryan C. Gordon 11 년 전
부모
커밋
97948aef66
1개의 변경된 파일39개의 추가작업 그리고 2개의 파일을 삭제
  1. 39 2
      src/filesystem/unix/SDL_sysfilesystem.c

+ 39 - 2
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];