aboutsummaryrefslogtreecommitdiffstats
path: root/extension/filefuncs.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2016-01-20 22:10:55 +0200
committerArnold D. Robbins <arnold@skeeve.com>2016-01-20 22:10:55 +0200
commit1d6a3c76050a14364b49ec8db05464b0cf003921 (patch)
tree84e00c6bfe941bdaf54461b3230c092d3e487c90 /extension/filefuncs.c
parent30d665adea53e84ee232e04450c91e59a0b3d90c (diff)
downloadegawk-1d6a3c76050a14364b49ec8db05464b0cf003921.tar.gz
egawk-1d6a3c76050a14364b49ec8db05464b0cf003921.tar.bz2
egawk-1d6a3c76050a14364b49ec8db05464b0cf003921.zip
Add (undocumented) statvfs extension function.
Diffstat (limited to 'extension/filefuncs.c')
-rw-r--r--extension/filefuncs.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/extension/filefuncs.c b/extension/filefuncs.c
index 1441cb31..ae4f7c3d 100644
--- a/extension/filefuncs.c
+++ b/extension/filefuncs.c
@@ -6,6 +6,7 @@
* Arnold Robbins and John Haque, update for 3.1.4, applied Mon Jun 14 13:55:30 IDT 2004
* Arnold Robbins and Andrew Schorr, revised for new extension API, May 2012.
* Arnold Robbins, add fts(), August 2012
+ * Arnold Robbins, add statvfs(), November 2015
*/
/*
@@ -84,6 +85,10 @@
#include <sys/sysmacros.h>
#endif
+#if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS)
+#include <sys/statvfs.h>
+#endif
+
#include "gawkapi.h"
#include "gettext.h"
@@ -502,6 +507,64 @@ do_stat(int nargs, awk_value_t *result)
return make_number(ret, result);
}
+#if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS)
+
+/* do_statvfs --- provide a statvfs() function for gawk */
+
+static awk_value_t *
+do_statvfs(int nargs, awk_value_t *result)
+{
+ awk_value_t file_param, array_param;
+ char *name;
+ awk_array_t array;
+ int ret;
+ struct statvfs vfsbuf;
+
+ assert(result != NULL);
+
+ if (nargs != 2) {
+ if (do_lint)
+ lintwarn(ext_id, _("statvfs: called with wrong number of arguments"));
+ return make_number(-1, result);
+ }
+
+ /* file is first arg, array to hold results is second */
+ if ( ! get_argument(0, AWK_STRING, & file_param)
+ || ! get_argument(1, AWK_ARRAY, & array_param)) {
+ warning(ext_id, _("stat: bad parameters"));
+ return make_number(-1, result);
+ }
+
+ name = file_param.str_value.str;
+ array = array_param.array_cookie;
+
+ /* always empty out the array */
+ clear_array(array);
+
+ /* stat the file; if error, set ERRNO and return */
+ ret = statvfs(name, & vfsbuf);
+ if (ret < 0) {
+ update_ERRNO_int(errno);
+ return make_number(ret, result);
+ }
+
+ array_set_numeric(array, "bsize", vfsbuf.f_bsize); /* filesystem block size */
+ array_set_numeric(array, "frsize", vfsbuf.f_frsize); /* fragment size */
+ array_set_numeric(array, "blocks", vfsbuf.f_blocks); /* size of fs in f_frsize units */
+ array_set_numeric(array, "bfree", vfsbuf.f_bfree); /* # free blocks */
+ array_set_numeric(array, "bavail", vfsbuf.f_bavail); /* # free blocks for unprivileged users */
+ array_set_numeric(array, "files", vfsbuf.f_files); /* # inodes */
+ array_set_numeric(array, "ffree", vfsbuf.f_ffree); /* # free inodes */
+ array_set_numeric(array, "favail", vfsbuf.f_favail); /* # free inodes for unprivileged users */
+ array_set_numeric(array, "fsid", vfsbuf.f_fsid); /* filesystem ID */
+ array_set_numeric(array, "flag", vfsbuf.f_flag); /* mount flags */
+ array_set_numeric(array, "namemax", vfsbuf.f_namemax); /* maximum filename length */
+
+
+ return make_number(ret, result);
+}
+#endif
+
/* init_filefuncs --- initialization routine */
static awk_bool_t
@@ -868,6 +931,9 @@ static awk_ext_func_t func_table[] = {
#ifndef __MINGW32__
{ "fts", do_fts, 3 },
#endif
+#if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS)
+ { "statvfs", do_statvfs, 2 },
+#endif
};