xref: /titanic_44/usr/src/cmd/rexd/mntent.c (revision 4bc0a2ef2b7ba50a7a717e7ddbf31472ad28e358)
1  /*
2   * CDDL HEADER START
3   *
4   * The contents of this file are subject to the terms of the
5   * Common Development and Distribution License, Version 1.0 only
6   * (the "License").  You may not use this file except in compliance
7   * with the License.
8   *
9   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10   * or http://www.opensolaris.org/os/licensing.
11   * See the License for the specific language governing permissions
12   * and limitations under the License.
13   *
14   * When distributing Covered Code, include this CDDL HEADER in each
15   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16   * If applicable, add the following below this CDDL HEADER, with the
17   * fields enclosed by brackets "[]" replaced with your own identifying
18   * information: Portions Copyright [yyyy] [name of copyright owner]
19   *
20   * CDDL HEADER END
21   *
22   * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
23   * Use is subject to license terms.
24   */
25  
26  #pragma ident	"%Z%%M%	%I%	%E% SMI"
27  
28  #define	LOCK_EX		1
29  
30  #include <stdio.h>
31  #include <ctype.h>
32  #include <sys/mntent.h>
33  #include <sys/mnttab.h>
34  
35  static	struct mnttab *mntp = 0;
36  
37  int getmntent(FILE *mnttabp, struct mnttab *mp);
38  static int mntdigit(char **p);
39  extern	char	*calloc();
40  
41  struct mnttab *
42  _mnt()
43  {
44  
45  	if (mntp == 0)
46  		mntp = (struct mnttab *)calloc(1, sizeof (struct mnttab));
47  	return (mntp);
48  }
49  
50  static char *
51  mntstr(p)
52  	register char **p;
53  {
54  	char *cp = *p;
55  	char *retstr;
56  
57  	while (*cp && isspace(*cp))
58  		cp++;
59  	retstr = cp;
60  	while (*cp && !isspace(*cp))
61  		cp++;
62  	if (*cp)
63  	{
64  		*cp = '\0';
65  		cp++;
66  	}
67  	*p = cp;
68  	return (retstr);
69  }
70  
71  static int
72  mntdigit(p)
73  	register char **p;
74  {
75  	register int value = 0;
76  	char *cp = *p;
77  
78  	while (*cp && isspace(*cp))
79  		cp++;
80  	for (; *cp && isdigit(*cp); cp++)
81  	{
82  		value *= 10;
83  		value += *cp - '0';
84  	}
85  	while (*cp && !isspace(*cp))
86  		cp++;
87  	if (*cp)
88  	{
89  		*cp = '\0';
90  		cp++;
91  	}
92  	*p = cp;
93  	return (value);
94  }
95  
96  static int
97  mnttabscan(FILE *mnttabp, struct mnttab *mnt)
98  {
99  	static	char *line = NULL;
100  	char *cp;
101  
102  	if (line == NULL)
103  		line = (char *)malloc(BUFSIZ+1);
104  	do
105  	{
106  		cp = fgets(line, 256, mnttabp);
107  		if (cp == NULL)
108  		{
109  			return (EOF);
110  		}
111  	} while (*cp == '#');
112  	mnt->mnt_special = mntstr(&cp);
113  	if (*cp == '\0')
114  		return (1);
115  	mnt->mnt_mountp = mntstr(&cp);
116  	if (*cp == '\0')
117  		return (2);
118  	mnt->mnt_fstype = mntstr(&cp);
119  	if (*cp == '\0')
120  		return (3);
121  	mnt->mnt_mntopts = mntstr(&cp);
122  	if (*cp == '\0')
123  		return (4);
124  	mnt->mnt_time = mntstr(&cp);
125  	return (5);
126  }
127  
128  FILE *
129  setmntent(fname, flag)
130  	char *fname;
131  	char *flag;
132  {
133  	FILE *mnttabp;
134  
135  	if ((mnttabp = fopen(fname, flag)) == NULL)
136  	{
137  		return (NULL);
138  	}
139  	for (; *flag ; flag++)
140  	{
141  		if (*flag == 'w' || *flag == 'a' || *flag == '+')
142  		{
143  			if (lockf(fileno(mnttabp), LOCK_EX, 0) < 0)
144  			{
145  				fclose(mnttabp);
146  				return (NULL);
147  			}
148  			break;
149  		}
150  	}
151  	return (mnttabp);
152  }
153  
154  int
155  endmntent(mnttabp)
156  	FILE *mnttabp;
157  {
158  
159  	if (mnttabp)
160  	{
161  		fclose(mnttabp);
162  	}
163  	return (1);
164  }
165  
166  /*
167   * #ifdef	NOWAY
168   * int getmntent (mnttabp, mp)
169   * 	FILE *mnttabp;
170   * 	struct mnttab *mp;
171   * {
172   * 	int nfields;
173   *
174   * 	if (mnttabp == 0)
175   * 		return (-1);
176   *
177   * 	if (_mnt() == 0)
178   * 		return (-1);
179   *
180   * 	nfields = mnttabscan(mnttabp, mntp);
181   *
182   * 	if (nfields == EOF || nfields != 5)
183   * 		return (-1);
184   *
185   * 	mp = mntp;
186   *
187   * 	return ( 0 );
188   * }
189   * #endif
190   *
191   *
192   * #ifdef	NOWAY
193   * struct mnttab *
194   * getmntent(mnttabp)
195   * 	FILE *mnttabp;
196   * {
197   * 	int nfields;
198   *
199   * 	if (mnttabp == 0)
200   * 		return ((struct mnttab *)0);
201   * 	if (_mnt() == 0)
202   * 		return ((struct mnttab *)0);
203   * 	nfields = mnttabscan(mnttabp, mntp);
204   * 	if (nfields == EOF || nfields != 5)
205   * 		return ((struct mnttab *)0);
206   * 	return (mntp);
207   * }
208   * #endif
209   */
210  
211  /*
212   * addmntent(mnttabp, mnt)
213   * 	FILE *mnttabp;
214   * 	register struct mnttab *mnt;
215   *
216   * 	if (fseek(mnttabp, 0L, 2) < 0)
217   * 		return (1);
218   * 	if (mnt == (struct mnttab *)0)
219   * 		return (1);
220   * 	if (mnt->mnt_special == NULL || mnt->mnt_mountp  == NULL ||
221   * 	    mnt->mnt_fstype   == NULL || mnt->mnt_mntopts == NULL)
222   * 		return (1);
223   *
224   * 	mntprtent(mnttabp, mnt);
225   * 	return (0);
226   * }
227   */
228  
229  static int
230  mntprtent(FILE *mnttabp, struct mnttab *mnt)
231  {
232  	fprintf(mnttabp, "%s\t%s\t%s\t%s\t%s\n",
233  	    mnt->mnt_special,
234  	    mnt->mnt_mountp,
235  	    mnt->mnt_fstype,
236  	    mnt->mnt_mntopts,
237  	    mnt->mnt_time);
238  	return(0);
239  }
240