ALT Linux repositórios
S: | 4.17.11-alt1 |
5.0: | 3.0.33-alt4 |
4.1: | 3.0.30-alt3 |
4.0: | 3.0.33-alt1.M40.1 |
+updates: | 3.0.33-alt1.M40.1 |
3.0: | 3.0.14a-alt2 |
+backports: | 3.0.28-alt1 |
Group :: Sistema/Servidores
RPM: samba
Main Changelog Spec Patches Sources Download Gear Bugs e FR Repocop
Patch: smbumount-3.0.24-alt-options.patch
Download
Download
--- 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
}