ubase

suckless linux base utils
git clone git://git.suckless.org/ubase
Log | Files | Refs | README | LICENSE

umount.c (1404B)


      1 /* See LICENSE file for copyright and license details. */
      2 #include <sys/mount.h>
      3 
      4 #include <mntent.h>
      5 #include <stdio.h>
      6 #include <stdlib.h>
      7 #include <string.h>
      8 
      9 #include "util.h"
     10 
     11 static int
     12 umountall(int flags)
     13 {
     14 	FILE *fp;
     15 	struct mntent *me;
     16 	int ret = 0;
     17 	char **mntdirs = NULL;
     18 	int len = 0;
     19 
     20 	fp = setmntent("/proc/mounts", "r");
     21 	if (!fp)
     22 		eprintf("setmntent %s:", "/proc/mounts");
     23 	while ((me = getmntent(fp))) {
     24 		if (strcmp(me->mnt_type, "proc") == 0)
     25 			continue;
     26 		mntdirs = erealloc(mntdirs, ++len * sizeof(*mntdirs));
     27 		mntdirs[len - 1] = estrdup(me->mnt_dir);
     28 	}
     29 	endmntent(fp);
     30 	while (--len >= 0) {
     31 		if (umount2(mntdirs[len], flags) < 0) {
     32 			weprintf("umount2 %s:", mntdirs[len]);
     33 			ret = 1;
     34 		}
     35 		free(mntdirs[len]);
     36 	}
     37 	free(mntdirs);
     38 	return ret;
     39 }
     40 
     41 static void
     42 usage(void)
     43 {
     44 	weprintf("usage: %s [-lfn] target...\n", argv0);
     45 	weprintf("usage: %s -a [-lfn]\n", argv0);
     46 	exit(1);
     47 }
     48 
     49 int
     50 main(int argc, char *argv[])
     51 {
     52 	int i;
     53 	int aflag = 0;
     54 	int flags = 0;
     55 	int ret = 0;
     56 
     57 	ARGBEGIN {
     58 	case 'a':
     59 		aflag = 1;
     60 		break;
     61 	case 'f':
     62 		flags |= MNT_FORCE;
     63 		break;
     64 	case 'l':
     65 		flags |= MNT_DETACH;
     66 		break;
     67 	case 'n':
     68 		break;
     69 	default:
     70 		usage();
     71 	} ARGEND;
     72 
     73 	if (argc < 1 && aflag == 0)
     74 		usage();
     75 
     76 	if (aflag == 1)
     77 		return umountall(flags);
     78 
     79 	for (i = 0; i < argc; i++) {
     80 		if (umount2(argv[i], flags) < 0) {
     81 			weprintf("umount2 %s:", argv[i]);
     82 			ret = 1;
     83 		}
     84 	}
     85 	return ret;
     86 }