Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Add support for some BSDs and Solaris to SDL_GetBasePath().
- Loading branch information
Showing
with
39 additions
and
2 deletions.
-
+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]; |
|
|