Mercurial > gnulib
annotate lib/mountlist.c @ 1443:13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
From Paul Eggert.
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Sat, 25 Jul 1998 14:41:04 +0000 |
parents | 5919c19d9a1a |
children | 8a70cc03ce0d |
rev | line source |
---|---|
5 | 1 /* mountlist.c -- return a list of mounted filesystems |
1278
9ad625a30b7d
Use #if, not #ifdef with HAVE_ macros
Jim Meyering <jim@meyering.net>
parents:
1183
diff
changeset
|
2 Copyright (C) 1991, 1992, 1997, 1998 Free Software Foundation, Inc. |
5 | 3 |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
650
b4ef1c1a0171
update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents:
619
diff
changeset
|
15 along with this program; if not, write to the Free Software Foundation, |
b4ef1c1a0171
update FSF address in copyright
Jim Meyering <jim@meyering.net>
parents:
619
diff
changeset
|
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ |
5 | 17 |
1278
9ad625a30b7d
Use #if, not #ifdef with HAVE_ macros
Jim Meyering <jim@meyering.net>
parents:
1183
diff
changeset
|
18 #if HAVE_CONFIG_H |
917 | 19 # include <config.h> |
326 | 20 #endif |
21 | |
5 | 22 #include <stdio.h> |
23 #include <sys/types.h> | |
24 #include "mountlist.h" | |
25 | |
26 #ifdef STDC_HEADERS | |
917 | 27 # include <stdlib.h> |
5 | 28 #else |
29 void free (); | |
30 #endif | |
326 | 31 #if defined(STDC_HEADERS) || defined(HAVE_STRING_H) |
917 | 32 # include <string.h> |
5 | 33 #else |
917 | 34 # include <strings.h> |
5 | 35 #endif |
36 | |
1183
ebbcc79d5bef
Declare stpcpy only if not defined as macro.
Jim Meyering <jim@meyering.net>
parents:
928
diff
changeset
|
37 #ifndef strstr |
5 | 38 char *strstr (); |
1183
ebbcc79d5bef
Declare stpcpy only if not defined as macro.
Jim Meyering <jim@meyering.net>
parents:
928
diff
changeset
|
39 #endif |
5 | 40 char *xmalloc (); |
41 char *xrealloc (); | |
42 char *xstrdup (); | |
43 void error (); | |
44 | |
1399
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
45 #include <errno.h> |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
46 #ifndef errno |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
47 extern int errno; |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
48 #endif |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
49 |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
50 #ifdef HAVE_FCNTL_H |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
51 # include <fcntl.h> |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
52 #endif |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
53 |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
54 #ifdef HAVE_UNISTD_H |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
55 # include <unistd.h> |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
56 #endif |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
57 |
1278
9ad625a30b7d
Use #if, not #ifdef with HAVE_ macros
Jim Meyering <jim@meyering.net>
parents:
1183
diff
changeset
|
58 #if HAVE_SYS_PARAM_H |
917 | 59 # include <sys/param.h> |
326 | 60 #endif |
61 | |
62 #if defined (MOUNTED_GETFSSTAT) /* __alpha running OSF_1 */ | |
917 | 63 # include <sys/mount.h> |
64 # include <sys/fs_types.h> | |
326 | 65 #endif /* MOUNTED_GETFSSTAT */ |
66 | |
5 | 67 #ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ |
917 | 68 # include <mntent.h> |
69 # if !defined(MOUNTED) | |
5 | 70 # if defined(MNT_MNTTAB) /* HP-UX. */ |
917 | 71 # define MOUNTED MNT_MNTTAB |
5 | 72 # endif |
73 # if defined(MNTTABNAME) /* Dynix. */ | |
917 | 74 # define MOUNTED MNTTABNAME |
5 | 75 # endif |
917 | 76 # endif |
5 | 77 #endif |
78 | |
79 #ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */ | |
917 | 80 # include <sys/mount.h> |
5 | 81 #endif |
82 | |
83 #ifdef MOUNTED_GETMNT /* Ultrix. */ | |
917 | 84 # include <sys/mount.h> |
85 # include <sys/fs_types.h> | |
5 | 86 #endif |
87 | |
88 #ifdef MOUNTED_FREAD /* SVR2. */ | |
917 | 89 # include <mnttab.h> |
5 | 90 #endif |
91 | |
92 #ifdef MOUNTED_FREAD_FSTYP /* SVR3. */ | |
917 | 93 # include <mnttab.h> |
94 # include <sys/fstyp.h> | |
95 # include <sys/statfs.h> | |
5 | 96 #endif |
97 | |
619
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
98 #ifdef MOUNTED_LISTMNTENT |
917 | 99 # include <mntent.h> |
619
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
100 #endif |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
101 |
5 | 102 #ifdef MOUNTED_GETMNTENT2 /* SVR4. */ |
917 | 103 # include <sys/mnttab.h> |
5 | 104 #endif |
105 | |
106 #ifdef MOUNTED_VMOUNT /* AIX. */ | |
917 | 107 # include <fshelp.h> |
108 # include <sys/vfs.h> | |
5 | 109 #endif |
110 | |
326 | 111 #ifdef DOLPHIN |
112 /* So special that it's not worth putting this in autoconf. */ | |
917 | 113 # undef MOUNTED_FREAD_FSTYP |
114 # define MOUNTED_GETMNTTBL | |
326 | 115 #endif |
116 | |
1278
9ad625a30b7d
Use #if, not #ifdef with HAVE_ macros
Jim Meyering <jim@meyering.net>
parents:
1183
diff
changeset
|
117 #if HAVE_SYS_MNTENT_H |
918
09fe18b51677
(read_filesystem_list): Show automount-related
Jim Meyering <jim@meyering.net>
parents:
917
diff
changeset
|
118 /* This is to get MNTOPT_IGNORE on e.g. SVR4. */ |
09fe18b51677
(read_filesystem_list): Show automount-related
Jim Meyering <jim@meyering.net>
parents:
917
diff
changeset
|
119 # include <sys/mntent.h> |
09fe18b51677
(read_filesystem_list): Show automount-related
Jim Meyering <jim@meyering.net>
parents:
917
diff
changeset
|
120 #endif |
09fe18b51677
(read_filesystem_list): Show automount-related
Jim Meyering <jim@meyering.net>
parents:
917
diff
changeset
|
121 |
09fe18b51677
(read_filesystem_list): Show automount-related
Jim Meyering <jim@meyering.net>
parents:
917
diff
changeset
|
122 #if defined (MNTOPT_IGNORE) && defined (HAVE_HASMNTOPT) |
09fe18b51677
(read_filesystem_list): Show automount-related
Jim Meyering <jim@meyering.net>
parents:
917
diff
changeset
|
123 # define MNT_IGNORE(M) hasmntopt ((M), MNTOPT_IGNORE) |
09fe18b51677
(read_filesystem_list): Show automount-related
Jim Meyering <jim@meyering.net>
parents:
917
diff
changeset
|
124 #else |
09fe18b51677
(read_filesystem_list): Show automount-related
Jim Meyering <jim@meyering.net>
parents:
917
diff
changeset
|
125 # define MNT_IGNORE(M) 0 |
09fe18b51677
(read_filesystem_list): Show automount-related
Jim Meyering <jim@meyering.net>
parents:
917
diff
changeset
|
126 #endif |
09fe18b51677
(read_filesystem_list): Show automount-related
Jim Meyering <jim@meyering.net>
parents:
917
diff
changeset
|
127 |
5 | 128 #ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ |
129 /* Return the value of the hexadecimal number represented by CP. | |
130 No prefix (like '0x') or suffix (like 'h') is expected to be | |
131 part of CP. */ | |
132 | |
133 static int | |
134 xatoi (cp) | |
135 char *cp; | |
136 { | |
137 int val; | |
326 | 138 |
5 | 139 val = 0; |
140 while (*cp) | |
141 { | |
142 if (*cp >= 'a' && *cp <= 'f') | |
143 val = val * 16 + *cp - 'a' + 10; | |
144 else if (*cp >= 'A' && *cp <= 'F') | |
145 val = val * 16 + *cp - 'A' + 10; | |
146 else if (*cp >= '0' && *cp <= '9') | |
147 val = val * 16 + *cp - '0'; | |
148 else | |
149 break; | |
150 cp++; | |
151 } | |
152 return val; | |
153 } | |
154 #endif /* MOUNTED_GETMNTENT1. */ | |
155 | |
1389
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
156 #if MOUNTED_GETMNTINFO |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
157 |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
158 # if ! HAVE_F_FSTYPENAME_IN_STATFS |
5 | 159 static char * |
1389
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
160 fstype_to_string (short t) |
5 | 161 { |
162 switch (t) | |
163 { | |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
164 # ifdef MOUNT_PC |
5 | 165 case MOUNT_PC: |
166 return "pc"; | |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
167 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
168 # ifdef MOUNT_MFS |
5 | 169 case MOUNT_MFS: |
170 return "mfs"; | |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
171 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
172 # ifdef MOUNT_LO |
5 | 173 case MOUNT_LO: |
174 return "lo"; | |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
175 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
176 # ifdef MOUNT_TFS |
5 | 177 case MOUNT_TFS: |
178 return "tfs"; | |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
179 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
180 # ifdef MOUNT_TMP |
5 | 181 case MOUNT_TMP: |
182 return "tmp"; | |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
183 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
184 # ifdef MOUNT_UFS |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
185 case MOUNT_UFS: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
186 return "ufs" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
187 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
188 # ifdef MOUNT_NFS |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
189 case MOUNT_NFS: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
190 return "nfs" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
191 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
192 # ifdef MOUNT_MSDOS |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
193 case MOUNT_MSDOS: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
194 return "msdos" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
195 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
196 # ifdef MOUNT_LFS |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
197 case MOUNT_LFS: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
198 return "lfs" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
199 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
200 # ifdef MOUNT_LOFS |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
201 case MOUNT_LOFS: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
202 return "lofs" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
203 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
204 # ifdef MOUNT_FDESC |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
205 case MOUNT_FDESC: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
206 return "fdesc" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
207 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
208 # ifdef MOUNT_PORTAL |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
209 case MOUNT_PORTAL: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
210 return "portal" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
211 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
212 # ifdef MOUNT_NULL |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
213 case MOUNT_NULL: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
214 return "null" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
215 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
216 # ifdef MOUNT_UMAP |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
217 case MOUNT_UMAP: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
218 return "umap" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
219 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
220 # ifdef MOUNT_KERNFS |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
221 case MOUNT_KERNFS: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
222 return "kernfs" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
223 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
224 # ifdef MOUNT_PROCFS |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
225 case MOUNT_PROCFS: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
226 return "procfs" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
227 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
228 # ifdef MOUNT_AFS |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
229 case MOUNT_AFS: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
230 return "afs" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
231 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
232 # ifdef MOUNT_CD9660 |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
233 case MOUNT_CD9660: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
234 return "cd9660" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
235 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
236 # ifdef MOUNT_UNION |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
237 case MOUNT_UNION: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
238 return "union" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
239 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
240 # ifdef MOUNT_DEVFS |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
241 case MOUNT_DEVFS: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
242 return "devfs" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
243 # endif |
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
244 # ifdef MOUNT_EXT2FS |
736
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
245 case MOUNT_EXT2FS: |
bf298c166b8d
(fstype_to_string): Handle fstypes of freebsd.
Jim Meyering <jim@meyering.net>
parents:
650
diff
changeset
|
246 return "ext2fs" ; |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
247 # endif |
5 | 248 default: |
249 return "?"; | |
250 } | |
251 } | |
1396
f3912c1d7674
(fstype_to_string): Guard with #if ! HAVE_F_FSTYPENAME_IN_STATFS.
Jim Meyering <jim@meyering.net>
parents:
1389
diff
changeset
|
252 # endif /* ! HAVE_F_FSTYPENAME_IN_STATFS */ |
1389
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
253 |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
254 /* __NetBSD__ || BSD_NET2 || __OpenBSD__ */ |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
255 static char * |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
256 fsp_to_string (const struct statfs *fsp) |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
257 { |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
258 # if defined HAVE_F_FSTYPENAME_IN_STATFS |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
259 return xstrdup (fsp->f_fstypename); |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
260 # else |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
261 return fstype_to_string (fsp->f_type); |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
262 # endif |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
263 } |
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
264 |
5 | 265 #endif /* MOUNTED_GETMNTINFO */ |
266 | |
267 #ifdef MOUNTED_VMOUNT /* AIX. */ | |
268 static char * | |
269 fstype_to_string (t) | |
270 int t; | |
271 { | |
272 struct vfs_ent *e; | |
273 | |
274 e = getvfsbytype (t); | |
275 if (!e || !e->vfsent_name) | |
276 return "none"; | |
277 else | |
278 return e->vfsent_name; | |
279 } | |
280 #endif /* MOUNTED_VMOUNT */ | |
281 | |
282 /* Return a list of the currently mounted filesystems, or NULL on error. | |
283 Add each entry to the tail of the list so that they stay in order. | |
284 If NEED_FS_TYPE is nonzero, ensure that the filesystem type fields in | |
285 the returned list are valid. Otherwise, they might not be. | |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
286 If ALL_FS is positive, return all entries; if zero, omit entries |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
287 for filesystems that are automounter (dummy) entries; if negative, |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
288 also omit non-local filesystems. */ |
5 | 289 |
290 struct mount_entry * | |
1436
5919c19d9a1a
(read_filesystem_list): Fix more memory leaks on failure.
Jim Meyering <jim@meyering.net>
parents:
1413
diff
changeset
|
291 read_filesystem_list (int need_fs_type, int all_fs) |
5 | 292 { |
293 struct mount_entry *mount_list; | |
294 struct mount_entry *me; | |
1413 | 295 struct mount_entry **mtail = &mount_list; |
5 | 296 |
619
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
297 #ifdef MOUNTED_LISTMNTENT |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
298 { |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
299 struct tabmntent *mntlist, *p; |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
300 struct mntent *mnt; |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
301 struct mount_entry *me; |
876 | 302 |
619
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
303 /* the third and fourth arguments could be used to filter mounts, |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
304 but Crays doesn't seem to have any mounts that we want to |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
305 remove. Specifically, automount create normal NFS mounts. |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
306 */ |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
307 |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
308 if(listmntent(&mntlist, KMTAB, NULL, NULL) < 0) |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
309 return NULL; |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
310 for (p = mntlist; p; p = p->next) { |
619
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
311 mnt = p->ment; |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
312 if (all_fs < 0 && REMOTE_FS_TYPE (mnt->mnt_type)) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
313 continue; |
619
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
314 me = (struct mount_entry*) xmalloc(sizeof (struct mount_entry)); |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
315 me->me_devname = xstrdup(mnt->mnt_fsname); |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
316 me->me_mountdir = xstrdup(mnt->mnt_dir); |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
317 me->me_type = xstrdup(mnt->mnt_type); |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
318 me->me_dev = -1; |
1413 | 319 *mtail = me; |
320 mtail = &me->me_next; | |
619
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
321 } |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
322 freemntlist(mntlist); |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
323 } |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
324 #endif |
dbaeca6a1983
(read_filesystem_list) [MOUNTED_LISTMNTENT]: New function.
Jim Meyering <jim@meyering.net>
parents:
492
diff
changeset
|
325 |
5 | 326 #ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ |
327 { | |
328 struct mntent *mnt; | |
329 char *table = MOUNTED; | |
330 FILE *fp; | |
331 char *devopt; | |
332 | |
333 fp = setmntent (table, "r"); | |
334 if (fp == NULL) | |
335 return NULL; | |
336 | |
337 while ((mnt = getmntent (fp))) | |
338 { | |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
339 if (all_fs <= 0 && (!strcmp (mnt->mnt_type, "ignore") |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
340 || !strcmp (mnt->mnt_type, "auto"))) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
341 continue; |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
342 if (all_fs < 0 && REMOTE_FS_TYPE (mnt->mnt_type)) |
5 | 343 continue; |
344 | |
345 me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); | |
346 me->me_devname = xstrdup (mnt->mnt_fsname); | |
347 me->me_mountdir = xstrdup (mnt->mnt_dir); | |
348 me->me_type = xstrdup (mnt->mnt_type); | |
349 devopt = strstr (mnt->mnt_opts, "dev="); | |
350 if (devopt) | |
351 { | |
352 if (devopt[4] == '0' && (devopt[5] == 'x' || devopt[5] == 'X')) | |
353 me->me_dev = xatoi (devopt + 6); | |
354 else | |
355 me->me_dev = xatoi (devopt + 4); | |
356 } | |
357 else | |
492
33a21db1201a
(read_filesystem_list): Cast -1 to dev_t before assignment.
Jim Meyering <jim@meyering.net>
parents:
326
diff
changeset
|
358 me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ |
5 | 359 |
360 /* Add to the linked list. */ | |
1413 | 361 *mtail = me; |
362 mtail = &me->me_next; | |
5 | 363 } |
364 | |
365 if (endmntent (fp) == 0) | |
1413 | 366 goto free_then_fail; |
5 | 367 } |
368 #endif /* MOUNTED_GETMNTENT1. */ | |
369 | |
370 #ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */ | |
371 { | |
372 struct statfs *fsp; | |
373 int entries; | |
374 | |
375 entries = getmntinfo (&fsp, MNT_NOWAIT); | |
376 if (entries < 0) | |
377 return NULL; | |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
378 for (; entries-- > 0; fsp++) |
5 | 379 { |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
380 if (all_fs < 0) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
381 { |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
382 # ifdef HAVE_F_FSTYPENAME_IN_STATFS |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
383 if (REMOTE_FS_TYPE (fsp->f_fstypename)) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
384 continue; |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
385 # else |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
386 # ifdef MOUNT_NFS |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
387 if (REMOTE_FS_TYPE (fstype_to_string (fsp->f_type))) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
388 continue; |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
389 # endif |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
390 # endif |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
391 } |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
392 |
5 | 393 me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); |
394 me->me_devname = xstrdup (fsp->f_mntfromname); | |
395 me->me_mountdir = xstrdup (fsp->f_mntonname); | |
1389
e947a465b033
(fsp_to_string): Clean out some crufty #ifdefs
Jim Meyering <jim@meyering.net>
parents:
1278
diff
changeset
|
396 me->me_type = fsp_to_string (fsp); |
492
33a21db1201a
(read_filesystem_list): Cast -1 to dev_t before assignment.
Jim Meyering <jim@meyering.net>
parents:
326
diff
changeset
|
397 me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ |
5 | 398 |
399 /* Add to the linked list. */ | |
1413 | 400 *mtail = me; |
401 mtail = &me->me_next; | |
5 | 402 } |
403 } | |
404 #endif /* MOUNTED_GETMNTINFO */ | |
405 | |
406 #ifdef MOUNTED_GETMNT /* Ultrix. */ | |
407 { | |
408 int offset = 0; | |
409 int val; | |
410 struct fs_data fsd; | |
411 | |
1413 | 412 while (errno = 0, |
413 0 <= (val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY, | |
414 (char *) 0))) | |
5 | 415 { |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
416 if (all_fs < 0 && REMOTE_FS_TYPE (gt_names[fsd.fd_req.fstype])) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
417 continue; |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
418 |
5 | 419 me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); |
420 me->me_devname = xstrdup (fsd.fd_req.devname); | |
421 me->me_mountdir = xstrdup (fsd.fd_req.path); | |
422 me->me_type = gt_names[fsd.fd_req.fstype]; | |
423 me->me_dev = fsd.fd_req.dev; | |
424 | |
425 /* Add to the linked list. */ | |
1413 | 426 *mtail = me; |
427 mtail = &me->me_next; | |
5 | 428 } |
429 if (val < 0) | |
1413 | 430 goto free_then_fail; |
5 | 431 } |
432 #endif /* MOUNTED_GETMNT. */ | |
433 | |
326 | 434 #if defined (MOUNTED_GETFSSTAT) /* __alpha running OSF_1 */ |
435 { | |
436 int numsys, counter, bufsize; | |
437 struct statfs *stats; | |
438 | |
439 numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT); | |
440 if (numsys < 0) | |
441 return (NULL); | |
442 | |
443 bufsize = (1 + numsys) * sizeof (struct statfs); | |
444 stats = (struct statfs *)xmalloc (bufsize); | |
445 numsys = getfsstat (stats, bufsize, MNT_WAIT); | |
446 | |
447 if (numsys < 0) | |
448 { | |
449 free (stats); | |
450 return (NULL); | |
451 } | |
452 | |
453 for (counter = 0; counter < numsys; counter++) | |
454 { | |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
455 if (all_fs < 0 && REMOTE_FS_TYPE (mnt_names[stats[counter].f_type])) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
456 continue; |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
457 |
326 | 458 me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); |
459 me->me_devname = xstrdup (stats[counter].f_mntfromname); | |
460 me->me_mountdir = xstrdup (stats[counter].f_mntonname); | |
461 me->me_type = mnt_names[stats[counter].f_type]; | |
492
33a21db1201a
(read_filesystem_list): Cast -1 to dev_t before assignment.
Jim Meyering <jim@meyering.net>
parents:
326
diff
changeset
|
462 me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ |
326 | 463 |
464 /* Add to the linked list. */ | |
1413 | 465 *mtail = me; |
466 mtail = &me->me_next; | |
326 | 467 } |
468 | |
469 free (stats); | |
470 } | |
471 #endif /* MOUNTED_GETFSSTAT */ | |
472 | |
5 | 473 #if defined (MOUNTED_FREAD) || defined (MOUNTED_FREAD_FSTYP) /* SVR[23]. */ |
474 { | |
475 struct mnttab mnt; | |
476 char *table = "/etc/mnttab"; | |
477 FILE *fp; | |
478 | |
479 fp = fopen (table, "r"); | |
480 if (fp == NULL) | |
481 return NULL; | |
482 | |
483 while (fread (&mnt, sizeof mnt, 1, fp) > 0) | |
484 { | |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
485 char *fs_type = ""; |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
486 |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
487 # ifdef GETFSTYP /* SVR3. */ |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
488 if (need_fs_type || all_fs < 0) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
489 { |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
490 struct statfs fsd; |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
491 char typebuf[FSTYPSZ]; |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
492 |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
493 if (statfs (mnt.mt_filsys, &fsd, sizeof fsd, 0) != -1 |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
494 && sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
495 { |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
496 if (all_fs < 0 && REMOTE_FS_TYPE (typebuf)) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
497 continue; |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
498 fs_type = xstrdup (typebuf); |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
499 } |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
500 } |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
501 # endif |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
502 |
5 | 503 me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); |
917 | 504 # ifdef GETFSTYP /* SVR3. */ |
5 | 505 me->me_devname = xstrdup (mnt.mt_dev); |
917 | 506 # else |
5 | 507 me->me_devname = xmalloc (strlen (mnt.mt_dev) + 6); |
508 strcpy (me->me_devname, "/dev/"); | |
509 strcpy (me->me_devname + 5, mnt.mt_dev); | |
917 | 510 # endif |
5 | 511 me->me_mountdir = xstrdup (mnt.mt_filsys); |
492
33a21db1201a
(read_filesystem_list): Cast -1 to dev_t before assignment.
Jim Meyering <jim@meyering.net>
parents:
326
diff
changeset
|
512 me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
513 me->me_type = fs_type; |
5 | 514 |
515 /* Add to the linked list. */ | |
1413 | 516 *mtail = me; |
517 mtail = &me->me_next; | |
518 } | |
519 | |
520 if (ferror (fp)) | |
521 { | |
522 int saved_errno = errno; | |
523 fclose (fp); | |
524 errno = saved_errno; | |
525 goto free_then_fail; | |
5 | 526 } |
527 | |
528 if (fclose (fp) == EOF) | |
1413 | 529 goto free_then_fail; |
5 | 530 } |
531 #endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP. */ | |
532 | |
326 | 533 #ifdef MOUNTED_GETMNTTBL /* DolphinOS goes it's own way */ |
534 { | |
535 struct mntent **mnttbl=getmnttbl(),**ent; | |
536 for (ent=mnttbl;*ent;ent++) | |
537 { | |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
538 if (all_fs < 0 && REMOTE_FS_TYPE ((*ent)->mt_fstype)) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
539 continue; |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
540 |
326 | 541 me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); |
542 me->me_devname = xstrdup ( (*ent)->mt_resource); | |
543 me->me_mountdir = xstrdup( (*ent)->mt_directory); | |
544 me->me_type = xstrdup ((*ent)->mt_fstype); | |
492
33a21db1201a
(read_filesystem_list): Cast -1 to dev_t before assignment.
Jim Meyering <jim@meyering.net>
parents:
326
diff
changeset
|
545 me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ |
326 | 546 |
547 /* Add to the linked list. */ | |
1413 | 548 *mtail = me; |
549 mtail = &me->me_next; | |
326 | 550 } |
551 endmnttbl(); | |
552 } | |
553 #endif | |
554 | |
5 | 555 #ifdef MOUNTED_GETMNTENT2 /* SVR4. */ |
556 { | |
557 struct mnttab mnt; | |
558 char *table = MNTTAB; | |
559 FILE *fp; | |
560 int ret; | |
1399
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
561 int lockfd = -1; |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
562 |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
563 # if defined F_RDLCK && defined F_SETLKW |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
564 /* MNTTAB_LOCK is a macro name of our own invention; it's not present in |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
565 e.g. Solaris 2.6. If the SVR4 folks ever define a macro |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
566 for this file name, we should use their macro name instead. |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
567 (Why not just lock MNTTAB directly? We don't know.) */ |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
568 # ifndef MNTTAB_LOCK |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
569 # define MNTTAB_LOCK "/etc/.mnttab.lock" |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
570 # endif |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
571 lockfd = open (MNTTAB_LOCK, O_RDONLY); |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
572 if (0 <= lockfd) |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
573 { |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
574 struct flock flock; |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
575 flock.l_type = F_RDLCK; |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
576 flock.l_whence = SEEK_SET; |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
577 flock.l_start = 0; |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
578 flock.l_len = 0; |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
579 while (fcntl (lockfd, F_SETLKW, &flock) == -1) |
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
580 if (errno != EINTR) |
1413 | 581 { |
582 int saved_errno = errno; | |
583 close (lockfd); | |
584 errno = saved_errno; | |
585 return NULL; | |
586 } | |
1399
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
587 } |
1413 | 588 else if (errno != ENOENT) |
589 return NULL; | |
1399
edb0581923b9
(read_filesystem_list): If SVR4, lock /etc/.mnttab.lock if available,
Jim Meyering <jim@meyering.net>
parents:
1396
diff
changeset
|
590 # endif |
5 | 591 |
1413 | 592 errno = 0; |
5 | 593 fp = fopen (table, "r"); |
594 if (fp == NULL) | |
1413 | 595 ret = errno; |
1401 | 596 else |
1400
8e5de8bcae9f
(read_filesystem_list) [MOUNTED_GETMNTENT2]:
Jim Meyering <jim@meyering.net>
parents:
1399
diff
changeset
|
597 { |
1401 | 598 while ((ret = getmntent (fp, &mnt)) == 0) |
599 { | |
600 /* Don't show automounted filesystems twice on e.g., Solaris. */ | |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
601 if (all_fs <= 0 && MNT_IGNORE (&mnt)) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
602 continue; |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
603 |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
604 if (all_fs < 0 && REMOTE_FS_TYPE (mnt.mnt_fstype)) |
1401 | 605 continue; |
606 | |
607 me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); | |
608 me->me_devname = xstrdup (mnt.mnt_special); | |
609 me->me_mountdir = xstrdup (mnt.mnt_mountp); | |
610 me->me_type = xstrdup (mnt.mnt_fstype); | |
611 me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ | |
612 | |
613 /* Add to the linked list. */ | |
1413 | 614 *mtail = me; |
615 mtail = &me->me_next; | |
1401 | 616 } |
617 | |
1413 | 618 ret = fclose (fp) == EOF ? errno : 0 < ret ? 0 : -1; |
1400
8e5de8bcae9f
(read_filesystem_list) [MOUNTED_GETMNTENT2]:
Jim Meyering <jim@meyering.net>
parents:
1399
diff
changeset
|
619 } |
5 | 620 |
1401 | 621 if (0 <= lockfd && close (lockfd) != 0) |
1413 | 622 ret = errno; |
5 | 623 |
1413 | 624 if (0 <= ret) |
625 { | |
626 errno = ret; | |
627 goto free_then_fail; | |
628 } | |
5 | 629 } |
630 #endif /* MOUNTED_GETMNTENT2. */ | |
631 | |
632 #ifdef MOUNTED_VMOUNT /* AIX. */ | |
633 { | |
634 int bufsize; | |
635 char *entries, *thisent; | |
636 struct vmount *vmp; | |
637 | |
638 /* Ask how many bytes to allocate for the mounted filesystem info. */ | |
639 mntctl (MCTL_QUERY, sizeof bufsize, (struct vmount *) &bufsize); | |
640 entries = xmalloc (bufsize); | |
641 | |
642 /* Get the list of mounted filesystems. */ | |
643 mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries); | |
644 | |
645 for (thisent = entries; thisent < entries + bufsize; | |
646 thisent += vmp->vmt_length) | |
647 { | |
648 vmp = (struct vmount *) thisent; | |
1443
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
649 if (all_fs < 0 && vmp->vmt_flags & MNT_REMOTE) |
13bcee72981f
(read_filesystem_list): If all_fs is negative, omit non-local filesytems.
Jim Meyering <jim@meyering.net>
parents:
1436
diff
changeset
|
650 continue; |
5 | 651 me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); |
652 if (vmp->vmt_flags & MNT_REMOTE) | |
653 { | |
654 char *host, *path; | |
655 | |
656 /* Prepend the remote pathname. */ | |
657 host = thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off; | |
658 path = thisent + vmp->vmt_data[VMT_OBJECT].vmt_off; | |
659 me->me_devname = xmalloc (strlen (host) + strlen (path) + 2); | |
660 strcpy (me->me_devname, host); | |
661 strcat (me->me_devname, ":"); | |
662 strcat (me->me_devname, path); | |
663 } | |
664 else | |
665 { | |
326 | 666 me->me_devname = xstrdup (thisent + |
5 | 667 vmp->vmt_data[VMT_OBJECT].vmt_off); |
668 } | |
669 me->me_mountdir = xstrdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off); | |
670 me->me_type = xstrdup (fstype_to_string (vmp->vmt_gfstype)); | |
492
33a21db1201a
(read_filesystem_list): Cast -1 to dev_t before assignment.
Jim Meyering <jim@meyering.net>
parents:
326
diff
changeset
|
671 me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want. */ |
5 | 672 |
673 /* Add to the linked list. */ | |
1413 | 674 *mtail = me; |
675 mtail = &me->me_next; | |
5 | 676 } |
677 free (entries); | |
678 } | |
679 #endif /* MOUNTED_VMOUNT. */ | |
680 | |
1413 | 681 *mtail = NULL; |
5 | 682 return mount_list; |
1413 | 683 |
684 | |
685 free_then_fail: | |
686 { | |
687 int saved_errno = errno; | |
688 *mtail = NULL; | |
1436
5919c19d9a1a
(read_filesystem_list): Fix more memory leaks on failure.
Jim Meyering <jim@meyering.net>
parents:
1413
diff
changeset
|
689 |
1413 | 690 while (mount_list) |
691 { | |
692 me = mount_list->me_next; | |
1436
5919c19d9a1a
(read_filesystem_list): Fix more memory leaks on failure.
Jim Meyering <jim@meyering.net>
parents:
1413
diff
changeset
|
693 free (mount_list->me_devname); |
5919c19d9a1a
(read_filesystem_list): Fix more memory leaks on failure.
Jim Meyering <jim@meyering.net>
parents:
1413
diff
changeset
|
694 free (mount_list->me_mountdir); |
5919c19d9a1a
(read_filesystem_list): Fix more memory leaks on failure.
Jim Meyering <jim@meyering.net>
parents:
1413
diff
changeset
|
695 /* FIXME: me_type is not always malloced. */ |
1413 | 696 free (mount_list); |
697 mount_list = me; | |
698 } | |
699 | |
700 errno = saved_errno; | |
701 return NULL; | |
702 } | |
5 | 703 } |