aboutsummaryrefslogtreecommitdiffstats
path: root/extension/filefuncs.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2020-06-10 06:10:04 +0300
committerArnold D. Robbins <arnold@skeeve.com>2020-06-10 17:48:50 +0300
commit17d03a4deb7ed18abb4e0e590e6315050d9c29fd (patch)
tree324feeb1e3568042fe9e2f73ebd6d63296781cf7 /extension/filefuncs.c
parent5aae00200fc44bdfefbb497cf57eb23a9d2517be (diff)
downloadegawk-17d03a4deb7ed18abb4e0e590e6315050d9c29fd.tar.gz
egawk-17d03a4deb7ed18abb4e0e590e6315050d9c29fd.tar.bz2
egawk-17d03a4deb7ed18abb4e0e590e6315050d9c29fd.zip
Add mbuilov fixes. Still needs review.
Diffstat (limited to 'extension/filefuncs.c')
-rw-r--r--extension/filefuncs.c23
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)