From 927774af85b115b2affa35252a46cc6f3235fe97 Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Sun, 10 Apr 2016 06:33:19 +0000 Subject: Rewrite Fl_File_Browser.cxx under the driver model. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11570 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- src/Fl_File_Browser.cxx | 282 +------------------------ src/Fl_System_Driver.cxx | 6 + src/drivers/Darwin/Fl_Darwin_System_Driver.H | 1 + src/drivers/Darwin/Fl_Darwin_System_Driver.cxx | 39 ++++ src/drivers/Posix/Fl_Posix_System_Driver.H | 1 + src/drivers/Posix/Fl_Posix_System_Driver.cxx | 154 +++++++++++++- src/drivers/WinAPI/Fl_WinAPI_System_Driver.H | 2 + src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx | 59 ++++++ 8 files changed, 264 insertions(+), 280 deletions(-) (limited to 'src') diff --git a/src/Fl_File_Browser.cxx b/src/Fl_File_Browser.cxx index 0d8c20b5b..024fa7d5b 100644 --- a/src/Fl_File_Browser.cxx +++ b/src/Fl_File_Browser.cxx @@ -4,6 +4,7 @@ // Fl_File_Browser routines. // // Copyright 1999-2010 by Michael Sweet. +// Copyright 2016 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this @@ -26,12 +27,6 @@ // Fl_File_Browser::filter() - Set the filename filter. // -#if defined(WIN32) || defined(__APPLE__) // PORTME: Fl_Screen_Driver - platform file browser -#elif defined(FL_PORTING) -# pragma message "FL_PORTING: implement the internals of your file browser here" -#else -#endif - // // Include necessary header files... // @@ -46,57 +41,6 @@ #include #include "flstring.h" -#ifdef __CYGWIN__ -# include -#elif defined(WIN32) -# include -# include -// Apparently Borland C++ defines DIRECTORY in , which -// interfers with the Fl_File_Icon enumeration of the same name. -# ifdef DIRECTORY -# undef DIRECTORY -# endif // DIRECTORY -#endif // __CYGWIN__ - -#ifdef __EMX__ -# define INCL_DOS -# define INCL_DOSMISC -# include -#endif // __EMX__ - -#if defined(__APPLE__) // PORTME: Fl_Screen_Driver - platform file browser -# include -# include -# include -#endif // __APPLE__ // PORTME: Fl_Screen_Driver - platform file browser - -#if defined(_AIX) -extern "C" { -# include -# include -# include - // Older AIX versions don't expose this prototype - int - mntctl(int, int, char *); -} -#endif // _AIX - -#if defined(__NetBSD__) -extern "C" { -# include // For '__NetBSD_Version__' definition -# if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 300000000) -# include -# include -# if defined(HAVE_PTHREAD) && defined(HAVE_PTHREAD_H) -# include -# 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"... // @@ -461,237 +405,17 @@ Fl_File_Browser::load(const char *directory,// I - Directory to load // No directory specified; for UNIX list all mount points. For DOS // list all valid drive letters... // - - num_files = 0; if ((icon = Fl_File_Icon::find("any", Fl_File_Icon::DEVICE)) == NULL) icon = Fl_File_Icon::find("any", Fl_File_Icon::DIRECTORY); - -#ifdef WIN32 -# ifdef __CYGWIN__ - // - // Cygwin provides an implementation of setmntent() to get the list - // of available drives... - // - FILE *m = setmntent("/-not-used-", "r"); - struct mntent *p; - - while ((p = getmntent (m)) != NULL) { - add(p->mnt_dir, icon); - num_files ++; - } - - endmntent(m); -# else - // - // Normal WIN32 code uses drive bits... - // - DWORD drives; // Drive available bits - - drives = GetLogicalDrives(); - for (i = 'A'; i <= 'Z'; i ++, drives >>= 1) - if (drives & 1) - { - sprintf(filename, "%c:/", i); - - if (i < 'C') // see also: GetDriveType and GetVolumeInformation in WIN32 - add(filename, icon); - else - add(filename, icon); - - num_files ++; - } -# endif // __CYGWIN__ -#elif defined(__EMX__) - // - // OS/2 code uses drive bits... - // - ULONG curdrive; // Current drive - ULONG drives; // Drive available bits - int start = 3; // 'C' (MRS - dunno if this is correct!) - - - DosQueryCurrentDisk(&curdrive, &drives); - drives >>= start - 1; - for (i = 'A'; i <= 'Z'; i ++, drives >>= 1) - if (drives & 1) - { - sprintf(filename, "%c:/", i); - add(filename, icon); - - num_files ++; - } -#elif defined(__APPLE__) // PORTME: Fl_Screen_Driver - platform file browser - // MacOS X and Darwin use getfsstat() system call... - int numfs; // Number of file systems - struct statfs *fs; // Buffer for file system info - - - // We always have the root filesystem. - add("/", icon); - - // Get the mounted filesystems... - numfs = getfsstat(NULL, 0, MNT_NOWAIT); - if (numfs > 0) { - // We have file systems, get them... - fs = new struct statfs[numfs]; - getfsstat(fs, sizeof(struct statfs) * numfs, MNT_NOWAIT); - - // Add filesystems to the list... - for (i = 0; i < numfs; i ++) { - // Ignore "/", "/dev", and "/.vol"... - if (fs[i].f_mntonname[1] && strcmp(fs[i].f_mntonname, "/dev") && - strcmp(fs[i].f_mntonname, "/.vol")) { - snprintf(filename, sizeof(filename), "%s/", fs[i].f_mntonname); - add(filename, icon); - } - num_files ++; - } - - // 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... - // - FILE *mtab; // /etc/mtab or /etc/mnttab file - char line[FL_PATH_MAX]; // Input line - - // - // Open the file that contains a list of mounted filesystems... - // - - mtab = fl_fopen("/etc/mnttab", "r"); // Fairly standard - if (mtab == NULL) - mtab = fl_fopen("/etc/mtab", "r"); // More standard - if (mtab == NULL) - mtab = fl_fopen("/etc/fstab", "r"); // Otherwise fallback to full list - if (mtab == NULL) - mtab = fl_fopen("/etc/vfstab", "r"); // Alternate full list file - - if (mtab != NULL) - { - while (fgets(line, sizeof(line), mtab) != NULL) - { - if (line[0] == '#' || line[0] == '\n') - continue; - if (sscanf(line, "%*s%4095s", filename) != 1) - continue; - - // 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); - num_files ++; - } - - 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__ || __APPLE__ || _AIX || ... // PORTME: Fl_Screen_Driver - platform file browser + num_files = Fl::system_driver()->file_browser_load_filesystem(this, filename, icon); } else { dirent **files; // Files in in directory - - // // Build the file list... // - -#if (defined(WIN32) && !defined(__CYGWIN__)) || defined(__EMX__) - strlcpy(filename, directory_, sizeof(filename)); - i = (int) (strlen(filename) - 1); - - if (i == 2 && filename[1] == ':' && - (filename[2] == '/' || filename[2] == '\\')) - filename[2] = '/'; - else if (filename[i] != '/' && filename[i] != '\\') - strlcat(filename, "/", sizeof(filename)); - - num_files = fl_filename_list(filename, &files, sort); -#else - num_files = fl_filename_list(directory_, &files, sort); -#endif /* WIN32 || __EMX__ */ - + num_files = Fl::system_driver()->file_browser_load_directory(directory_, filename, &files, sort); if (num_files <= 0) return (0); diff --git a/src/Fl_System_Driver.cxx b/src/Fl_System_Driver.cxx index 0ececcb92..fa903e2bd 100644 --- a/src/Fl_System_Driver.cxx +++ b/src/Fl_System_Driver.cxx @@ -417,6 +417,12 @@ int Fl_System_Driver::filename_expand(char *to,int tolen, const char *from) { return ret; } +int Fl_System_Driver::file_browser_load_directory(const char *directory, char *filename, dirent ***pfiles, + Fl_File_Sort_F *sort) +{ + return filename_list(directory, pfiles, sort); +} + // // End of "$Id$". // diff --git a/src/drivers/Darwin/Fl_Darwin_System_Driver.H b/src/drivers/Darwin/Fl_Darwin_System_Driver.H index ebb065dc3..77b646a29 100644 --- a/src/drivers/Darwin/Fl_Darwin_System_Driver.H +++ b/src/drivers/Darwin/Fl_Darwin_System_Driver.H @@ -75,6 +75,7 @@ public: virtual int need_menu_handle_part2() {return 1;} virtual int open_uri(const char *uri, char *msg, int msglen); virtual int need_test_shortcut_extra() {return 1;} + virtual int file_browser_load_filesystem(Fl_File_Browser *browser, char *filename, Fl_File_Icon *icon); }; #endif // FL_DARWIN_SYSTEM_DRIVER_H diff --git a/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx b/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx index c8c8c0c32..8ad45ad07 100644 --- a/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx +++ b/src/drivers/Darwin/Fl_Darwin_System_Driver.cxx @@ -20,7 +20,9 @@ #include "../../config_lib.h" #include "Fl_Darwin_System_Driver.H" #include +#include #include +#include #include #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 #include @@ -29,6 +31,9 @@ #include #include #include +#include +#include +#include extern int fl_mac_os_version; // the version number of the running Mac OS X @@ -153,6 +158,40 @@ int Fl_Darwin_System_Driver::open_uri(const char *uri, char *msg, int msglen) return run_program("/usr/bin/open", argv, msg, msglen) != 0; } +int Fl_Darwin_System_Driver::file_browser_load_filesystem(Fl_File_Browser *browser, char *filename, Fl_File_Icon *icon) +{ + // MacOS X and Darwin use getfsstat() system call... + int numfs; // Number of file systems + struct statfs *fs; // Buffer for file system info + int num_files = 0; + + // We always have the root filesystem. + browser->add("/", icon); + + // Get the mounted filesystems... + numfs = getfsstat(NULL, 0, MNT_NOWAIT); + if (numfs > 0) { + // We have file systems, get them... + fs = new struct statfs[numfs]; + getfsstat(fs, sizeof(struct statfs) * numfs, MNT_NOWAIT); + + // Add filesystems to the list... + for (int i = 0; i < numfs; i ++) { + // Ignore "/", "/dev", and "/.vol"... + if (fs[i].f_mntonname[1] && strcmp(fs[i].f_mntonname, "/dev") && + strcmp(fs[i].f_mntonname, "/.vol")) { + snprintf(filename, sizeof(filename), "%s/", fs[i].f_mntonname); + browser->add(filename, icon); + } + num_files ++; + } + + // Free the memory used for the file system info array... + delete[] fs; + } + return num_files; +} + // // End of "$Id$". diff --git a/src/drivers/Posix/Fl_Posix_System_Driver.H b/src/drivers/Posix/Fl_Posix_System_Driver.H index 829b292b0..8d0eb5e97 100644 --- a/src/drivers/Posix/Fl_Posix_System_Driver.H +++ b/src/drivers/Posix/Fl_Posix_System_Driver.H @@ -75,6 +75,7 @@ public: virtual int use_tooltip_timeout_condition() {return 1;} // this one is in fl_shortcut.cxx virtual const char *shortcut_add_key_name(unsigned key, char *p, char *buf, const char **); + virtual int file_browser_load_filesystem(Fl_File_Browser *browser, char *filename, Fl_File_Icon *icon); }; #endif // FL_POSIX_SYSTEM_DRIVER_H diff --git a/src/drivers/Posix/Fl_Posix_System_Driver.cxx b/src/drivers/Posix/Fl_Posix_System_Driver.cxx index 98897e41e..658587fe6 100644 --- a/src/drivers/Posix/Fl_Posix_System_Driver.cxx +++ b/src/drivers/Posix/Fl_Posix_System_Driver.cxx @@ -19,6 +19,8 @@ #include #include "Fl_Posix_System_Driver.H" #include "../../flstring.h" +#include +#include #include #include #include @@ -28,7 +30,33 @@ #include #include -// Pointers you can use to change FLTK to a foreign language. +#if defined(_AIX) +extern "C" { +# include +# include +# include + // Older AIX versions don't expose this prototype + int mntctl(int, int, char *); +} +#endif // _AIX + +#if defined(__NetBSD__) +extern "C" { +# include // For '__NetBSD_Version__' definition +# if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 300000000) +# include +# include +# if defined(HAVE_PTHREAD) && defined(HAVE_PTHREAD_H) +# include +# 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__ + +// Pointers you can use to change FLTK to another language. // Note: Similar pointers are defined in FL/fl_ask.H and src/fl_ask.cxx const char* fl_local_alt = "Alt"; const char* fl_local_ctrl = "Ctrl"; @@ -284,6 +312,130 @@ int Fl_Posix_System_Driver::open_uri(const char *uri, char *msg, int msglen) return run_program(command, argv, msg, msglen) != 0; } + + +int Fl_Posix_System_Driver::file_browser_load_filesystem(Fl_File_Browser *browser, char *filename, Fl_File_Icon *icon) +{ + int num_files = 0; +#if 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)); + browser->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 + browser->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)); + browser->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... + // + FILE *mtab; // /etc/mtab or /etc/mnttab file + char line[FL_PATH_MAX]; // Input line + + // + // Open the file that contains a list of mounted filesystems... + // + + mtab = fl_fopen("/etc/mnttab", "r"); // Fairly standard + if (mtab == NULL) + mtab = fl_fopen("/etc/mtab", "r"); // More standard + if (mtab == NULL) + mtab = fl_fopen("/etc/fstab", "r"); // Otherwise fallback to full list + if (mtab == NULL) + mtab = fl_fopen("/etc/vfstab", "r"); // Alternate full list file + + if (mtab != NULL) + { + while (fgets(line, sizeof(line), mtab) != NULL) + { + if (line[0] == '#' || line[0] == '\n') + continue; + if (sscanf(line, "%*s%4095s", filename) != 1) + continue; + + // 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); + browser->add(filename, icon); + num_files ++; + } + + 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. + browser->add("/", icon); + } +#endif // _AIX || ... + return num_files; +} + // // End of "$Id$". // diff --git a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H index 7d99c4548..0e6078faf 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H +++ b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.H @@ -77,6 +77,8 @@ public: virtual const char *filename_ext(const char *buf); virtual int open_uri(const char *uri, char *msg, int msglen); virtual int use_recent_tooltip_fix() {return 1;} + virtual int file_browser_load_filesystem(Fl_File_Browser *browser, char *filename, Fl_File_Icon *icon); + virtual int file_browser_load_directory(const char *directory, char *filename, dirent ***pfiles, Fl_File_Sort_F *sort); }; #endif // FL_WINAPI_SYSTEM_DRIVER_H diff --git a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx index 95d94dfca..89c62dbf7 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx +++ b/src/drivers/WinAPI/Fl_WinAPI_System_Driver.cxx @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include #include @@ -30,6 +32,15 @@ #include #include #include "../../flstring.h" +#include +// Apparently Borland C++ defines DIRECTORY in , which +// interfers with the Fl_File_Icon enumeration of the same name. +# ifdef DIRECTORY +# undef DIRECTORY +# endif // DIRECTORY +#ifdef __CYGWIN__ +# include +#endif inline int isdirsep(char c) { return c == '/' || c == '\\'; } @@ -665,6 +676,54 @@ int Fl_WinAPI_System_Driver::open_uri(const char *uri, char *msg, int msglen) return (int)(ShellExecute(HWND_DESKTOP, "open", uri, NULL, NULL, SW_SHOW) > (void *)32); } +int Fl_WinAPI_System_Driver::file_browser_load_filesystem(Fl_File_Browser *browser, char *filename, Fl_File_Icon *icon) +{ + int num_files = 0; +# ifdef __CYGWIN__ + // + // Cygwin provides an implementation of setmntent() to get the list + // of available drives... + // + FILE *m = setmntent("/-not-used-", "r"); + struct mntent *p; + while ((p = getmntent (m)) != NULL) { + browser->add(p->mnt_dir, icon); + num_files ++; + } + endmntent(m); +# else + // + // Normal WIN32 code uses drive bits... + // + DWORD drives; // Drive available bits + drives = GetLogicalDrives(); + for (int i = 'A'; i <= 'Z'; i ++, drives >>= 1) + if (drives & 1) + { + sprintf(filename, "%c:/", i); + if (i < 'C') // see also: GetDriveType and GetVolumeInformation in WIN32 + browser->add(filename, icon); + else + browser->add(filename, icon); + num_files ++; + } +# endif // __CYGWIN__ + return num_files; +} + +int Fl_WinAPI_System_Driver::file_browser_load_directory(const char *directory, char *filename, dirent ***pfiles, + Fl_File_Sort_F *sort) +{ + strlcpy(filename, directory, sizeof(filename)); + int i = (int) (strlen(filename) - 1); + if (i == 2 && filename[1] == ':' && + (filename[2] == '/' || filename[2] == '\\')) + filename[2] = '/'; + else if (filename[i] != '/' && filename[i] != '\\') + strlcat(filename, "/", sizeof(filename)); + return filename_list(filename, pfiles, sort); +} + // // End of "$Id$". // -- cgit v1.2.3