Replace linux-style getmntent and co. with solaris-style functions
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / mnttab.c
1 /* Copyright (C) 2008 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <stdio.h>
21 #include <string.h>
22 #include <ctype.h>
23 #include <sys/ioctl.h>
24 #include <sys/mnttab.h>
25 #include <sys/mntio.h>
26
27 /* Docs: http://docs.sun.com/app/docs/doc/816-5168/resetmnttab-3c  */
28
29 #define _MNT_CMP(x, y, f) \
30         (!y->f || (y->f && strcmp (x->f, y->f) == 0))
31
32
33 int getmntent (FILE *fp, struct mnttab *mt)
34 {
35   struct extmnttab emt;
36   int res = ioctl (fileno (fp), MNTIOC_GETMNTENT, &emt);
37   if (res != 0)
38     return -1;
39
40   mt->mnt_special = emt.mnt_special;
41   mt->mnt_mountp = emt.mnt_mountp;
42   mt->mnt_fstype = emt.mnt_fstype;
43   mt->mnt_mntopts = emt.mnt_mntopts;
44   mt->mnt_time = emt.mnt_time;
45
46   return 0;
47 }
48
49
50 int getmntany (FILE *fp, struct mnttab *mt, struct mnttab *mtpref)
51 {
52   int res;
53   while ((res = getmntent (fp, mt)) == 0)
54     {
55       if (_MNT_CMP (mt, mtpref, mnt_special) &&
56           _MNT_CMP (mt, mtpref, mnt_mountp) &&
57           _MNT_CMP (mt, mtpref, mnt_fstype) &&
58           _MNT_CMP (mt, mtpref, mnt_mntopts) &&
59           _MNT_CMP (mt, mtpref, mnt_time))
60         return 0;
61     }
62
63   return res;
64 }
65
66
67 int getextmntent (FILE *fp, struct extmnttab *emt, size_t len)
68 {
69   int res = ioctl (fileno (fp), MNTIOC_GETMNTENT, emt);
70   if (res != 0)
71     return -1;
72   return 0;
73 }
74
75
76 char *mntopt (char **opts)
77 {
78   char *optsp = *opts;
79
80   /* Strip leading spaces.  */
81   while (*optsp == ' ')
82     optsp++;
83
84   /* Find comma.  */
85   char *ret = optsp;
86   while (*optsp != ',' && *optsp != '\0')
87     optsp++;
88
89   /* Replace comma with null terminator.  */
90   if (*optsp == ',')
91     optsp++;
92   *opts = optsp;
93
94   return ret;
95 }
96
97
98 char * hasmntopt (struct mnttab *mt, char *opt)
99 {
100   /* We make a copy of mnt_mntopts since we modify it.  */
101   char buf[MNT_LINE_MAX + 1];
102   strncpy (buf, mt->mnt_mntopts, sizeof (buf))[MNT_LINE_MAX] = '\0';
103
104   char *opts = buf;
105   char *optp;
106   size_t len = strlen (opt);
107   while (*(optp = mntopt (&opts)))
108     {
109       /* Check if opt matched, taking into account delimiters (e.g. '=').  */
110       if (strncmp (optp, opt, len) == 0 && !isalnum (optp[len]))
111         return mt->mnt_mntopts + (optp - buf);
112     }
113
114   return NULL;
115 }
116
117
118 void resetmnttab (FILE *fp)
119 {
120   rewind (fp);
121 }