/*
 * by rmk
 */
#include <sys/mount.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <mntent.h>

#include "mount_opts.h"

#define _PATH_MOUNTED		"/etc/mtab"
#define _PATH_PROC_MOUNTS	"/proc/mounts"

char *progname;

static struct extra_opts extra;
static unsigned long rwflag;

static __noreturn usage(void)
{
	fprintf(stderr, "Usage: %s [-r] [-w] [-o options] [-t type] [-f] [-i] "
		"[-n] device directory\n", progname);
	exit(1);
}

static __noreturn print_mount(char *type)
{
	FILE *mfp;
	struct mntent *mnt;

	mfp = setmntent(_PATH_PROC_MOUNTS, "r");
	if (!mfp)
		mfp = setmntent(_PATH_MOUNTED, "r");
	if (!mfp)
		perror("setmntent");

	while ((mnt = getmntent(mfp)) != NULL) {
		if (mnt->mnt_fsname && !strncmp(mnt->mnt_fsname, "no", 2))
			continue;
		if (type && mnt->mnt_type && strcmp(type, mnt->mnt_type))
			continue;
		printf("%s on %s", mnt->mnt_fsname, mnt->mnt_dir);
		if (mnt->mnt_type != NULL && mnt->mnt_type != '\0')
			printf (" type %s", mnt->mnt_type);
		if (mnt->mnt_opts != NULL && mnt->mnt_opts != '\0')
			printf (" (%s)", mnt->mnt_opts);
		printf("\n");
	}
	endmntent(mfp);
	exit(0);
}

static int
do_mount(char *dev, char *dir, char *type, unsigned long rwflag, void *data)
{
	char *s;
	int error = 0;

	while ((s = strsep(&type, ",")) != NULL) {
retry:
		if (mount(dev, dir, s, rwflag, data) == -1) {
			error = errno;
			/*
			 * If the filesystem is not found, or the
			 * superblock is invalid, try the next.
			 */
			if (error == ENODEV || error == EINVAL)
				continue;

			/*
			 * If we get EACCESS, and we're trying to
			 * mount readwrite and this isn't a remount,
			 * try read only.
			 */
			if (error == EACCES &&
			    (rwflag & (MS_REMOUNT | MS_RDONLY)) == 0) {
				rwflag |= MS_RDONLY;
				goto retry;
			}
		} else {
			error = 0;
		}
		break;
	}

	if (error) {
		errno = error;
		perror("mount");
		return 255;
	}

	return 0;
}

int main(int argc, char *argv[])
{
	char *type = NULL;
	int c;

	progname = argv[0];
	rwflag = MS_VERBOSE;

	do {
		c = getopt(argc, argv, "fhino:rt:w");
		if (c == EOF)
			break;
		switch (c) {
		case 'f':
			/* we can't edit /etc/mtab yet anyway; exit */
			exit(0);
		case 'i':
			/* ignore for now; no support for mount helpers */
			break;
		case 'h':
			usage();
		case 'n':
			/* no mtab writing */
			break;
		case 'o':
			rwflag = parse_mount_options(optarg, rwflag, &extra);
			break;
		case 'r':
			rwflag |= MS_RDONLY;
			break;
		case 't':
			type = optarg;
			break;
		case 'w':
			rwflag &= ~MS_RDONLY;
			break;
		case '?':
			fprintf(stderr, "%s: invalid option -%c\n",
				progname, optopt);
			exit(1);
		}
	} while (1);

	if (optind == argc)
		print_mount(type);

	/*
	 * If remount, bind or move was specified, then we don't
	 * have a "type" as such.  Use the dummy "none" type.
	 */
	if (rwflag & MS_TYPE)
		type = "none";

	if (optind + 2 != argc || type == NULL)
		usage();

	return do_mount(argv[optind], argv[optind + 1], type, rwflag,
			extra.str);
}
