/core/10.4/fusefs/mount/getmntopts.c
C | 171 lines | 87 code | 19 blank | 65 comment | 40 complexity | cf6c84657d2127fa88a006b195dbb2b0 MD5 | raw file
1/* 2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights 7 * Reserved. This file contains Original Code and/or Modifications of 8 * Original Code as defined in and that are subject to the Apple Public 9 * Source License Version 1.0 (the 'License'). You may not use this file 10 * except in compliance with the License. Please obtain a copy of the 11 * License at http://www.apple.com/publicsource and read it before using 12 * this file. 13 * 14 * The Original Code and all software distributed under the License are 15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the 19 * License for the specific language governing rights and limitations 20 * under the License." 21 * 22 * @APPLE_LICENSE_HEADER_END@ 23 */ 24/*- 25 * Copyright (c) 1994 26 * The Regents of the University of California. All rights reserved. 27 * 28 * Redistribution and use in source and binary forms, with or without 29 * modification, are permitted provided that the following conditions 30 * are met: 31 * 1. Redistributions of source code must retain the above copyright 32 * notice, this list of conditions and the following disclaimer. 33 * 2. Redistributions in binary form must reproduce the above copyright 34 * notice, this list of conditions and the following disclaimer in the 35 * documentation and/or other materials provided with the distribution. 36 * 3. All advertising materials mentioning features or use of this software 37 * must display the following acknowledgement: 38 * This product includes software developed by the University of 39 * California, Berkeley and its contributors. 40 * 4. Neither the name of the University nor the names of its contributors 41 * may be used to endorse or promote products derived from this software 42 * without specific prior written permission. 43 * 44 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 45 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 46 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 47 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 48 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 49 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 50 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 51 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 52 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 53 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 54 * SUCH DAMAGE. 55 */ 56 57 58#include <sys/param.h> 59#include <sys/stat.h> 60 61#include <err.h> 62#include <errno.h> 63#include <stdlib.h> 64#include <string.h> 65#include <sysexits.h> 66 67#include "mntopts.h" 68 69int getmnt_silent = 1; 70 71void 72getmntopts(options, m0, flagp, altflagp) 73 const char *options; 74 const struct mntopt *m0; 75 int *flagp; 76 u_int64_t *altflagp; 77{ 78 const struct mntopt *m; 79 int negative; 80 size_t len; 81 char *opt, *optbuf, *p; 82 83 /* Copy option string, since it is about to be torn asunder... */ 84 if ((optbuf = strdup(options)) == NULL) 85 err(1, NULL); 86 87 for (opt = optbuf; (opt = strtok(opt, ",")) != NULL; opt = NULL) { 88 /* Check for "no" prefix. */ 89 if (opt[0] == 'n' && opt[1] == 'o') { 90 negative = 1; 91 opt += 2; 92 } else 93 negative = 0; 94 95 /* 96 * for options with assignments in them (ie. quotas) 97 * ignore the assignment as it's handled elsewhere 98 */ 99 p = strchr(opt, '='); 100 if (p) 101 *++p = '\0'; 102 103 /* Scan option table. */ 104 for (m = m0; m->m_option != NULL; ++m) { 105 len = strlen(m->m_option); 106 if (strncasecmp(opt, m->m_option, len) == 0) 107 if ( opt[len] == '\0' 108 || opt[len] == '=' 109 ) 110 break; 111 } 112 113 /* Save flag, or fail if option is not recognized. */ 114 if (m->m_option) { 115 if (m->m_altloc) { 116 if (negative == m->m_inverse) 117 *altflagp |= m->m_flag; 118 else 119 *altflagp &= ~m->m_flag; 120 } else { 121 u_int32_t m_flag32; 122 123 m_flag32 = (u_int32_t)(m->m_flag & 0xFFFFFFFF); 124 if (negative == m->m_inverse) 125 *flagp |= m_flag32; 126 else 127 *flagp &= ~m_flag32; 128 } 129 } else if (!getmnt_silent) { 130 errx(1, "-o %s: option not supported", opt); 131 } 132 } 133 134 free(optbuf); 135} 136 137void 138rmslashes(rrpin, rrpout) 139 char *rrpin; 140 char *rrpout; 141{ 142 char *rrpoutstart; 143 144 *rrpout = *rrpin; 145 for (rrpoutstart = rrpout; *rrpin != '\0'; *rrpout++ = *rrpin++) { 146 147 /* skip all double slashes */ 148 while (*rrpin == '/' && *(rrpin + 1) == '/') 149 rrpin++; 150 } 151 152 /* remove trailing slash if necessary */ 153 if (rrpout - rrpoutstart > 1 && *(rrpout - 1) == '/') 154 *(rrpout - 1) = '\0'; 155 else 156 *rrpout = '\0'; 157} 158 159void 160checkpath(path, resolved) 161 const char *path; 162 char *resolved; 163{ 164 struct stat sb; 165 166 if (realpath(path, resolved) != NULL && stat(resolved, &sb) == 0) { 167 if (!S_ISDIR(sb.st_mode)) 168 errx(EX_USAGE, "%s: not a directory", resolved); 169 } else 170 errx(EX_USAGE, "%s: %s", resolved, strerror(errno)); 171}