diff usr/src/cmd/fs.d/tmpfs/mount.c @ 0:c9caec207d52 b86

Initial porting based on b86
author Koji Uno <koji.uno@sun.com>
date Tue, 02 Jun 2009 18:56:50 +0900
parents
children 1a15d5aaf794
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/fs.d/tmpfs/mount.c	Tue Jun 02 18:56:50 2009 +0900
@@ -0,0 +1,202 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+#pragma ident	"@(#)mount.c	1.31	05/06/08 SMI"
+
+/*
+ * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <locale.h>
+#include <sys/stat.h>
+#include <fslib.h>
+#include <stdio.h>
+#include <sys/mnttab.h>
+#include <poll.h>
+
+#define	MNTTYPE_TMPFS	"tmpfs"
+
+static int	nmflg = 0;
+static int	qflg = 0;
+
+static boolean_t
+in_mnttab(char *mountp)
+{
+	FILE *file;
+	int found = B_FALSE;
+	struct mnttab mntent;
+
+	if ((file = fopen("/etc/mnttab", "r")) == NULL)
+		return (B_FALSE);
+	while (getmntent(file, &mntent) == 0) {
+		if (mntent.mnt_mountp != NULL &&
+		    strcmp(mntent.mnt_mountp, mountp) == 0 &&
+		    mntent.mnt_fstype != NULL &&
+		    strcmp(mntent.mnt_fstype, MNTTYPE_TMPFS) == 0) {
+			found = B_TRUE;
+			break;
+		}
+	}
+	(void) fclose(file);
+	return (found);
+}
+
+int
+main(int argc, char *argv[])
+{
+	/* mount information */
+	char *special;
+	char *mountp;
+
+	int c;
+	char *myname;
+	char typename[64];
+	extern int optind;
+	extern char *optarg;
+	int error = 0;
+	int verbose = 0;
+	int mflg = 0;
+	int optcnt = 0;
+	int mount_attempts = 5;
+
+	char optbuf[MAX_MNTOPT_STR];
+	int optsize = 0;
+	char *saveoptbuf;
+
+	(void) setlocale(LC_ALL, "");
+
+#if !defined(TEXT_DOMAIN)
+#define	TEXT_DOMAIN "SYS_TEST"
+#endif
+	(void) textdomain(TEXT_DOMAIN);
+
+	myname = strrchr(argv[0], '/');
+	myname = myname ? myname + 1 : argv[0];
+	(void) snprintf(typename, sizeof (typename), "%s_%s",
+	    MNTTYPE_TMPFS, myname);
+	argv[0] = typename;
+	optbuf[0] = '\0';
+
+	while ((c = getopt(argc, argv, "?o:VmOq")) != EOF) {
+		switch (c) {
+		case 'V':
+			verbose++;
+			break;
+		case '?':
+			error++;
+			break;
+		case 'm':
+			nmflg++;
+			break;
+		case 'O':
+			mflg |= MS_OVERLAY;
+			break;
+		case 'o':
+			(void) strncpy(optbuf, optarg, MAX_MNTOPT_STR);
+			optbuf[MAX_MNTOPT_STR - 1] = '\0';
+			optsize = strlen(optbuf);
+
+			if (verbose)
+				(void) fprintf(stderr, "optsize:%d optbuf:%s\n",
+				    optsize, optbuf);
+			break;
+		case 'q':
+			qflg++;
+			break;
+		}
+	}
+
+	if (verbose && !error) {
+		char *optptr;
+
+		(void) fprintf(stderr, "%s", typename);
+		for (optcnt = 1; optcnt < argc; optcnt++) {
+			optptr = argv[optcnt];
+			if (optptr)
+				(void) fprintf(stderr, " %s", optptr);
+		}
+		(void) fprintf(stderr, "\n");
+	}
+
+	if (argc - optind != 2 || error) {
+		(void) fprintf(stderr,
+		    gettext("Usage: %s [-o size] swap mount_point\n"),
+		    typename);
+		exit(32);
+	}
+
+	special = argv[optind++];
+	mountp = argv[optind++];
+	mflg |= MS_OPTIONSTR;
+	mflg |= (nmflg ? MS_NOMNTTAB : 0);
+
+	if (verbose) {
+		(void) fprintf(stderr, "mount(%s, \"%s\", %d, %s",
+		    special, mountp, mflg, MNTTYPE_TMPFS);
+		if (optsize)
+			(void) fprintf(stderr, ", \"%s\", %d)\n",
+			    optbuf, strlen(optbuf));
+		else
+			(void) fprintf(stderr, ")\n");
+	}
+	if (optsize) {
+		if ((saveoptbuf = strdup(optbuf)) == NULL) {
+			(void) fprintf(stderr, gettext("%s: out of memory\n"),
+				"mount");
+			exit(1);
+		}
+	}
+again:	if (mount(special, mountp, mflg, MNTTYPE_TMPFS, NULL, 0,
+	    optbuf, MAX_MNTOPT_STR)) {
+		if (errno == EBUSY && !(mflg & MS_OVERLAY)) {
+			/*
+			 * Because of bug 6176743, any attempt to mount
+			 * tmpfs filesystem could fail for reasons
+			 * described in that bug.  We're trying to detect
+			 * that situation here by checking that the filesystem
+			 * we're mounting is not in /etc/mnttab yet.
+			 * When that bug is fixed, this code can be removed.
+			 */
+			if (!in_mnttab(mountp) && mount_attempts-- > 0) {
+				(void) poll(NULL, 0, 50);
+				goto again;
+			}
+			(void) fprintf(stderr, gettext(
+			    "%s: %s is already mounted or %s is busy\n"),
+			    myname, mountp, special);
+		} else {
+			perror("mount");
+		}
+		exit(32);
+	}
+
+	if (optsize && !qflg)
+		cmp_requested_to_actual_options(saveoptbuf, optbuf,
+			special, mountp);
+	return (0);
+}