--- samba-3.0.24/source/client/smbumount.c +++ samba-3.0.24/source/client/smbumount.c @@ -101,17 +101,51 @@ canonicalize (char *path) return canonical; } +enum m_flags_type { + m_flag_f = 1, + m_flag_n = 2, + m_flag_l = 4, + m_flag_r = 8, + m_flag_v = 16 +}; int main(int argc, char *argv[]) { - int fd; - char* mount_point; - struct mntent *mnt; - FILE* mtab; - FILE* new_mtab; + int i; + enum m_flags_type flags = 0; + const char *prog = "/bin/umount"; + char *mount_point, *args[9]; - if (argc != 2) { + if (argc < 2) { + usage(); + exit(1); + } + + while ((i = getopt(argc, argv, "flnrv")) != -1) { + switch (i) { + case 'f': + flags |= m_flag_f; + break; + case 'l': + flags |= m_flag_l; + break; + case 'n': + flags |= m_flag_n; + break; + case 'r': + flags |= m_flag_r; + break; + case 'v': + flags |= m_flag_v; + break; + default: + usage(); + exit(1); + } + } + + if (argc != optind + 1) { usage(); exit(1); } @@ -121,7 +155,7 @@ main(int argc, char *argv[]) exit(1); } - mount_point = canonicalize(argv[1]); + mount_point = canonicalize(argv[optind]); if (mount_point == NULL) { @@ -132,6 +166,27 @@ main(int argc, char *argv[]) exit(1); } + i = 0; + args[i++] = "/bin/umount"; + args[i++] = mount_point; + args[i++] = "-i"; + if (flags & m_flag_f) + args[i++] = "-f"; + if (flags & m_flag_n) + args[i++] = "-n"; + if (flags & m_flag_l) + args[i++] = "-l"; + if (flags & m_flag_r) + args[i++] = "-r"; + if (flags & m_flag_v) + args[i++] = "-v"; + args[i] = NULL; + + if (setuid(geteuid()) == 0) + execv(prog, args); + + return 1; +#if 0 if (umount(mount_point) != 0) { fprintf(stderr, "Could not umount %s: %s\n", mount_point, strerror(errno)); @@ -189,4 +244,5 @@ main(int argc, char *argv[]) } return 0; +#endif }