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