usr/src/lib/libc/port/gen/getmntent.c
author eschrock
Fri, 19 Aug 2005 11:56:37 -0700
changeset 380 4ae8f505c115
parent 0 68f95e015346
child 4830 956da15b6610
permissions -rw-r--r--
6307489 getmntany() should not stat meaningless special devices
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
/*
380
4ae8f505c115 6307489 getmntany() should not stat meaningless special devices
eschrock
parents: 0
diff changeset
    23
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
0
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 getmntany = _getmntany
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#pragma weak getmntent = _getmntent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#pragma weak getextmntent = _getextmntent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#pragma weak resetmnttab = _resetmnttab
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#pragma weak hasmntopt = _hasmntopt
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include "synonyms.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <mtlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/stat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <sys/mnttab.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/mntio.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 <ctype.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#include <thread.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#include <synch.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#include <libc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#include "tsd.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
static int getmntent_compat(FILE *fp, struct mnttab *mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
static int convert_mntent(struct extmnttab *, struct extmnttab *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#define	GETTOK_R(xx, ll, tmp)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
	if ((mp->xx = (char *)strtok_r(ll, sepstr, tmp)) == NULL)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
		return (MNT_TOOFEW);\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	if (strcmp(mp->xx, dash) == 0)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
		mp->xx = NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#define	DIFF(xx)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	(mrefp->xx != NULL && (mgetp->xx == NULL ||\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	    strcmp(mrefp->xx, mgetp->xx) != 0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#define	SDIFF(xx, typem, typer)\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	((mgetp->xx == NULL) || (stat64(mgetp->xx, &statb) == -1) ||\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	((statb.st_mode & S_IFMT) != typem) ||\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	    (statb.st_rdev != typer))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
static const char	sepstr[] = " \t\n";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
static const char	dash[] = "-";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
typedef struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	size_t	buflen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
	char	*buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
} thread_data_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
destroy_thread_data(void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	thread_data_t *thread_data = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	if (thread_data->buf != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
		free(thread_data->buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
		thread_data->buf = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
	thread_data->buflen = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
getmntbuf(size_t size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
	thread_data_t *thread_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	if (size < MNT_LINE_MAX)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
		size = MNT_LINE_MAX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	thread_data = tsdalloc(_T_GETMNTENT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
	    sizeof (thread_data_t), destroy_thread_data);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	if (thread_data == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	if (thread_data->buf == NULL ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	    thread_data->buflen < size) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
		if (thread_data->buf != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
			free(thread_data->buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
		thread_data->buflen = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		if ((thread_data->buf = malloc(size)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
			return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		thread_data->buflen = size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	return (thread_data->buf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
getmntany(FILE *fp, struct mnttab *mgetp, struct mnttab *mrefp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	int	ret, bstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
	mode_t	bmode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	dev_t	brdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
	struct stat64	statb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
380
4ae8f505c115 6307489 getmntany() should not stat meaningless special devices
eschrock
parents: 0
diff changeset
   126
	/*
4ae8f505c115 6307489 getmntany() should not stat meaningless special devices
eschrock
parents: 0
diff changeset
   127
	 * Ignore specials that don't correspond to real devices to avoid doing
4ae8f505c115 6307489 getmntany() should not stat meaningless special devices
eschrock
parents: 0
diff changeset
   128
	 * unnecessary lookups in stat64().
4ae8f505c115 6307489 getmntany() should not stat meaningless special devices
eschrock
parents: 0
diff changeset
   129
	 */
4ae8f505c115 6307489 getmntany() should not stat meaningless special devices
eschrock
parents: 0
diff changeset
   130
	if (mrefp->mnt_special && mrefp->mnt_special[0] == '/' &&
4ae8f505c115 6307489 getmntany() should not stat meaningless special devices
eschrock
parents: 0
diff changeset
   131
	    stat64(mrefp->mnt_special, &statb) == 0 &&
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	    ((bmode = (statb.st_mode & S_IFMT)) == S_IFBLK ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	    bmode == S_IFCHR)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
		bstat = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
		brdev = statb.st_rdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
		bstat = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	while ((ret = getmntent(fp, mgetp)) == 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	    ((bstat == 0 && DIFF(mnt_special)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	    (bstat == 1 && SDIFF(mnt_special, bmode, brdev)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	    DIFF(mnt_mountp) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	    DIFF(mnt_fstype) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	    DIFF(mnt_mntopts) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	    DIFF(mnt_time)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
		;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
getmntent(FILE *fp, struct mnttab *mp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
	int	ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	struct	extmnttab *emp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	ret = ioctl(fileno(fp), MNTIOC_GETMNTENT, &emp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	switch (ret) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
		case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
			return (convert_mntent(emp, (struct extmnttab *)mp, 0));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
		case 1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
			return (getmntent_compat(fp, mp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
mntopt(char **p)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
	char *cp = *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	char *retstr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
	while (*cp && isspace(*cp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
		cp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	retstr = cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	while (*cp && *cp != ',')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
		cp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	if (*cp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
		*cp = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
		cp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	*p = cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	return (retstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
hasmntopt(struct mnttab *mnt, char *opt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	char tmpopts[MNT_LINE_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	char *f, *opts = tmpopts;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	if (mnt->mnt_mntopts == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	(void) strcpy(opts, mnt->mnt_mntopts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	f = mntopt(&opts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	for (; *f; f = mntopt(&opts)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
		if (strncmp(opt, f, strlen(opt)) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
			return (f - tmpopts + mnt->mnt_mntopts);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
/*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
getextmntent(FILE *fp, struct extmnttab *mp, size_t len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	int	ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	struct	extmnttab *emp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
	ret = ioctl(fileno(fp), MNTIOC_GETMNTENT, &emp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
	switch (ret) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		case 0:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
			return (convert_mntent(emp, mp, 1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
		case 1:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
			return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
resetmnttab(FILE *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	rewind(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
 * This is a horrible function, necessary to support this broken interface.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
 * Some callers of get(ext)mntent assume that the memory is valid even after the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
 * file is closed.  Since we switched to a direct ioctl() interface, this is no
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
 * longer true.  In order to support these apps, we have to put the data into a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
 * thread specific buffer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
convert_mntent(struct extmnttab *src, struct extmnttab *dst, int isext)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	size_t len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	char *buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
	len = src->mnt_time - src->mnt_special + strlen(src->mnt_time) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
	buf = getmntbuf(len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
	if (buf == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		errno = ENOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	memcpy(buf, src->mnt_special, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	dst->mnt_special = buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
	dst->mnt_mountp = buf + (src->mnt_mountp - src->mnt_special);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	dst->mnt_fstype = buf + (src->mnt_fstype - src->mnt_special);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	dst->mnt_mntopts = buf + (src->mnt_mntopts - src->mnt_special);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	dst->mnt_time = buf + (src->mnt_time - src->mnt_special);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	if (isext) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
		dst->mnt_major = src->mnt_major;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
		dst->mnt_minor = src->mnt_minor;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
 * Compatibility for non-mntfs files.  For backwards compatibility, we continue
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
 * to have to support this broken interface.  Note that getextmntent() has
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
 * always failed when using a file other than /etc/mnttab, because it relies on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
 * an ioctl() call.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
getline(char *lp, FILE *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
	char	*cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
	while ((lp = fgets(lp, MNT_LINE_MAX, fp)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		if (strlen(lp) == MNT_LINE_MAX-1 && lp[MNT_LINE_MAX-2] != '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
			return (MNT_TOOLONG);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		for (cp = lp; *cp == ' ' || *cp == '\t'; cp++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
			;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		if (*cp != '#' && *cp != '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
getmntent_compat(FILE *fp, struct mnttab *mp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
	int	ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	char	*tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	char	*line = getmntbuf(MNT_LINE_MAX);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	if (line == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
		errno = ENOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
		return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	/* skip leading spaces and comments */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	if ((ret = getline(line, fp)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
		return (ret);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	/* split up each field */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	GETTOK_R(mnt_special, line, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	GETTOK_R(mnt_mountp, NULL, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	GETTOK_R(mnt_fstype, NULL, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	GETTOK_R(mnt_mntopts, NULL, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	GETTOK_R(mnt_time, NULL, &tmp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	/* check for too many fields */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	if (strtok_r(NULL, sepstr, &tmp) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
		return (MNT_TOOMANY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
}