diff --git a/Makefile b/Makefile index 4484d67..cecc5f2 100644 --- a/Makefile +++ b/Makefile @@ -7,12 +7,14 @@ HDR = util.h arg.h ubase.h LIB = \ $(OS)/grabmntinfo.o \ $(OS)/syslog.o \ + $(OS)/umount.o \ util/eprintf.o \ util/estrtol.o SRC = \ df.c \ - dmesg.c + dmesg.c \ + umount.c OBJ = $(SRC:.c=.o) $(LIB) BIN = $(SRC:.c=) diff --git a/linux/umount.c b/linux/umount.c new file mode 100644 index 0000000..1eea1e0 --- /dev/null +++ b/linux/umount.c @@ -0,0 +1,14 @@ +#include +#include +#include "../ubase.h" +#include "../util.h" + +int +do_umount(const char *target, int opts) +{ + int flags = 0; + + if (opts & UBASE_MNT_FORCE) + flags |= MNT_FORCE; + return umount2(target, flags); +} diff --git a/openbsd/umount.c b/openbsd/umount.c new file mode 100644 index 0000000..660642e --- /dev/null +++ b/openbsd/umount.c @@ -0,0 +1,15 @@ +#include +#include +#include +#include "../ubase.h" +#include "../util.h" + +int +do_umount(const char *target, int opts) +{ + int flags = 0; + + if (opts & UBASE_MNT_FORCE) + flags |= MNT_FORCE; + return unmount(target, flags); +} diff --git a/ubase.h b/ubase.h index 5e6a692..48da769 100644 --- a/ubase.h +++ b/ubase.h @@ -11,3 +11,10 @@ int grabmntinfo(struct mntinfo **minfo); /* syslog.c */ int syslog_size(void); int syslog_read(void *buf, size_t n); + +/* umount.c */ +enum { + UBASE_MNT_FORCE = 1 << 0 +}; + +int do_umount(const char *target, int opts); diff --git a/umount.c b/umount.c new file mode 100644 index 0000000..cee553b --- /dev/null +++ b/umount.c @@ -0,0 +1,32 @@ +#include +#include "ubase.h" +#include "util.h" + +static void +usage(void) +{ + eprintf("usage: %s [-f] target\n", argv0); +} + +int +main(int argc, char *argv[]) { + int i; + int fflag = 0; + int ret = 0; + + ARGBEGIN { + case 'f': + fflag = UBASE_MNT_FORCE; + break; + default: + usage(); + } ARGEND; + if (argc < 1) + usage(); + for (i = 0; i < argc; i++) { + if (do_umount(argv[i], fflag) < 0) + eprintf("do_umount:"); + ret = 1; + } + return ret; +}