Home | History | Annotate | Download | only in mount
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 #define	LOFS
     28 #define	MNTTYPE_LOFS "lofs"
     29 #include <stdio.h>
     30 #include <stdlib.h>
     31 #include <string.h>
     32 #include <libintl.h>
     33 #include <errno.h>
     34 #include <sys/fstyp.h>
     35 #include <sys/fsid.h>
     36 #include <sys/mntent.h>
     37 #include <sys/mnttab.h>
     38 #include <sys/mount.h>
     39 #include <sys/signal.h>
     40 #include <sys/stat.h>
     41 #include <fslib.h>
     42 
     43 #define	RET_OK		0
     44 /*
     45  * /sbin/mount and the fs-local method understand this exit code to
     46  * mean that all the mount failures were related to lofs mounts. Since
     47  * this program only attempts to mount lofs file systems, when it fails
     48  * it returns this exit status.
     49  */
     50 #define	RET_ERR		111
     51 
     52 static void usage(void);
     53 
     54 static char  optbuf[MAX_MNTOPT_STR] = { '\0', };
     55 static int   optsize = 0;
     56 
     57 static char fstype[] = MNTTYPE_LOFS;
     58 
     59 /*
     60  * usage: mount [-Ormq] [-o options] special mountp
     61  *
     62  * This mount program is exec'ed by /usr/sbin/mount if '-F lofs' is
     63  * specified.
     64  */
     65 int
     66 main(int argc, char *argv[])
     67 {
     68 	int c;
     69 	char *special;		/* Entity being mounted */
     70 	char *mountp;		/* Entity being mounted on */
     71 	char *savedoptbuf;
     72 	char *myname;
     73 	char typename[64];
     74 	int flags = 0;
     75 	int errflag = 0;
     76 	int qflg = 0;
     77 
     78 	myname = strrchr(argv[0], '/');
     79 	myname = myname ? myname+1 : argv[0];
     80 	(void) snprintf(typename, sizeof (typename), "%s %s", fstype, myname);
     81 	argv[0] = typename;
     82 
     83 	while ((c = getopt(argc, argv, "o:rmOq")) != EOF) {
     84 		switch (c) {
     85 		case '?':
     86 			errflag++;
     87 			break;
     88 
     89 		case 'o':
     90 			if (strlcpy(optbuf, optarg, sizeof (optbuf)) >=
     91 			    sizeof (optbuf)) {
     92 				(void) fprintf(stderr,
     93 				    gettext("%s: Invalid argument: %s\n"),
     94 				    myname, optarg);
     95 				return (2);
     96 			}
     97 			optsize = strlen(optbuf);
     98 			break;
     99 		case 'O':
    100 			flags |= MS_OVERLAY;
    101 			break;
    102 		case 'r':
    103 			flags |= MS_RDONLY;
    104 			break;
    105 
    106 		case 'm':
    107 			flags |= MS_NOMNTTAB;
    108 			break;
    109 
    110 		case 'q':
    111 			qflg = 1;
    112 			break;
    113 
    114 		default:
    115 			usage();
    116 		}
    117 	}
    118 	if ((argc - optind != 2) || errflag) {
    119 		usage();
    120 	}
    121 	special = argv[argc - 2];
    122 	mountp = argv[argc - 1];
    123 
    124 	if ((savedoptbuf = strdup(optbuf)) == NULL) {
    125 		(void) fprintf(stderr, gettext("%s: out of memory\n"),
    126 		    myname);
    127 		exit(2);
    128 	}
    129 	if (mount(special, mountp, flags | MS_OPTIONSTR, fstype, NULL, 0,
    130 	    optbuf, MAX_MNTOPT_STR)) {
    131 		(void) fprintf(stderr, "mount: ");
    132 		perror(special);
    133 		exit(RET_ERR);
    134 	}
    135 	if (optsize && !qflg)
    136 		cmp_requested_to_actual_options(savedoptbuf, optbuf,
    137 		    special, mountp);
    138 	return (0);
    139 }
    140 
    141 void
    142 usage(void)
    143 {
    144 	(void) fprintf(stderr,
    145 	    "Usage: mount [-Ormq] [-o options] special mountpoint\n");
    146 	exit(RET_ERR);
    147 }
    148