| Index: third_party/sqlite/sqlite-src-3100200/src/test_windirent.c
|
| diff --git a/third_party/sqlite/sqlite-src-3100200/src/test_windirent.c b/third_party/sqlite/sqlite-src-3100200/src/test_windirent.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..11d7dc07d02fd50534f51caaf8edd1703212d4a4
|
| --- /dev/null
|
| +++ b/third_party/sqlite/sqlite-src-3100200/src/test_windirent.c
|
| @@ -0,0 +1,157 @@
|
| +/*
|
| +** 2015 November 30
|
| +**
|
| +** The author disclaims copyright to this source code. In place of
|
| +** a legal notice, here is a blessing:
|
| +**
|
| +** May you do good and not evil.
|
| +** May you find forgiveness for yourself and forgive others.
|
| +** May you share freely, never taking more than you give.
|
| +**
|
| +*************************************************************************
|
| +** This file contains code to implement most of the opendir() family of
|
| +** POSIX functions on Win32 using the MSVCRT.
|
| +*/
|
| +
|
| +#if defined(_WIN32) && defined(_MSC_VER)
|
| +
|
| +#include "test_windirent.h"
|
| +
|
| +/*
|
| +** Implementation of the POSIX opendir() function using the MSVCRT.
|
| +*/
|
| +LPDIR opendir(
|
| + const char *dirname
|
| +){
|
| + struct _finddata_t data;
|
| + LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR));
|
| + SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]);
|
| +
|
| + if( dirp==NULL ) return NULL;
|
| + memset(dirp, 0, sizeof(DIR));
|
| +
|
| + /* TODO: Remove this if Unix-style root paths are not used. */
|
| + if( sqlite3_stricmp(dirname, "/")==0 ){
|
| + dirname = getenv("SystemDrive");
|
| + }
|
| +
|
| + _snprintf(data.name, namesize, "%s\\*", dirname);
|
| + dirp->d_handle = _findfirst(data.name, &data);
|
| +
|
| + if( dirp->d_handle==BAD_INTPTR_T ){
|
| + closedir(dirp);
|
| + return NULL;
|
| + }
|
| +
|
| + /* TODO: Remove this block to allow hidden and system files. */
|
| + if( data.attrib&_A_HIDDEN || data.attrib&_A_SYSTEM ){
|
| + if( _findnext(dirp->d_handle, &data)==-1 ){
|
| + closedir(dirp);
|
| + return NULL;
|
| + }
|
| + }
|
| +
|
| + dirp->d_first.d_attributes = data.attrib;
|
| + strncpy(dirp->d_first.d_name, data.name, NAME_MAX);
|
| + dirp->d_first.d_name[NAME_MAX] = '\0';
|
| +
|
| + return dirp;
|
| +}
|
| +
|
| +/*
|
| +** Implementation of the POSIX readdir() function using the MSVCRT.
|
| +*/
|
| +LPDIRENT readdir(
|
| + LPDIR dirp
|
| +){
|
| + struct _finddata_t data;
|
| +
|
| + if( dirp==NULL ) return NULL;
|
| +
|
| + if( dirp->d_first.d_ino==0 ){
|
| + dirp->d_first.d_ino++;
|
| + dirp->d_next.d_ino++;
|
| +
|
| + return &dirp->d_first;
|
| + }
|
| +
|
| +next:
|
| +
|
| + if( _findnext(dirp->d_handle, &data)==-1 ) return NULL;
|
| +
|
| + /* TODO: Remove this block to allow hidden and system files. */
|
| + if( data.attrib&_A_HIDDEN ) goto next;
|
| + if( data.attrib&_A_SYSTEM ) goto next;
|
| +
|
| + dirp->d_next.d_ino++;
|
| + dirp->d_next.d_attributes = data.attrib;
|
| + strncpy(dirp->d_next.d_name, data.name, NAME_MAX);
|
| + dirp->d_next.d_name[NAME_MAX] = '\0';
|
| +
|
| + return &dirp->d_next;
|
| +}
|
| +
|
| +/*
|
| +** Implementation of the POSIX readdir_r() function using the MSVCRT.
|
| +*/
|
| +INT readdir_r(
|
| + LPDIR dirp,
|
| + LPDIRENT entry,
|
| + LPDIRENT *result
|
| +){
|
| + struct _finddata_t data;
|
| +
|
| + if( dirp==NULL ) return EBADF;
|
| +
|
| + if( dirp->d_first.d_ino==0 ){
|
| + dirp->d_first.d_ino++;
|
| + dirp->d_next.d_ino++;
|
| +
|
| + entry->d_ino = dirp->d_first.d_ino;
|
| + entry->d_attributes = dirp->d_first.d_attributes;
|
| + strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX);
|
| + entry->d_name[NAME_MAX] = '\0';
|
| +
|
| + *result = entry;
|
| + return 0;
|
| + }
|
| +
|
| +next:
|
| +
|
| + if( _findnext(dirp->d_handle, &data)==-1 ){
|
| + *result = NULL;
|
| + return ENOENT;
|
| + }
|
| +
|
| + /* TODO: Remove this block to allow hidden and system files. */
|
| + if( data.attrib&_A_HIDDEN ) goto next;
|
| + if( data.attrib&_A_SYSTEM ) goto next;
|
| +
|
| + entry->d_ino = (ino_t)-1; /* not available */
|
| + entry->d_attributes = data.attrib;
|
| + strncpy(entry->d_name, data.name, NAME_MAX);
|
| + entry->d_name[NAME_MAX] = '\0';
|
| +
|
| + *result = entry;
|
| + return 0;
|
| +}
|
| +
|
| +/*
|
| +** Implementation of the POSIX closedir() function using the MSVCRT.
|
| +*/
|
| +INT closedir(
|
| + LPDIR dirp
|
| +){
|
| + INT result = 0;
|
| +
|
| + if( dirp==NULL ) return EINVAL;
|
| +
|
| + if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){
|
| + result = _findclose(dirp->d_handle);
|
| + }
|
| +
|
| + sqlite3_free(dirp);
|
| + return result;
|
| +}
|
| +
|
| +#endif /* defined(WIN32) && defined(_MSC_VER) */
|
|
|