From 4f344e356d2c36c4b1df46917eaef25f82ca79a9 Mon Sep 17 00:00:00 2001 From: landley Date: Thu, 5 Oct 2006 16:18:03 -0400 Subject: Infrastructure, first drop of toy shell, and a bit of work on df. --- lib/functions.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/getmountlist.c | 39 ++++++++++++++++++++++++++++++++ lib/lib.h | 19 ++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 lib/functions.c create mode 100644 lib/getmountlist.c create mode 100644 lib/lib.h (limited to 'lib') diff --git a/lib/functions.c b/lib/functions.c new file mode 100644 index 00000000..3d9a8aca --- /dev/null +++ b/lib/functions.c @@ -0,0 +1,65 @@ +/* vi: set ts=4 :*/ +/* functions.c - reusable stuff. + * + * Functions with the x prefix never return failure, they either succeed or + * kill the program with an error message. + */ + +#include "toys.h" + +// Die with an error message. +void error_exit(char *msg, ...) +{ + va_list args; + + va_start(args, msg); + fprintf(stderr, "%s: ", toys.which->name); + vfprintf(stderr, msg, args); + va_end(args); + exit(toys.exitval); +} + +void strlcpy(char *dest, char *src, size_t size) +{ + strncpy(dest,src,size); + dest[size-1] = 0; +} + +// Die unless we can allocate memory. +void *xmalloc(size_t size) +{ + void *ret = malloc(size); + if (!ret) error_exit("xmalloc"); +} + +// Die unless we can copy this string. +void *xstrndup(char *s, size_t n) +{ + void *ret = xmalloc(++n); + strlcpy(ret, s, n); + + return ret; +} + +// Die unless we can exec argv[] +void *xexec(char **argv) +{ + execvp(argv[0], argv); + error_exit("No %s", argv[0]); +} + +// Die unless we can open/create a file, returning file descriptor. +int xopen(char *path, int flags, int mode) +{ + int fd = open(path, flags, mode); + if (fd == -1) error_exit("No file %s\n", path); + return fd; +} + +// Die unless we can open/create a file, returning FILE *. +FILE *xfopen(char *path, char *mode) +{ + FILE *f = fopen(path, mode); + if (!f) error_exit("No file %s\n", path); + return f; +} diff --git a/lib/getmountlist.c b/lib/getmountlist.c new file mode 100644 index 00000000..a2b0698d --- /dev/null +++ b/lib/getmountlist.c @@ -0,0 +1,39 @@ +/* vi: set ts=4 : */ + +#include "toys.h" + +#include + +char *path_mounts = "/proc/mounts"; + +// Get a list of mount points from /etc/mtab or /proc/mounts. This returns +// a reversed list, which is good for finding overmounts and such. + +struct mtab_list *getmountlist(int die) +{ + FILE *fp; + struct mtab_list *mtlist, *mt; + struct mntent me; + char evilbuf[2*PATH_MAX]; + + mtlist = 0; + if (!(fp = setmntent(path_mounts, "r"))) { + if (die) error_exit("cannot open %s", path_mounts); + } else { + while (getmntent_r(fp, &me, evilbuf, sizeof(evilbuf))) { + char *str; + + mt = xmalloc(sizeof(struct mtab_list) + strlen(me.mnt_fsname) + + strlen(me.mnt_dir) + strlen(me.mnt_type) + 3); + mt->next = mtlist; + strcpy(mt->type, me.mnt_type); + mt->dir = mt->type + strlen(mt->type) + 1; + strcpy(mt->dir, me.mnt_dir); + mt->device = mt->dir + strlen(mt->dir) + 1; + mt->device = ++str; + strcpy(str, me.mnt_fsname); + mtlist = mt; + } + } + return mtlist; +} diff --git a/lib/lib.h b/lib/lib.h new file mode 100644 index 00000000..fa24c8d5 --- /dev/null +++ b/lib/lib.h @@ -0,0 +1,19 @@ +/* vi: set ts=4 :*/ + +void error_exit(char *msg, ...); +void strlcpy(char *dest, char *src, size_t size); +void *xmalloc(size_t size); +void *xstrndup(char *s, size_t n); +void *xexec(char **argv); +int xopen(char *path, int flags, int mode); +FILE *xfopen(char *path, char *mode); + +struct mtab_list { + struct mtab_list *next; + char *dir; + char *device; + char type[0]; +}; + +struct mtab_list *getmountlist(int die); + -- cgit v1.2.3