Updated from ../gpl2lgpl.sed /home/gd/gnu/lib/error.c
[kopensolaris-gnu/glibc.git] / misc / fstab.c
1 /* 
2 Copyright (C) 1995 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 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 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB.  If
17 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
18 Cambridge, MA 02139, USA.  */
19
20 #include <fstab.h>
21 #include <mntent.h>
22 #include <stdio.h>
23
24 static FILE *fstab;
25
26 static FILE *
27 fstab_stream (void)
28 {
29   if (! fstab)
30     fstab = setmntent (_PATH_FSTAB, "r");
31   return fstab;
32 }
33
34 int
35 setfsent (void)
36 {
37   if (fstab)
38     {
39       rewind (fstab);
40       return 1;
41     }
42   else
43     fstab = setmntent (_PATH_FSTAB, "r");
44   return fstab ? 0 : 1;
45 }
46
47 static struct fstab *
48 mnt2fs (struct mntent *m)
49 {
50   static struct fstab f;
51   f.fs_spec = m->mnt_fsname;
52   f.fs_file = m->mnt_dir;
53   f.fs_vfstype = m->mnt_type;
54   f.fs_mntops = m->mnt_opts;
55   f.fs_type = (hasmntopt (m, FSTAB_RW) ? (char *) FSTAB_RW :
56                hasmntopt (m, FSTAB_RQ) ? (char *) FSTAB_RQ :
57                hasmntopt (m, FSTAB_RO) ? (char *) FSTAB_RO :
58                hasmntopt (m, FSTAB_SW) ? (char *) FSTAB_SW :
59                hasmntopt (m, FSTAB_XX) ? (char *) FSTAB_XX :
60                (char *) "??");
61   f.fs_freq = m->mnt_freq;
62   f.fs_passno = m->mnt_passno;
63   return &f;
64 }
65
66 struct fstab *
67 getfsent (void)
68 {
69   FILE *s = fstab_stream ();
70
71   if (! s)
72     return NULL;
73   
74   return mnt2fs (getmntent (s));
75 }
76
77 struct fstab *
78 getfsspec (name)
79      register const char *name;
80 {
81   struct mntent *m;
82   if (setfsent ())
83     while (m = getmntent (fstab))
84       if (!strcmp (m->mnt_fsname, name))
85         return mnt2fs (m);
86   return NULL;
87 }
88
89 struct fstab *
90 getfsfile (name)
91         register const char *name;
92 {
93   struct mntent *m;
94   if (setfsent ())
95     while (m = getmntent (fstab))
96       if (!strcmp (m->mnt_dir, name))
97         return mnt2fs (m);
98   return NULL;
99 }
100
101 void
102 endfsent ()
103 {
104   if (fstab)
105     {
106       (void) endmntent (fstab);
107       fstab = NULL;
108     }
109 }