usr/src/lib/libc/port/gen/getvfsent.c
author raf
Mon, 10 Apr 2006 12:27:38 -0700
changeset 1778 6357a59054f7
parent 0 68f95e015346
child 6812 febeba71273d
permissions -rw-r--r--
6404383 select() behaviour changed in Solaris 10, breaking binary compatibility
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*	Copyright (c) 1988 AT&T	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
/*	  All Rights Reserved  	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#pragma weak getvfsspec = _getvfsspec
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#pragma weak getvfsfile = _getvfsfile
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#pragma weak getvfsany = _getvfsany
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#pragma weak getvfsent = _getvfsent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include	"synonyms.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include	<mtlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include	<stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include	<stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include	<errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include	<sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include	<sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include	<sys/vfstab.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include	<string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include	<thread.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include	<synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include	<strings.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include	<libc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include	"tsd.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#define	GETTOK_R(xx, ll, tmp)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
	if ((vp->xx = (char *)strtok_r(ll, sepstr, tmp)) == NULL)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
		return (VFS_TOOFEW);\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	if (strcmp(vp->xx, dash) == 0)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
		vp->xx = NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#define	GETTOK(xx, ll)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
	if ((vp->xx = strtok(ll, sepstr)) == NULL)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
		return (VFS_TOOFEW);\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	if (strcmp(vp->xx, dash) == 0)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
		vp->xx = NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
#define	DIFF(xx)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	(vrefp->xx != NULL && (vgetp->xx == NULL ||\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	    strcmp(vrefp->xx, vgetp->xx) != 0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#define	SDIFF(xx, typem, typer)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	(vgetp->xx == NULL || stat64(vgetp->xx, &statb) == -1 ||\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	(statb.st_mode & S_IFMT) != typem ||\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	    statb.st_rdev != typer)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
static const char	sepstr[] = " \t\n";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
static const char	dash[] = "-";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
static int	getline(char *, FILE *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
getvfsspec(FILE *fd, struct vfstab *vgetp, char *special)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
	int	ret, bstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	mode_t	bmode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
	dev_t	brdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	struct stat64	statb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	if (special && stat64(special, &statb) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
		((bmode = (statb.st_mode & S_IFMT)) == S_IFBLK ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
		bmode == S_IFCHR)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
		bstat = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
		brdev = statb.st_rdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
		bstat = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	while ((ret = getvfsent(fd, vgetp)) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	    ((bstat == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	    (special != NULL && (vgetp->vfs_special == NULL ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	    strcmp(special, vgetp->vfs_special) != 0))) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	    (bstat == 1 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	    (vgetp->vfs_special == NULL ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	    stat64(vgetp->vfs_special, &statb) == -1 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	    (statb.st_mode & S_IFMT) != bmode ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	    statb.st_rdev != brdev))))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
		;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
getvfsfile(FILE *fd, struct vfstab *vp, char *mountp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	struct vfstab	vv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	bzero(&vv, (size_t)sizeof (vv));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
	vv.vfs_mountp = mountp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	return (getvfsany(fd, vp, &vv));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
getvfsany(FILE *fd, struct vfstab *vgetp, struct vfstab *vrefp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	int	ret, bstat, cstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	mode_t	bmode, cmode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	dev_t	brdev, crdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	struct stat64	statb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	off64_t start = ftello64(fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	/* Match by straight strcmp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	while ((ret = getvfsent(fd, vgetp)) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
		(DIFF(vfs_special) || DIFF(vfs_fsckdev) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
		DIFF(vfs_mountp) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
		DIFF(vfs_fstype) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
		DIFF(vfs_fsckpass) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
		DIFF(vfs_automnt) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
		DIFF(vfs_mntopts)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
		;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	/* If something other than EOF, return it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	if (ret != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
		return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	 * Go back to the original location in the file and try to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	 * match the devices by doing stat's (retains compatibility
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	 * with original getvfsany).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	(void) fseeko64(fd, start, SEEK_SET);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	if (vrefp->vfs_special && stat64(vrefp->vfs_special, &statb) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
		((bmode = (statb.st_mode & S_IFMT)) == S_IFBLK ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
		bmode == S_IFCHR)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
		bstat = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
		brdev = statb.st_rdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
		bstat = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	if (vrefp->vfs_fsckdev && stat64(vrefp->vfs_fsckdev, &statb) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		((cmode = (statb.st_mode & S_IFMT)) == S_IFBLK ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
		cmode == S_IFCHR)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
		cstat = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		crdev = statb.st_rdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
		cstat = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	while ((ret = getvfsent(fd, vgetp)) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		((bstat == 0 && DIFF(vfs_special)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		(bstat == 1 && SDIFF(vfs_special, bmode, brdev)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		(cstat == 0 && DIFF(vfs_fsckdev)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		(cstat == 1 && SDIFF(vfs_fsckdev, cmode, crdev)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		DIFF(vfs_mountp) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		DIFF(vfs_fstype) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
		DIFF(vfs_fsckpass) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		DIFF(vfs_automnt) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
		DIFF(vfs_mntopts)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
getvfsent(FILE *fd, struct vfstab *vp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	int	ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	char	*tmp, *line;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	line = tsdalloc(_T_GETVFSENT, VFS_LINE_MAX, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	if (line == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	/* skip leading spaces and comments */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	if ((ret = getline(line, fd)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
		return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	/* split up each field */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	GETTOK_R(vfs_special, line, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	GETTOK_R(vfs_fsckdev, NULL, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	GETTOK_R(vfs_mountp, NULL, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	GETTOK_R(vfs_fstype, NULL, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	GETTOK_R(vfs_fsckpass, NULL, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
	GETTOK_R(vfs_automnt, NULL, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	GETTOK_R(vfs_mntopts, NULL, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	/* check for too many fields */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	if (strtok_r(NULL, sepstr, &tmp) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		return (VFS_TOOMANY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
getline(char *lp, FILE *fd)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	char	*cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	while ((lp = fgets(lp, VFS_LINE_MAX, fd)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
		if (strlen(lp) == VFS_LINE_MAX-1 && lp[VFS_LINE_MAX-2] != '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
			return (VFS_TOOLONG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
		for (cp = lp; *cp == ' ' || *cp == '\t'; cp++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
			;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		if (*cp != '#' && *cp != '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
}