aboutsummaryrefslogtreecommitdiffstats
path: root/extension/filefuncs.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2013-05-29 22:15:50 +0300
committerArnold D. Robbins <arnold@skeeve.com>2013-05-29 22:15:50 +0300
commit407dddb6e9b24c2ca139ec84f8e3f541fbb18451 (patch)
tree5449b737a7cff3849bed90db7921dc124f4cf962 /extension/filefuncs.c
parentacd80efad346d9d7dbed9aa3380d8f77eda0ed56 (diff)
downloadegawk-407dddb6e9b24c2ca139ec84f8e3f541fbb18451.tar.gz
egawk-407dddb6e9b24c2ca139ec84f8e3f541fbb18451.tar.bz2
egawk-407dddb6e9b24c2ca139ec84f8e3f541fbb18451.zip
Add "devbsize" to stat extension and doc.
Diffstat (limited to 'extension/filefuncs.c')
-rw-r--r--extension/filefuncs.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/extension/filefuncs.c b/extension/filefuncs.c
index 9d4b2258..0afed056 100644
--- a/extension/filefuncs.c
+++ b/extension/filefuncs.c
@@ -45,6 +45,9 @@
#include <sys/types.h>
#include <sys/stat.h>
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif /* HAVE_SYS_PARAM_H */
#include "gawkapi.h"
@@ -265,6 +268,31 @@ read_symlink(const char *fname, size_t bufsize, ssize_t *linksize)
return NULL;
}
+
+/* device_blocksize --- try to figure out units of st_blocks */
+
+static int
+device_blocksize()
+{
+ /* some of this derived from GNULIB stat-size.h */
+#if defined(DEV_BSIZE)
+ /* <sys/param.h>, most systems */
+ return DEV_BSIZE;
+#elif defined(S_BLKSIZE)
+ /* <sys/stat.h>, BSD systems */
+ return S_BLKSIZE;
+#elif defined hpux || defined __hpux__ || defined __hpux
+ return 1024;
+#elif defined _AIX && defined _I386
+ /* AIX PS/2 counts st_blocks in 4K units. */
+ return 4 * 1024;
+#elif defined __MINGW32__
+ return 1024;
+#else
+ return 512;
+#endif
+}
+
/* array_set --- set an array element */
static void
@@ -357,6 +385,9 @@ fill_stat_array(const char *name, awk_array_t array, struct stat *sbuf)
array_set_numeric(array, "blksize", 4096);
#endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
+ /* the size of a block for st_blocks */
+ array_set_numeric(array, "devbsize", device_blocksize());
+
pmode = format_mode(sbuf->st_mode);
array_set(array, "pmode", make_const_string(pmode, strlen(pmode), & tmp));