aboutsummaryrefslogtreecommitdiffstats
path: root/extension
diff options
context:
space:
mode:
Diffstat (limited to 'extension')
-rw-r--r--extension/filefuncs.c23
-rw-r--r--extension/gawkfts.c5
-rw-r--r--extension/readdir.c5
-rw-r--r--extension/rwarray0.c2
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 */