4 * Copyright (C) 1995-1998 by Volker Lendecke
8 #define SMBMOUNT_MALLOC 1
14 #include <asm/types.h>
15 #include <asm/posix_types.h>
16 #include <linux/smb.h>
17 #include <linux/smb_mount.h>
18 #include <linux/smb_fs.h>
20 /* This is a (hopefully) temporary hack due to the fact that
21 sizeof( uid_t ) != sizeof( __kernel_uid_t ) under glibc.
22 This may change in the future and smb.h may get fixed in the
23 future. In the mean time, it's ugly hack time - get over it.
25 #undef SMB_IOC_GETMOUNTUID
26 #define SMB_IOC_GETMOUNTUID _IOR('u', 1, __kernel_uid_t)
29 #define O_NOFOLLOW 0400000
35 printf("usage: smbumount mountpoint\n\n");
36 printf("Please be aware that smbfs is deprecated in favor of "
41 umount_ok(const char *mount_point
)
43 /* we set O_NOFOLLOW to prevent users playing games with symlinks to
44 umount filesystems they don't own */
45 int fid
= open(mount_point
, O_RDONLY
|O_NOFOLLOW
, 0);
46 __kernel_uid32_t mount_uid
;
49 fprintf(stderr
, "Could not open %s: %s\n",
50 mount_point
, strerror(errno
));
54 if (ioctl(fid
, SMB_IOC_GETMOUNTUID32
, &mount_uid
) != 0) {
55 __kernel_uid_t mount_uid16
;
56 if (ioctl(fid
, SMB_IOC_GETMOUNTUID
, &mount_uid16
) != 0) {
57 fprintf(stderr
, "%s probably not smb-filesystem\n",
61 mount_uid
= mount_uid16
;
65 && (mount_uid
!= getuid())) {
66 fprintf(stderr
, "You are not allowed to umount %s\n",
75 /* Make a canonical pathname from PATH. Returns a freshly malloced string.
76 It is up the *caller* to ensure that the PATH is sensible. i.e.
77 canonicalize ("/dev/fd0/.") returns "/dev/fd0" even though ``/dev/fd0/.''
78 is not a legal pathname for ``/dev/fd0'' Anything we cannot parse
79 we return unmodified. */
81 canonicalize (char *path
)
83 char *canonical
= malloc (PATH_MAX
+ 1);
86 fprintf(stderr
, "Error! Not enough memory!\n");
90 if (strlen(path
) > PATH_MAX
) {
91 fprintf(stderr
, "Mount point string too long\n");
98 if (realpath (path
, canonical
))
101 strncpy (canonical
, path
, PATH_MAX
);
102 canonical
[PATH_MAX
] = '\0';
108 main(int argc
, char *argv
[])
121 if (geteuid() != 0) {
122 fprintf(stderr
, "smbumount must be installed suid root\n");
126 mount_point
= canonicalize(argv
[1]);
128 if (mount_point
== NULL
)
133 if (umount_ok(mount_point
) != 0) {
137 if (umount(mount_point
) != 0) {
138 fprintf(stderr
, "Could not umount %s: %s\n",
139 mount_point
, strerror(errno
));
143 if ((fd
= open(MOUNTED
"~", O_RDWR
|O_CREAT
|O_EXCL
, 0600)) == -1)
145 fprintf(stderr
, "Can't get "MOUNTED
"~ lock file");
150 if ((mtab
= setmntent(MOUNTED
, "r")) == NULL
) {
151 fprintf(stderr
, "Can't open " MOUNTED
": %s\n",
156 #define MOUNTED_TMP MOUNTED".tmp"
158 if ((new_mtab
= setmntent(MOUNTED_TMP
, "w")) == NULL
) {
159 fprintf(stderr
, "Can't open " MOUNTED_TMP
": %s\n",
165 while ((mnt
= getmntent(mtab
)) != NULL
) {
166 if (strcmp(mnt
->mnt_dir
, mount_point
) != 0) {
167 addmntent(new_mtab
, mnt
);
173 if (fchmod (fileno (new_mtab
), S_IRUSR
|S_IWUSR
|S_IRGRP
|S_IROTH
) < 0) {
174 fprintf(stderr
, "Error changing mode of %s: %s\n",
175 MOUNTED_TMP
, strerror(errno
));
181 if (rename(MOUNTED_TMP
, MOUNTED
) < 0) {
182 fprintf(stderr
, "Cannot rename %s to %s: %s\n",
183 MOUNTED
, MOUNTED_TMP
, strerror(errno
));
187 if (unlink(MOUNTED
"~") == -1)
189 fprintf(stderr
, "Can't remove "MOUNTED
"~");