diff options
Diffstat (limited to 'extension')
-rw-r--r-- | extension/filefuncs.c | 23 | ||||
-rw-r--r-- | extension/gawkfts.c | 5 | ||||
-rw-r--r-- | extension/readdir.c | 5 | ||||
-rw-r--r-- | extension/rwarray0.c | 2 |
4 files changed, 26 insertions, 9 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) diff --git a/extension/gawkfts.c b/extension/gawkfts.c index c7fbc17d..2e7ab688 100644 --- a/extension/gawkfts.c +++ b/extension/gawkfts.c @@ -228,7 +228,7 @@ fts_open(char * const *argv, int options, * so that everything about the "current" node is ignored. */ if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL) - goto mem3; + goto mem4; sp->fts_cur->fts_link = root; sp->fts_cur->fts_info = FTS_INIT; @@ -252,6 +252,8 @@ fts_open(char * const *argv, int options, return (sp); +mem4: if (sp->fts_array != NULL) + free(sp->fts_array); mem3: fts_lfree(root); fts_free(parent); mem2: free(sp->fts_path); @@ -916,6 +918,7 @@ mem1: saved_errno = errno; (cur->fts_level == FTS_ROOTLEVEL ? FCHDIR(sp, sp->fts_rfd) : fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) { + fts_lfree(head); cur->fts_info = FTS_ERR; SET(FTS_STOP); return (NULL); diff --git a/extension/readdir.c b/extension/readdir.c index cc1cd505..fb739754 100644 --- a/extension/readdir.c +++ b/extension/readdir.c @@ -144,6 +144,7 @@ get_inode(struct dirent *entry, const char *dirname) #ifdef __MINGW32__ char fname[PATH_MAX]; HANDLE fh; + BOOL ok; BY_HANDLE_FILE_INFORMATION info; sprintf(fname, "%s\\%s", dirname, entry->d_name); @@ -151,7 +152,9 @@ get_inode(struct dirent *entry, const char *dirname) 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; diff --git a/extension/rwarray0.c b/extension/rwarray0.c index 5298bea3..72a376c1 100644 --- a/extension/rwarray0.c +++ b/extension/rwarray0.c @@ -425,7 +425,7 @@ read_value(int fd, awk_value_t *value) if (code == 2) { awk_array_t array = create_array(); - if (read_array(fd, array) != 0) + if (! read_array(fd, array)) return awk_false; /* hook into value */ |