aboutsummaryrefslogtreecommitdiffstats
path: root/extension/filefuncs.c
diff options
context:
space:
mode:
authorJuergen Kahrs <Juergen.Kahrs@googlemail.com>2013-05-16 21:08:20 +0200
committerJuergen Kahrs <Juergen.Kahrs@googlemail.com>2013-05-16 21:08:20 +0200
commit98ecd5e8c7b6c83b8c794050249b445dfea17334 (patch)
treebebd47cf502ca7ffcf4f013bf0aa5d6c42339963 /extension/filefuncs.c
parent57fe811dd036e276abd30eed3aac135df7e362ab (diff)
parent403350c2b25551c749e2310556ba2f63e271042b (diff)
downloadegawk-98ecd5e8c7b6c83b8c794050249b445dfea17334.tar.gz
egawk-98ecd5e8c7b6c83b8c794050249b445dfea17334.tar.bz2
egawk-98ecd5e8c7b6c83b8c794050249b445dfea17334.zip
Merge remote-tracking branch 'origin/master' into cmake
Diffstat (limited to 'extension/filefuncs.c')
-rw-r--r--extension/filefuncs.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/extension/filefuncs.c b/extension/filefuncs.c
index 1e8fc8d0..5117b32f 100644
--- a/extension/filefuncs.c
+++ b/extension/filefuncs.c
@@ -73,6 +73,29 @@
#define S_ISVTX 0
#define major(s) (s)
#define minor(s) (0)
+
+#include <windows.h>
+
+/* get_inode --- get the inode of a file */
+static long long
+get_inode(const char *fname)
+{
+ HANDLE fh;
+ 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)) {
+ long long inode = info.nFileIndexHigh;
+
+ inode <<= 32;
+ inode += info.nFileIndexLow;
+ return inode;
+ }
+ return 0;
+}
#endif
static const gawk_api_t *api; /* for convenience macros to work */
@@ -302,7 +325,11 @@ fill_stat_array(const char *name, awk_array_t array, struct stat *sbuf)
/* fill in the array */
array_set(array, "name", make_const_string(name, strlen(name), & tmp));
array_set_numeric(array, "dev", sbuf->st_dev);
+#ifdef _WIN32
+ array_set_numeric(array, "ino", (double)get_inode (name));
+#else
array_set_numeric(array, "ino", sbuf->st_ino);
+#endif
array_set_numeric(array, "mode", sbuf->st_mode);
array_set_numeric(array, "nlink", sbuf->st_nlink);
array_set_numeric(array, "uid", sbuf->st_uid);
@@ -326,6 +353,8 @@ fill_stat_array(const char *name, awk_array_t array, struct stat *sbuf)
#ifdef HAVE_ST_BLKSIZE
array_set_numeric(array, "blksize", sbuf->st_blksize);
+#elif defined(_WIN32)
+ array_set_numeric(array, "blksize", 4096);
#endif /* HAVE_ST_BLKSIZE */
pmode = format_mode(sbuf->st_mode);