/* vi: set sw=4 ts=4: */
/*
 * Mini mount implementation for busybox
 *
 * Copyright (C) 1995, 1996 by Bruce Perens <bruce@pixar.com>.
 * Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 * 3/21/1999	Charles P. Wright <cpwright@cpwright.com>
 *		searches through fstab when -a is passed
 *		will try mounting stuff with all fses when passed -t auto
 *
 * 1999-04-17	Dave Cinege...Rewrote -t auto. Fixed ro mtab.
 *
 * 1999-10-07	Erik Andersen <andersen@codepoet.org>.
 *              Rewrite of a lot of code. Removed mtab usage (I plan on
 *              putting it back as a compile-time option some time), 
 *              major adjustments to option parsing, and some serious 
 *              dieting all around.
 *
 * 1999-11-06	mtab suppport is back - andersee
 *
 * 2000-01-12   Ben Collins <bcollins@debian.org>, Borrowed utils-linux's
 *              mount to add loop support.
 *
 * 2000-04-30	Dave Cinege <dcinege@psychosis.com>
 *		Rewrote fstab while loop and lower mount section. Can now do
 *		single mounts from fstab. Can override fstab options for single
 *		mount. Common mount_one call for single mounts and 'all'. Fixed
 *		mtab updating and stale entries. Removed 'remount' default. 
 *	
 */

#include <limits.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <mntent.h>
#include <ctype.h>
#include "busybox.h"

#ifdef CONFIG_NFSMOUNT
#if defined(__UCLIBC__) && ! defined(__UCLIBC_HAS_RPC__)
#error "You need to build uClibc with UCLIBC_HAS_RPC for busybox mount with NFS support to compile."
#endif
#endif

enum {
	MS_MGC_VAL = 0xc0ed0000,	/* Magic number indicatng "new" flags */
	MS_RDONLY = 1,		/* Mount read-only */
	MS_NOSUID = 2,		/* Ignore suid and sgid bits */
	MS_NODEV = 4,		/* Disallow access to device special files */
	MS_NOEXEC = 8,		/* Disallow program execution */
	MS_SYNCHRONOUS = 16,	/* Writes are synced at once */
	MS_REMOUNT = 32,	/* Alter flags of a mounted FS */
	MS_MANDLOCK = 64,	/* Allow mandatory locks on an FS */
	S_QUOTA = 128,		/* Quota initialized for file/directory/symlink */
	S_APPEND = 256,		/* Append-only file */
	S_IMMUTABLE = 512,	/* Immutable file */
	MS_NOATIME = 1024,	/* Do not update access times. */
	MS_NODIRATIME = 2048,	/* Do not update directory access times */
	MS_BIND = 4096,		/* Use the new linux 2.4.x "mount --bind" feature */
};


#if defined CONFIG_FEATURE_MOUNT_LOOP
#include <fcntl.h>
#include <sys/ioctl.h>
static int use_loop = FALSE;
#endif

extern int mount(__const char *__special_file, __const char *__dir,
				 __const char *__fstype, unsigned long int __rwflag,
				 __const void *__data);
extern int umount(__const char *__special_file);
extern int umount2(__const char *__special_file, int __flags);

extern int sysfs(int option, unsigned int fs_index, char *buf);

struct mount_options {
	const char *name;
	unsigned long and;
	unsigned long or;
};

static const struct mount_options mount_options[] = {
	{"async", ~MS_SYNCHRONOUS, 0},
	{"atime", ~0, ~MS_NOATIME},
	{"defaults", ~0, 0},
	{"noauto", ~0, 0},
	{"dev", ~MS_NODEV, 0},
	{"diratime", ~0, ~MS_NODIRATIME},
	{"exec", ~MS_NOEXEC, 0},
	{"noatime", ~0, MS_NOATIME},
	{"nodev", ~0, MS_NODEV},
	{"nodiratime", ~0, MS_NODIRATIME},
	{"noexec", ~0, MS_NOEXEC},
	{"nosuid", ~0, MS_NOSUID},
	{"remount", ~0, MS_REMOUNT},
	{"ro", ~0, MS_RDONLY},
	{"rw", ~MS_RDONLY, 0},
	{"suid", ~MS_NOSUID, 0},
	{"sync", ~0, MS_SYNCHRONOUS},
	{"bind", ~0, MS_BIND},
	{0, 0, 0}
};

static int
do_mount(char *specialfile, char *dir, char *filesystemtype, long flags,
		 void *string_flags, int useMtab, int fakeIt, char *mtab_opts,
		 int mount_all)
{
	int status = 0;

#if defined CONFIG_FEATURE_MOUNT_LOOP
	char *lofile = NULL;
#endif

	if (!fakeIt) {
#if defined CONFIG_FEATURE_MOUNT_LOOP
		if (use_loop == TRUE) {
			int loro = flags & MS_RDONLY;

			lofile = specialfile;

			specialfile = find_unused_loop_device();
			if (specialfile == NULL) {
				bb_error_msg_and_die("Could not find a spare loop device");
			}
			if (set_loop(specialfile, lofile, 0, &loro)) {
				bb_error_msg_and_die("Could not setup loop device");
			}
			if (!(flags & MS_RDONLY) && loro) {	/* loop is ro, but wanted rw */
				bb_error_msg("WARNING: loop device is read-only");
				flags |= MS_RDONLY;
			}
		}
#endif
		status = mount(specialfile, dir, filesystemtype, flags, string_flags);
		if (status < 0 && errno == EROFS) {
			bb_error_msg("%s is write-protected, mounting read-only",
					  specialfile);
			status = mount(specialfile, dir, filesystemtype, flags |=
						   MS_RDONLY, string_flags);
		}
		/* Don't whine about already mounted filesystems when mounting all. */
		if (status < 0 && errno == EBUSY && mount_all) {
			return TRUE;
		}
	}


	/* If the mount was sucessful, do anything needed, then return TRUE */
	if (status == 0 || fakeIt == TRUE) {

#if defined CONFIG_FEATURE_MTAB_SUPPORT
		if (useMtab) {
			erase_mtab(specialfile);	/* Clean any stale entries */
			write_mtab(specialfile, dir, filesystemtype, flags, mtab_opts);
		}
#endif
		return (TRUE);
	}

	/* Bummer.  mount failed.  Clean up */
#if defined CONFIG_FEATURE_MOUNT_LOOP
	if (lofile != NULL) {
		del_loop(specialfile);
	}
#endif

	if (errno == EPERM) {
		bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
	}

	return (FALSE);
}


static void paste_str(char **s1, const char *s2)
{
	*s1 = xrealloc(*s1, strlen(*s1) + strlen(s2) + 1);
	strcat(*s1, s2);
}

/* Seperate standard mount options from the nonstandard string options */
static void parse_mount_options(char *options, int *flags, char **strflags)
{
	while (options) {
		int gotone = FALSE;
		char *comma = strchr(options, ',');
		const struct mount_options *f = mount_options;

		if (comma) {
			*comma = '\0';
		}

		while (f->name != 0) {
			if (strcasecmp(f->name, options) == 0) {

				*flags &= f->and;
				*flags |= f->or;
				gotone = TRUE;
				break;
			}
			f++;
		}
#if defined CONFIG_FEATURE_MOUNT_LOOP
		if (!strcasecmp("loop", options)) {	/* loop device support */
			use_loop = TRUE;
			gotone = TRUE;
		}
#endif
		if (!gotone) {
			if (**strflags) {
				/* have previous parsed options */
				paste_str(strflags, ",");
			}
			paste_str(strflags, options);
		}
		if (comma) {
			*comma = ',';
			options = ++comma;
		} else {
			break;
		}
	}
}

static int mount_one(char *blockDevice, char *directory, char *filesystemType,
					 unsigned long flags, char *string_flags, int useMtab,
					 int fakeIt, char *mtab_opts, int whineOnErrors,
					 int mount_all)
{
	int status = 0;
	if (strcmp(filesystemType, "auto") == 0) {
		char buf[255];
		FILE *f;
		int read_proc = 0;

		f = fopen("/etc/filesystems", "r");

		if (f) {
			while (fgets(buf, sizeof(buf), f)) {
				if (*buf == '*') {
					read_proc = 1;
				} else if (*buf == '#') {
					continue;
				} else {
					filesystemType = buf;

					/* Add NULL termination to each line */
					while (*filesystemType && !isspace(*filesystemType)) {
						filesystemType++;
					}
					*filesystemType = '\0';

					filesystemType = buf;

					if (bb_strlen(filesystemType)) {
						status =
							do_mount(blockDevice, directory, filesystemType,
									 flags | MS_MGC_VAL, string_flags,
									 useMtab, fakeIt, mtab_opts, mount_all);
						if (status) {
							break;
						}
					}

				}
			}
			fclose(f);
		}

		if ((!f || read_proc) && !status) {
			f = bb_xfopen("/proc/filesystems", "r");

			while (fgets(buf, sizeof(buf), f) != NULL) {
				filesystemType = buf;
				if (*filesystemType == '\t') {	/* Not a nodev filesystem */

					/* Add NULL termination to each line */
					while (*filesystemType && *filesystemType != '\n') {
						filesystemType++;
					}
					*filesystemType = '\0';

					filesystemType = buf;
					filesystemType++;	/* hop past tab */

					status =
						do_mount(blockDevice, directory, filesystemType,
								 flags | MS_MGC_VAL, string_flags, useMtab,
								 fakeIt, mtab_opts, mount_all);
					if (status) {
						break;
					}
				}
			}
		}
		fclose(f);
	} else {
		status =
			do_mount(blockDevice, directory, filesystemType,
					 flags | MS_MGC_VAL, string_flags, useMtab, fakeIt,
					 mtab_opts, mount_all);
	}

	if (!status) {
		if (whineOnErrors) {
			bb_perror_msg("Mounting %s on %s failed", blockDevice, directory);
		}
		return (FALSE);
	}
	return (TRUE);
}

static void show_mounts(char *onlytype)
{
	FILE *mountTable = setmntent(bb_path_mtab_file, "r");

	if (mountTable) {
		struct mntent *m;

		while ((m = getmntent(mountTable)) != 0) {
			char *blockDevice = m->mnt_fsname;

			if (strcmp(blockDevice, "rootfs") == 0) {
				continue;
			} else if (strcmp(blockDevice, "/dev/root") == 0) {
				blockDevice = find_real_root_device_name(blockDevice);
			}
			if (!onlytype || (strcmp(m->mnt_type, onlytype) == 0)) {
				printf("%s on %s type %s (%s)\n", blockDevice, m->mnt_dir,
					   m->mnt_type, m->mnt_opts);
			}
#ifdef CONFIG_FEATURE_CLEAN_UP
			if (blockDevice != m->mnt_fsname) {
				free(blockDevice);
			}
#endif
		}
		endmntent(mountTable);
	} else {
		bb_perror_msg_and_die(bb_path_mtab_file);
	}
	exit(EXIT_SUCCESS);
}

extern int mount_main(int argc, char **argv)
{
	struct stat statbuf;
	char *string_flags = bb_xstrdup("");
	char *extra_opts;
	int flags = 0;
	char *filesystemType = "auto";
	int got_filesystemType = 0;
	char *device = xmalloc(PATH_MAX);
	char *directory = xmalloc(PATH_MAX);
	struct mntent *m = NULL;
	int all = FALSE;
	int fakeIt = FALSE;
	int useMtab = TRUE;
	int rc = EXIT_FAILURE;
	FILE *f = 0;
	int opt;

	/* Parse options */
	while ((opt = getopt(argc, argv, "o:rt:wafnv")) > 0) {
		switch (opt) {
		case 'o':
			parse_mount_options(optarg, &flags, &string_flags);
			break;
		case 'r':
			flags |= MS_RDONLY;
			break;
		case 't':
			filesystemType = optarg;
			got_filesystemType = 1;
			break;
		case 'w':
			flags &= ~MS_RDONLY;
			break;
		case 'a':
			all = TRUE;
			break;
		case 'f':
			fakeIt = TRUE;
			break;
#ifdef CONFIG_FEATURE_MTAB_SUPPORT
		case 'n':
			useMtab = FALSE;
			break;
#endif
		case 'v':
			break;		/* ignore -v */
		}
	}

	if (!all && (optind == argc)) {
		show_mounts(got_filesystemType ? filesystemType : NULL);
	}

	if (optind < argc) {
		/* if device is a filename get its real path */
		if (stat(argv[optind], &statbuf) == 0) {
			char *tmp = bb_simplify_path(argv[optind]);

			safe_strncpy(device, tmp, PATH_MAX);
		} else {
			safe_strncpy(device, argv[optind], PATH_MAX);
		}
	}

	if (optind + 1 < argc)
		directory = bb_simplify_path(argv[optind + 1]);

	if (all || optind + 1 == argc) {
		f = setmntent("/etc/fstab", "r");

		if (f == NULL)
			bb_perror_msg_and_die("\nCannot read /etc/fstab");

		while ((m = getmntent(f)) != NULL) {
			if (!all && (optind + 1 == argc)
				&& ((strcmp(device, m->mnt_fsname) != 0)
					&& (strcmp(device, m->mnt_dir) != 0))) {
				continue;
			}

			if (all && (	/* If we're mounting 'all' */
						   (strstr(m->mnt_opts, "noauto")) ||	/* and the file system isn't noauto, */
						   (strstr(m->mnt_type, "swap")))) /* and isn't swap, then mount it */
			{
				continue;
			}

			if (all || flags == 0) {	/* Allow single mount to override fstab flags */
				flags = 0;
				string_flags[0] = 0;
				parse_mount_options(m->mnt_opts, &flags, &string_flags);
			}

			strcpy(device, m->mnt_fsname);
			strcpy(directory, m->mnt_dir);
			filesystemType = bb_xstrdup(m->mnt_type);
		  singlemount:
			extra_opts = string_flags;
			rc = EXIT_SUCCESS;
#ifdef CONFIG_NFSMOUNT
			if (strchr(device, ':') != NULL) {
				filesystemType = "nfs";
				if (nfsmount
					(device, directory, &flags, &extra_opts, &string_flags,
					 1)) {
					bb_perror_msg("nfsmount failed");
					rc = EXIT_FAILURE;
				}
			}
#endif
			if (!mount_one
				(device, directory, filesystemType, flags, string_flags,
				 useMtab, fakeIt, extra_opts, TRUE, all)) {
				rc = EXIT_FAILURE;
			}
			if (!all) {
				break;
			}
		}
		if (f) {
			endmntent(f);
		}
		if (!all && f && m == NULL) {
			fprintf(stderr, "Can't find %s in /etc/fstab\n", device);
		}
		return rc;
	}

	goto singlemount;
}
