aboutsummaryrefslogtreecommitdiff
path: root/net/sharity-light/files/unshlight.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sharity-light/files/unshlight.c')
-rw-r--r--net/sharity-light/files/unshlight.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/net/sharity-light/files/unshlight.c b/net/sharity-light/files/unshlight.c
new file mode 100644
index 000000000000..e167b3611687
--- /dev/null
+++ b/net/sharity-light/files/unshlight.c
@@ -0,0 +1,73 @@
+#include <sys/param.h>
+#include <sys/mount.h>
+
+#include <err.h>
+#include <sysexits.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <signal.h>
+
+static void usage(void);
+
+int
+main(int argc, char** argv)
+{
+ struct statfs* mntbuf;
+ int mntcount, i;
+ int aflag=0;
+ int ch;
+
+ while ( (ch = getopt(argc, argv, "a")) != -1) {
+ switch (ch) {
+ case 'a':
+ aflag=1;
+ break;
+ case '?':
+ default:
+ usage();
+ }
+ }
+ argc -= optind;
+ argv += optind;
+ if (aflag && argc != 0)
+ usage();
+ if (!aflag && argc == 0)
+ usage();
+
+ for (; argc>0 || aflag; aflag?(void)(aflag=0):(void)(argc--, argv++)) {
+ char abspath[MAXPATHLEN];
+ pid_t pid=0;
+ if (argc > 0) {
+ if (realpath(argv[0], abspath) == 0) {
+ warn(abspath);
+ continue;
+ }
+ }
+ mntcount=getmntinfo(&mntbuf, MNT_NOWAIT);
+ if (mntcount < 0)
+ err(EX_OSERR, "getmntinfo");
+ for (i=0; i<mntcount; i++) {
+ char* s;
+ int error;
+ if (argc > 0 && strcmp(abspath, mntbuf[i].f_mntonname) != 0) continue;
+ if (mntbuf[i].f_type != MOUNT_NFS) continue;
+ if (strncmp(mntbuf[i].f_mntfromname, "shlight-", 8) != 0) continue;
+ pid=strtoul(mntbuf[i].f_mntfromname+8, &s, 10);
+ if (*s) continue;
+ error = unmount (mntbuf[i].f_mntonname, 0);
+ if (error == 0) {
+ kill (pid, SIGHUP);
+ } else {
+ warn(mntbuf[i].f_mntonname);
+ }
+ }
+ if (argc > 0 && !pid)
+ warnx("%s: not currently mounted", abspath);
+ }
+}
+
+void
+usage(void)
+{
+ errx(EX_USAGE, "Usage: unshlight [-a] [node]");
+}