Apply the *nix file-chooser patches from STR #2935.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9884 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Ian MacArthur 2013-04-16 12:02:23 +00:00
parent 850bda435b
commit b176f4d3f6

View File

@ -62,6 +62,33 @@
# include <sys/mount.h>
#endif // __APPLE__
#if defined(_AIX)
extern "C" {
# include <sys/types.h>
# include <sys/vmount.h>
# include <sys/mntctl.h>
// Older AIX versions don't expose this prototype
int
mntctl(int, int, char *);
}
#endif // _AIX
#if defined(__NetBSD__)
extern "C" {
# include <sys/param.h> // For '__NetBSD_Version__' definition
# if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 300000000)
# include <sys/types.h>
# include <sys/statvfs.h>
# if defined(HAVE_PTHREAD) && defined(HAVE_PTHREAD_H)
# include <pthread.h>
# endif // HAVE_PTHREAD && HAVE_PTHREAD_H
# ifdef HAVE_PTHREAD
static pthread_mutex_t getvfsstat_mutex = PTHREAD_MUTEX_INITIALIZER;
# endif // HAVE_PTHREAD/
# endif // __NetBSD_Version__
}
#endif // __NetBSD__
//
// FL_BLINE definition from "Fl_Browser.cxx"...
//
@ -522,6 +549,77 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load
// Free the memory used for the file system info array...
delete[] fs;
}
#elif defined(_AIX)
// AIX don't write the mounted filesystems to a file like '/etc/mnttab'.
// But reading the list of mounted filesystems from the kernel is possible:
// http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.basetechref/doc/basetrf1/mntctl.htm
int res = -1, len;
char *list = NULL, *name;
struct vmount *vp;
// We always have the root filesystem
add("/", icon);
// Get the required buffer size for the vmount structures
res = mntctl(MCTL_QUERY, sizeof(len), (char *) &len);
if (!res) {
// Allocate buffer ...
list = (char *) malloc((size_t) len);
if (NULL == list) {
res = -1;
} else {
// ... and read vmount structures from kernel
res = mntctl(MCTL_QUERY, len, list);
if (0 >= res) {
res = -1;
} else {
for (i = 0, vp = (struct vmount *) list; i < res; ++i) {
name = (char *) vp + vp->vmt_data[VMT_STUB].vmt_off;
strlcpy(filename, name, sizeof(filename));
// Skip the already added root filesystem
if (strcmp("/", filename) != 0) {
strlcat(filename, "/", sizeof(filename));
add(filename, icon);
}
vp = (struct vmount *) ((char *) vp + vp->vmt_length);
}
}
}
}
// Note: Executing 'free(NULL)' is allowed and simply do nothing
free((void *) list);
#elif defined(__NetBSD__) && defined(__NetBSD_Version__) \
&& (__NetBSD_Version__ >= 300000000)
// NetBSD don't write the mounted filesystems to a file like '/etc/mnttab'.
// Since NetBSD 3.0 the system call getvfsstat(2) has replaced getfsstat(2)
// that is used by getmntinfo(3):
// http://www.daemon-systems.org/man/getmntinfo.3.html
int res = -1;
struct statvfs *list;
// We always have the root filesystem
add("/", icon);
# ifdef HAVE_PTHREAD
// Lock mutex for thread safety
if (!pthread_mutex_lock(&getvfsstat_mutex)) {
# endif // HAVE_PTHREAD
// Get list of statvfs structures
res = getmntinfo(&list, ST_WAIT);
if(0 < res) {
for (i = 0; i < res; ++i) {
strlcpy(filename, list[i].f_mntonname, sizeof(filename));
// Skip the already added root filesystem
if (strcmp("/", filename) != 0) {
strlcat(filename, "/", sizeof(filename));
add(filename, icon);
}
}
} else {
res = -1;
}
# ifdef HAVE_PTHREAD
pthread_mutex_unlock(&getvfsstat_mutex);
}
# endif // HAVE_PTHREAD
#else
//
// UNIX code uses /etc/fstab or similar...
@ -550,7 +648,10 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load
if (sscanf(line, "%*s%4095s", filename) != 1)
continue;
strlcat(filename, "/", sizeof(filename));
// Add a trailing slash (except for the root filesystem)
if (strcmp("/", filename) != 0) {
strlcat(filename, "/", sizeof(filename));
}
// printf("Fl_File_Browser::load() - adding \"%s\" to list...\n", filename);
add(filename, icon);
@ -558,8 +659,13 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load
}
fclose(mtab);
} else {
// Every Unix has a root filesystem '/'.
// This last stage fallback ensures that the user don't get an empty
// window after requesting filesystem list.
add("/", icon);
}
#endif // WIN32 || __EMX__
#endif // WIN32 || __EMX__ || __APPLE__ || _AIX || ...
}
else
{