diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2016-01-20 22:10:55 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2016-01-20 22:10:55 +0200 |
commit | 1d6a3c76050a14364b49ec8db05464b0cf003921 (patch) | |
tree | 84e00c6bfe941bdaf54461b3230c092d3e487c90 /extension/filefuncs.c | |
parent | 30d665adea53e84ee232e04450c91e59a0b3d90c (diff) | |
download | egawk-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.c | 66 |
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 }; |