192af1ebcSmistachkin /* 292af1ebcSmistachkin ** 2015 November 30 392af1ebcSmistachkin ** 492af1ebcSmistachkin ** The author disclaims copyright to this source code. In place of 592af1ebcSmistachkin ** a legal notice, here is a blessing: 692af1ebcSmistachkin ** 792af1ebcSmistachkin ** May you do good and not evil. 892af1ebcSmistachkin ** May you find forgiveness for yourself and forgive others. 992af1ebcSmistachkin ** May you share freely, never taking more than you give. 1092af1ebcSmistachkin ** 1192af1ebcSmistachkin ************************************************************************* 1292af1ebcSmistachkin ** This file contains declarations for most of the opendir() family of 1392af1ebcSmistachkin ** POSIX functions on Win32 using the MSVCRT. 1492af1ebcSmistachkin */ 1592af1ebcSmistachkin 1603491a1aSdrh #if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H) 1703491a1aSdrh #define SQLITE_WINDIRENT_H 1892af1ebcSmistachkin 1992af1ebcSmistachkin /* 2092af1ebcSmistachkin ** We need several data types from the Windows SDK header. 2192af1ebcSmistachkin */ 2292af1ebcSmistachkin 23*176b3a09Smistachkin #ifndef WIN32_LEAN_AND_MEAN 2492af1ebcSmistachkin #define WIN32_LEAN_AND_MEAN 25*176b3a09Smistachkin #endif 26*176b3a09Smistachkin 2792af1ebcSmistachkin #include "windows.h" 2892af1ebcSmistachkin 2992af1ebcSmistachkin /* 3092af1ebcSmistachkin ** We need several support functions from the SQLite core. 3192af1ebcSmistachkin */ 3292af1ebcSmistachkin 3392af1ebcSmistachkin #include "sqlite3.h" 3492af1ebcSmistachkin 3592af1ebcSmistachkin /* 3692af1ebcSmistachkin ** We need several things from the ANSI and MSVCRT headers. 3792af1ebcSmistachkin */ 3892af1ebcSmistachkin 3992af1ebcSmistachkin #include <stdio.h> 4092af1ebcSmistachkin #include <stdlib.h> 4192af1ebcSmistachkin #include <errno.h> 4292af1ebcSmistachkin #include <io.h> 4392af1ebcSmistachkin #include <limits.h> 44dfdfd8c7Smistachkin #include <sys/types.h> 45dfdfd8c7Smistachkin #include <sys/stat.h> 46dfdfd8c7Smistachkin 47dfdfd8c7Smistachkin /* 48dfdfd8c7Smistachkin ** We may need several defines that should have been in "sys/stat.h". 49dfdfd8c7Smistachkin */ 50dfdfd8c7Smistachkin 51dfdfd8c7Smistachkin #ifndef S_ISREG 52dfdfd8c7Smistachkin #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) 53dfdfd8c7Smistachkin #endif 54dfdfd8c7Smistachkin 55dfdfd8c7Smistachkin #ifndef S_ISDIR 56dfdfd8c7Smistachkin #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 57dfdfd8c7Smistachkin #endif 58dfdfd8c7Smistachkin 59dfdfd8c7Smistachkin #ifndef S_ISLNK 60dfdfd8c7Smistachkin #define S_ISLNK(mode) (0) 61dfdfd8c7Smistachkin #endif 62dfdfd8c7Smistachkin 63dfdfd8c7Smistachkin /* 64dfdfd8c7Smistachkin ** We may need to provide the "mode_t" type. 65dfdfd8c7Smistachkin */ 66dfdfd8c7Smistachkin 67dfdfd8c7Smistachkin #ifndef MODE_T_DEFINED 68dfdfd8c7Smistachkin #define MODE_T_DEFINED 69dfdfd8c7Smistachkin typedef unsigned short mode_t; 70dfdfd8c7Smistachkin #endif 7192af1ebcSmistachkin 7292af1ebcSmistachkin /* 7392af1ebcSmistachkin ** We may need to provide the "ino_t" type. 7492af1ebcSmistachkin */ 7592af1ebcSmistachkin 7692af1ebcSmistachkin #ifndef INO_T_DEFINED 7792af1ebcSmistachkin #define INO_T_DEFINED 7892af1ebcSmistachkin typedef unsigned short ino_t; 7992af1ebcSmistachkin #endif 8092af1ebcSmistachkin 8192af1ebcSmistachkin /* 8292af1ebcSmistachkin ** We need to define "NAME_MAX" if it was not present in "limits.h". 8392af1ebcSmistachkin */ 8492af1ebcSmistachkin 8592af1ebcSmistachkin #ifndef NAME_MAX 8692af1ebcSmistachkin # ifdef FILENAME_MAX 8792af1ebcSmistachkin # define NAME_MAX (FILENAME_MAX) 8892af1ebcSmistachkin # else 8992af1ebcSmistachkin # define NAME_MAX (260) 9092af1ebcSmistachkin # endif 9192af1ebcSmistachkin #endif 9292af1ebcSmistachkin 9392af1ebcSmistachkin /* 9492af1ebcSmistachkin ** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T". 9592af1ebcSmistachkin */ 9692af1ebcSmistachkin 9792af1ebcSmistachkin #ifndef NULL_INTPTR_T 9892af1ebcSmistachkin # define NULL_INTPTR_T ((intptr_t)(0)) 9992af1ebcSmistachkin #endif 10092af1ebcSmistachkin 10192af1ebcSmistachkin #ifndef BAD_INTPTR_T 10292af1ebcSmistachkin # define BAD_INTPTR_T ((intptr_t)(-1)) 10392af1ebcSmistachkin #endif 10492af1ebcSmistachkin 10592af1ebcSmistachkin /* 10692af1ebcSmistachkin ** We need to provide the necessary structures and related types. 10792af1ebcSmistachkin */ 10892af1ebcSmistachkin 109dfdfd8c7Smistachkin #ifndef DIRENT_DEFINED 110dfdfd8c7Smistachkin #define DIRENT_DEFINED 11192af1ebcSmistachkin typedef struct DIRENT DIRENT; 11292af1ebcSmistachkin typedef DIRENT *LPDIRENT; 11392af1ebcSmistachkin struct DIRENT { 11492af1ebcSmistachkin ino_t d_ino; /* Sequence number, do not use. */ 11592af1ebcSmistachkin unsigned d_attributes; /* Win32 file attributes. */ 11692af1ebcSmistachkin char d_name[NAME_MAX + 1]; /* Name within the directory. */ 11792af1ebcSmistachkin }; 118dfdfd8c7Smistachkin #endif 11992af1ebcSmistachkin 120dfdfd8c7Smistachkin #ifndef DIR_DEFINED 121dfdfd8c7Smistachkin #define DIR_DEFINED 122dfdfd8c7Smistachkin typedef struct DIR DIR; 123dfdfd8c7Smistachkin typedef DIR *LPDIR; 12492af1ebcSmistachkin struct DIR { 12592af1ebcSmistachkin intptr_t d_handle; /* Value returned by "_findfirst". */ 12692af1ebcSmistachkin DIRENT d_first; /* DIRENT constructed based on "_findfirst". */ 12792af1ebcSmistachkin DIRENT d_next; /* DIRENT constructed based on "_findnext". */ 12892af1ebcSmistachkin }; 129dfdfd8c7Smistachkin #endif 130dfdfd8c7Smistachkin 13192af1ebcSmistachkin /* 132aac853baSmistachkin ** Provide a macro, for use by the implementation, to determine if a 133aac853baSmistachkin ** particular directory entry should be skipped over when searching for 134aac853baSmistachkin ** the next directory entry that should be returned by the readdir() or 135aac853baSmistachkin ** readdir_r() functions. 136aac853baSmistachkin */ 137aac853baSmistachkin 138aac853baSmistachkin #ifndef is_filtered 139aac853baSmistachkin # define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM)) 140aac853baSmistachkin #endif 141aac853baSmistachkin 142aac853baSmistachkin /* 1437dd7d98bSmistachkin ** Provide the function prototype for the POSIX compatiable getenv() 1447dd7d98bSmistachkin ** function. This function is not thread-safe. 1457dd7d98bSmistachkin */ 1467dd7d98bSmistachkin 1477dd7d98bSmistachkin extern const char *windirent_getenv(const char *name); 1487dd7d98bSmistachkin 1497dd7d98bSmistachkin /* 15092af1ebcSmistachkin ** Finally, we can provide the function prototypes for the opendir(), 15192af1ebcSmistachkin ** readdir(), readdir_r(), and closedir() POSIX functions. 15292af1ebcSmistachkin */ 15392af1ebcSmistachkin 15492af1ebcSmistachkin extern LPDIR opendir(const char *dirname); 15592af1ebcSmistachkin extern LPDIRENT readdir(LPDIR dirp); 15692af1ebcSmistachkin extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result); 15792af1ebcSmistachkin extern INT closedir(LPDIR dirp); 15892af1ebcSmistachkin 15992af1ebcSmistachkin #endif /* defined(WIN32) && defined(_MSC_VER) */ 160