mount: support user mounts if CONFIG_DESKTOP
This commit is contained in:
@ -46,6 +46,10 @@
|
|||||||
# define _BB_DIR_USR_SBIN _BB_DIR_SBIN
|
# define _BB_DIR_USR_SBIN _BB_DIR_SBIN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// _BB_SUID_ALWAYS: will complain if busybox isn't suid
|
||||||
|
// and is run by non-root (applet_main() will not be called at all)
|
||||||
|
// _BB_SUID_NEVER: will drop suid prior to applet_main()
|
||||||
|
// _BB_SUID_MAYBE: neither of the above
|
||||||
|
|
||||||
USE_TEST(APPLET_NOUSAGE([, test, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
|
USE_TEST(APPLET_NOUSAGE([, test, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
|
||||||
USE_TEST(APPLET_NOUSAGE([[, test, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
|
USE_TEST(APPLET_NOUSAGE([[, test, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
|
||||||
@ -198,7 +202,7 @@ USE_MKSWAP(APPLET(mkswap, _BB_DIR_SBIN, _BB_SUID_NEVER))
|
|||||||
USE_MKTEMP(APPLET(mktemp, _BB_DIR_BIN, _BB_SUID_NEVER))
|
USE_MKTEMP(APPLET(mktemp, _BB_DIR_BIN, _BB_SUID_NEVER))
|
||||||
USE_MODPROBE(APPLET(modprobe, _BB_DIR_SBIN, _BB_SUID_NEVER))
|
USE_MODPROBE(APPLET(modprobe, _BB_DIR_SBIN, _BB_SUID_NEVER))
|
||||||
USE_MORE(APPLET(more, _BB_DIR_BIN, _BB_SUID_NEVER))
|
USE_MORE(APPLET(more, _BB_DIR_BIN, _BB_SUID_NEVER))
|
||||||
USE_MOUNT(APPLET(mount, _BB_DIR_BIN, _BB_SUID_NEVER))
|
USE_MOUNT(APPLET(mount, _BB_DIR_BIN, USE_DESKTOP(_BB_SUID_MAYBE) SKIP_DESKTOP(_BB_SUID_NEVER)))
|
||||||
USE_MOUNTPOINT(APPLET(mountpoint, _BB_DIR_BIN, _BB_SUID_NEVER))
|
USE_MOUNTPOINT(APPLET(mountpoint, _BB_DIR_BIN, _BB_SUID_NEVER))
|
||||||
USE_MSH(APPLET_NOUSAGE(msh, msh, _BB_DIR_BIN, _BB_SUID_NEVER))
|
USE_MSH(APPLET_NOUSAGE(msh, msh, _BB_DIR_BIN, _BB_SUID_NEVER))
|
||||||
USE_MT(APPLET(mt, _BB_DIR_BIN, _BB_SUID_NEVER))
|
USE_MT(APPLET(mt, _BB_DIR_BIN, _BB_SUID_NEVER))
|
||||||
|
@ -32,8 +32,19 @@
|
|||||||
|
|
||||||
|
|
||||||
// Not real flags, but we want to be able to check for this.
|
// Not real flags, but we want to be able to check for this.
|
||||||
#define MOUNT_NOAUTO (1<<29)
|
enum {
|
||||||
#define MOUNT_SWAP (1<<30)
|
MOUNT_USERS = (1<<28)*ENABLE_DESKTOP,
|
||||||
|
MOUNT_NOAUTO = (1<<29),
|
||||||
|
MOUNT_SWAP = (1<<30),
|
||||||
|
};
|
||||||
|
// TODO: more "user" flag compatibility.
|
||||||
|
// "user" option (from mount manpage):
|
||||||
|
// Only the user that mounted a filesystem can unmount it again.
|
||||||
|
// If any user should be able to unmount, then use users instead of user
|
||||||
|
// in the fstab line. The owner option is similar to the user option,
|
||||||
|
// with the restriction that the user must be the owner of the special file.
|
||||||
|
// This may be useful e.g. for /dev/fd if a login script makes
|
||||||
|
// the console user owner of this device.
|
||||||
|
|
||||||
/* Standard mount options (from -o options or --options), with corresponding
|
/* Standard mount options (from -o options or --options), with corresponding
|
||||||
* flags */
|
* flags */
|
||||||
@ -53,6 +64,8 @@ struct {
|
|||||||
{"quiet", 0},
|
{"quiet", 0},
|
||||||
{"noauto", MOUNT_NOAUTO},
|
{"noauto", MOUNT_NOAUTO},
|
||||||
{"swap", MOUNT_SWAP},
|
{"swap", MOUNT_SWAP},
|
||||||
|
USE_DESKTOP({"user", MOUNT_USERS},)
|
||||||
|
USE_DESKTOP({"users", MOUNT_USERS},)
|
||||||
)
|
)
|
||||||
|
|
||||||
USE_FEATURE_MOUNT_FLAGS(
|
USE_FEATURE_MOUNT_FLAGS(
|
||||||
@ -106,7 +119,8 @@ static void append_mount_options(char **oldopts, char *newopts)
|
|||||||
if (p) len = p - newopts;
|
if (p) len = p - newopts;
|
||||||
p = *oldopts;
|
p = *oldopts;
|
||||||
while (1) {
|
while (1) {
|
||||||
if (!strncmp(p,newopts,len) && (p[len]==',' || p[len]==0))
|
if (!strncmp(p, newopts, len)
|
||||||
|
&& (p[len]==',' || p[len]==0))
|
||||||
goto skip;
|
goto skip;
|
||||||
p = strchr(p,',');
|
p = strchr(p,',');
|
||||||
if(!p) break;
|
if(!p) break;
|
||||||
@ -1422,6 +1436,8 @@ report_error:
|
|||||||
// Parse options, if necessary parse fstab/mtab, and call singlemount for
|
// Parse options, if necessary parse fstab/mtab, and call singlemount for
|
||||||
// each directory to be mounted.
|
// each directory to be mounted.
|
||||||
|
|
||||||
|
const char must_be_root[] = "you must be root";
|
||||||
|
|
||||||
int mount_main(int argc, char **argv)
|
int mount_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
enum { OPT_ALL = 0x10 };
|
enum { OPT_ALL = 0x10 };
|
||||||
@ -1433,6 +1449,8 @@ int mount_main(int argc, char **argv)
|
|||||||
int i, j, rc = 0;
|
int i, j, rc = 0;
|
||||||
unsigned opt;
|
unsigned opt;
|
||||||
struct mntent mtpair[2], *mtcur = mtpair;
|
struct mntent mtpair[2], *mtcur = mtpair;
|
||||||
|
SKIP_DESKTOP(const int nonroot = 0;)
|
||||||
|
USE_DESKTOP( int nonroot = (getuid() != 0);)
|
||||||
|
|
||||||
/* parse long options, like --bind and --move. Note that -o option
|
/* parse long options, like --bind and --move. Note that -o option
|
||||||
* and --option are synonymous. Yes, this means --remount,rw works. */
|
* and --option are synonymous. Yes, this means --remount,rw works. */
|
||||||
@ -1475,7 +1493,7 @@ int mount_main(int argc, char **argv)
|
|||||||
while (getmntent_r(mountTable, mtpair, bb_common_bufsiz1,
|
while (getmntent_r(mountTable, mtpair, bb_common_bufsiz1,
|
||||||
sizeof(bb_common_bufsiz1)))
|
sizeof(bb_common_bufsiz1)))
|
||||||
{
|
{
|
||||||
// Don't show rootfs.
|
// Don't show rootfs. FIXME: why??
|
||||||
if (!strcmp(mtpair->mnt_fsname, "rootfs")) continue;
|
if (!strcmp(mtpair->mnt_fsname, "rootfs")) continue;
|
||||||
|
|
||||||
if (!fstype || !strcmp(mtpair->mnt_type, fstype))
|
if (!fstype || !strcmp(mtpair->mnt_type, fstype))
|
||||||
@ -1493,6 +1511,8 @@ int mount_main(int argc, char **argv)
|
|||||||
// argument when we get it.
|
// argument when we get it.
|
||||||
|
|
||||||
if (argc == 2) {
|
if (argc == 2) {
|
||||||
|
if (nonroot)
|
||||||
|
bb_error_msg_and_die(must_be_root);
|
||||||
mtpair->mnt_fsname = argv[0];
|
mtpair->mnt_fsname = argv[0];
|
||||||
mtpair->mnt_dir = argv[1];
|
mtpair->mnt_dir = argv[1];
|
||||||
mtpair->mnt_type = fstype;
|
mtpair->mnt_type = fstype;
|
||||||
@ -1502,6 +1522,8 @@ int mount_main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
i = parse_mount_options(cmdopts, 0);
|
i = parse_mount_options(cmdopts, 0);
|
||||||
|
if (nonroot && (i & ~MS_SILENT)) // Non-root users cannot specify flags
|
||||||
|
bb_error_msg_and_die(must_be_root);
|
||||||
|
|
||||||
// If we have a shared subtree flag, don't worry about fstab or mtab.
|
// If we have a shared subtree flag, don't worry about fstab or mtab.
|
||||||
|
|
||||||
@ -1515,9 +1537,10 @@ int mount_main(int argc, char **argv)
|
|||||||
|
|
||||||
// Open either fstab or mtab
|
// Open either fstab or mtab
|
||||||
|
|
||||||
if (i & MS_REMOUNT)
|
fstabname = "/etc/fstab";
|
||||||
|
if (i & MS_REMOUNT) {
|
||||||
fstabname = bb_path_mtab_file;
|
fstabname = bb_path_mtab_file;
|
||||||
else fstabname = "/etc/fstab";
|
}
|
||||||
fstab = setmntent(fstabname, "r");
|
fstab = setmntent(fstabname, "r");
|
||||||
if (!fstab)
|
if (!fstab)
|
||||||
bb_perror_msg_and_die("cannot read %s", fstabname);
|
bb_perror_msg_and_die("cannot read %s", fstabname);
|
||||||
@ -1544,9 +1567,15 @@ int mount_main(int argc, char **argv)
|
|||||||
bb_error_msg_and_die("can't find %s in %s",
|
bb_error_msg_and_die("can't find %s in %s",
|
||||||
argv[0], fstabname);
|
argv[0], fstabname);
|
||||||
|
|
||||||
|
mtcur = mtnext;
|
||||||
|
if (nonroot) {
|
||||||
|
// fstab must have "users" or "user"
|
||||||
|
if (!(parse_mount_options(mtcur->mnt_opts, 0) & MOUNT_USERS))
|
||||||
|
bb_error_msg_and_die(must_be_root);
|
||||||
|
}
|
||||||
|
|
||||||
// Mount the last thing we found.
|
// Mount the last thing we found.
|
||||||
|
|
||||||
mtcur = mtnext;
|
|
||||||
mtcur->mnt_opts = xstrdup(mtcur->mnt_opts);
|
mtcur->mnt_opts = xstrdup(mtcur->mnt_opts);
|
||||||
append_mount_options(&(mtcur->mnt_opts), cmdopts);
|
append_mount_options(&(mtcur->mnt_opts), cmdopts);
|
||||||
rc = singlemount(mtcur, 0);
|
rc = singlemount(mtcur, 0);
|
||||||
@ -1576,8 +1605,9 @@ int mount_main(int argc, char **argv)
|
|||||||
// If we're mounting all.
|
// If we're mounting all.
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Do we need to match a filesystem type?
|
// Do we need to match a filesystem type?
|
||||||
|
// TODO: support "-t type1,type2"; "-t notype1,type2"
|
||||||
|
|
||||||
if (fstype && strcmp(mtcur->mnt_type, fstype)) continue;
|
if (fstype && strcmp(mtcur->mnt_type, fstype)) continue;
|
||||||
|
|
||||||
// Skip noauto and swap anyway.
|
// Skip noauto and swap anyway.
|
||||||
@ -1585,6 +1615,12 @@ int mount_main(int argc, char **argv)
|
|||||||
if (parse_mount_options(mtcur->mnt_opts, 0)
|
if (parse_mount_options(mtcur->mnt_opts, 0)
|
||||||
& (MOUNT_NOAUTO | MOUNT_SWAP)) continue;
|
& (MOUNT_NOAUTO | MOUNT_SWAP)) continue;
|
||||||
|
|
||||||
|
// No, mount -a won't mount anything,
|
||||||
|
// even user mounts, for mere humans.
|
||||||
|
|
||||||
|
if (nonroot)
|
||||||
|
bb_error_msg_and_die(must_be_root);
|
||||||
|
|
||||||
// Mount this thing.
|
// Mount this thing.
|
||||||
|
|
||||||
if (singlemount(mtcur, 1)) {
|
if (singlemount(mtcur, 1)) {
|
||||||
|
Reference in New Issue
Block a user