diff options
Diffstat (limited to 'extension/filefuncs.c')
-rw-r--r-- | extension/filefuncs.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/extension/filefuncs.c b/extension/filefuncs.c index 86e60321..83141685 100644 --- a/extension/filefuncs.c +++ b/extension/filefuncs.c @@ -126,13 +126,16 @@ static long long get_inode(const char *fname) { HANDLE fh; + BOOL ok; BY_HANDLE_FILE_INFORMATION info; fh = CreateFile(fname, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (fh == INVALID_HANDLE_VALUE) return 0; - if (GetFileInformationByHandle(fh, &info)) { + ok = GetFileInformationByHandle(fh, &info); + CloseHandle(fh); + if (ok) { long long inode = info.nFileIndexHigh; inode <<= 32; @@ -403,7 +406,8 @@ fill_stat_array(const char *name, awk_array_t array, struct stat *sbuf) array_set_numeric(array, "gid", sbuf->st_gid); array_set_numeric(array, "size", sbuf->st_size); #ifdef __MINGW32__ - array_set_numeric(array, "blocks", (sbuf->st_size + 4095) / 4096); + array_set_numeric(array, "blocks", (double)((sbuf->st_size + + device_blocksize() - 1) / device_blocksize())); #else array_set_numeric(array, "blocks", sbuf->st_blocks); #endif @@ -568,6 +572,7 @@ init_filefuncs(void) #ifndef __MINGW32__ /* at least right now, only FTS needs initializing */ +#define FTS_NON_RECURSIVE FTS_STOP /* Don't step into directories. */ static struct flagtab { const char *name; int value; @@ -579,7 +584,7 @@ init_filefuncs(void) ENTRY(FTS_PHYSICAL), ENTRY(FTS_SEEDOT), ENTRY(FTS_XDEV), - ENTRY(FTS_SKIP), + {"FTS_SKIP", FTS_NON_RECURSIVE}, { NULL, 0 } }; @@ -836,7 +841,7 @@ do_fts(int nargs, awk_value_t *result, struct awk_ext_func *unused) int ret = -1; static const int mask = ( FTS_COMFOLLOW | FTS_LOGICAL | FTS_NOCHDIR | FTS_PHYSICAL - | FTS_SEEDOT | FTS_XDEV | FTS_SKIP); + | FTS_SEEDOT | FTS_XDEV | FTS_NON_RECURSIVE); assert(result != NULL); fts_errors = 0; /* ensure a fresh start */ @@ -886,6 +891,9 @@ do_fts(int nargs, awk_value_t *result, struct awk_ext_func *unused) } flags &= mask; /* turn off anything else */ + if (flags & FTS_NON_RECURSIVE) + flags |= FTS_NOCHDIR; + /* make pathvector */ count = path_array->count + 1; ezalloc(pathvector, char **, count * sizeof(char *), "do_fts"); @@ -900,8 +908,11 @@ do_fts(int nargs, awk_value_t *result, struct awk_ext_func *unused) assert(clear_array(dest.array_cookie)); /* let's do it! */ - if ((hierarchy = fts_open(pathvector, flags, NULL)) != NULL) { - process(hierarchy, dest.array_cookie, (flags & FTS_SEEDOT) != 0, (flags & FTS_SKIP) != 0); + hierarchy = fts_open(pathvector, flags & ~FTS_NON_RECURSIVE, NULL); + if (hierarchy != NULL) { + process(hierarchy, dest.array_cookie, + (flags & FTS_SEEDOT) != 0, + (flags & FTS_NON_RECURSIVE) != 0); fts_close(hierarchy); if (fts_errors == 0) |