#define _MOUNT_C #include #include #include #include #include #include #include #include "config.h" static int parse_fstab(unsigned long flag) { FILE *fp = setmntent(MOUNT_CFG, "r"); if (fp == NULL) { fprintf(stderr, "umount: %s\n", strerror(errno)); return 1; } struct mntent *me; int ret = 0; while ((me = getmntent(fp))) { puts(me->mnt_dir); if (umount2(me->mnt_dir, flag) < 0) { fprintf(stderr, "umount: %s: %s\n", me->mnt_dir, strerror(errno)); ret = 1; } } endmntent(fp); return ret; } int main(int argc, char **argv) { unsigned long flag = 0; int opt; while ((opt = getopt(argc, argv, "afl")) != -1) { switch (opt) { case 'a': return parse_fstab(flag); case 'f': flag |= MNT_FORCE; break; case 'l': flag |= MNT_DETACH; break; default: puts("umount [afl] [dst1 dst2...]\n\t-a Umount all\n\t-f Force umount\n\t-l Lazy umount"); return 0; } } argv += optind; argc -= optind; int ret = 0; for (int i = 0; i < argc; i++) { if (umount2(argv[i], flag) < 0) { fprintf(stderr, "umount: %s: %s\n", argv[i], strerror(errno)); ret = 1; } } return ret; }