PageRenderTime 37ms CodeModel.GetById 12ms app.highlight 19ms RepoModel.GetById 1ms app.codeStats 1ms

/core/10.5/fusefs/mount/getmntopts.c

http://macfuse.googlecode.com/
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}