/[baselayout]/trunk/src/mountinfo.c
Gentoo

Contents of /trunk/src/mountinfo.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2784 - (show annotations) (download) (as text)
Mon Jul 16 17:07:15 2007 UTC (7 years, 5 months ago) by uberlord
File MIME type: text/x-csrc
File size: 5996 byte(s)
Use printf so we don't put blank lines at the top of new files and fix mountinfo for nfs roots
1 /*
2 mountinfo.c
3 Obtains information about mounted filesystems.
4
5 Copyright 2007 Gentoo Foundation
6 */
7
8 #define APPLET "mountinfo"
9
10 #include <sys/types.h>
11 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
12 #include <sys/param.h>
13 #include <sys/ucred.h>
14 #include <sys/mount.h>
15 #elif defined(__linux__)
16 #include <limits.h>
17 #endif
18
19 #include <errno.h>
20 #include <getopt.h>
21 #include <limits.h>
22 #include <regex.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26
27 #include "einfo.h"
28 #include "rc.h"
29 #include "rc-misc.h"
30 #include "strlist.h"
31
32
33 #if defined(__FreeBSD__) || defined(__NetBSD__) || defined (__OpenBSD__)
34 static char **find_mounts (regex_t *node_regex, regex_t *skip_node_regex,
35 regex_t *fstype_regex, regex_t *skip_fstype_regex,
36 char **mounts, bool node, bool fstype)
37 {
38 struct statfs *mnts;
39 int nmnts;
40 int i;
41 char **list = NULL;
42
43 if ((nmnts = getmntinfo (&mnts, MNT_NOWAIT)) == 0)
44 eerrorx ("getmntinfo: %s", strerror (errno));
45
46 for (i = 0; i < nmnts; i++) {
47 if (node_regex &&
48 regexec (node_regex, mnts[i].f_mntfromname, 0, NULL, 0) != 0)
49 continue;
50 if (skip_node_regex &&
51 regexec (skip_node_regex, mnts[i].f_mntfromname, 0, NULL, 0) == 0)
52 continue;
53 if (fstype_regex &&
54 regexec (fstype_regex, mnts[i].f_fstypename, 0, NULL, 0) != 0)
55 continue;
56 if (skip_fstype_regex &&
57 regexec (skip_fstype_regex, mnts[i].f_fstypename, 0, NULL, 0) == 0)
58 continue;
59
60 if (mounts) {
61 bool found = false;
62 int j;
63 char *mnt;
64 STRLIST_FOREACH (mounts, mnt, j)
65 if (strcmp (mnt, mnts[i].f_mntonname) == 0) {
66 found = true;
67 break;
68 }
69 if (! found)
70 continue;
71 }
72
73 list = rc_strlist_addsortc (list, node ?
74 mnts[i].f_mntfromname :
75 fstype ? mnts[i].f_fstypename :
76 mnts[i].f_mntonname);
77 }
78
79 return (list);
80 }
81
82 #elif defined (__linux__)
83 static char **find_mounts (regex_t *node_regex, regex_t *skip_node_regex,
84 regex_t *fstype_regex, regex_t *skip_fstype_regex,
85 char **mounts, bool node, bool fstype)
86 {
87 FILE *fp;
88 char buffer[PATH_MAX * 3];
89 char *p;
90 char *from;
91 char *to;
92 char *fst;
93 char **list = NULL;
94
95 if ((fp = fopen ("/proc/mounts", "r")) == NULL)
96 eerrorx ("getmntinfo: %s", strerror (errno));
97
98 while (fgets (buffer, sizeof (buffer), fp)) {
99 p = buffer;
100 from = strsep (&p, " ");
101 if (node_regex &&
102 regexec (node_regex, from, 0, NULL, 0) != 0)
103 continue;
104 if (skip_node_regex &&
105 regexec (skip_node_regex, from, 0, NULL, 0) == 0)
106 continue;
107
108 to = strsep (&p, " ");
109 fst = strsep (&p, " ");
110 /* Skip the really silly rootfs */
111 if (strcmp (fst, "rootfs") == 0)
112 continue;
113 if (fstype_regex &&
114 regexec (fstype_regex, fst, 0, NULL, 0) != 0)
115 continue;
116 if (skip_fstype_regex &&
117 regexec (skip_fstype_regex, fst, 0, NULL, 0) == 0)
118 continue;
119
120 if (mounts) {
121 bool found = false;
122 int j;
123 char *mnt;
124 STRLIST_FOREACH (mounts, mnt, j)
125 if (strcmp (mnt, to) == 0) {
126 found = true;
127 break;
128 }
129 if (! found)
130 continue;
131 }
132
133 list = rc_strlist_addsortc (list, node ? from : fstype ? fst : to);
134 }
135 fclose (fp);
136
137 return (list);
138 }
139
140 #else
141 # error "Operating system not supported!"
142 #endif
143
144 static regex_t *get_regex (char *string)
145 {
146 regex_t *reg = rc_xmalloc (sizeof (regex_t));
147 int result;
148 char buffer[256];
149
150 if ((result = regcomp (reg, string, REG_EXTENDED | REG_NOSUB)) != 0)
151 {
152 regerror (result, reg, buffer, sizeof (buffer));
153 eerrorx ("%s: invalid regex `%s'", APPLET, buffer);
154 }
155
156 return (reg);
157 }
158
159 #include "_usage.h"
160 #define getoptstring "f:F:n:N:p:P:os" getoptstring_COMMON
161 static struct option longopts[] = {
162 { "fstype-regex", 1, NULL, 'f'},
163 { "skip-fstype-regex", 1, NULL, 'F'},
164 { "node-regex", 1, NULL, 'n'},
165 { "skip-node-regex", 1, NULL, 'N'},
166 { "point-regex", 1, NULL, 'p'},
167 { "skip-point-regex", 1, NULL, 'P'},
168 { "node", 0, NULL, 'o'},
169 { "fstype", 0, NULL, 's'},
170 longopts_COMMON
171 { NULL, 0, NULL, 0}
172 };
173 #include "_usage.c"
174
175 int main (int argc, char **argv)
176 {
177 int i;
178 regex_t *fstype_regex = NULL;
179 regex_t *node_regex = NULL;
180 regex_t *point_regex = NULL;
181 regex_t *skip_fstype_regex = NULL;
182 regex_t *skip_node_regex = NULL;
183 regex_t *skip_point_regex = NULL;
184 char **nodes = NULL;
185 char *n;
186 bool node = false;
187 bool fstype = false;
188 char **mounts = NULL;
189 int opt;
190 int result;
191
192 #define DO_REG(_var) \
193 if (_var) free (_var); \
194 _var = get_regex (optarg);
195
196 while ((opt = getopt_long (argc, argv, getoptstring,
197 longopts, (int *) 0)) != -1)
198 {
199 switch (opt) {
200 case 'f':
201 DO_REG (fstype_regex);
202 break;
203 case 'F':
204 DO_REG (skip_fstype_regex);
205 break;
206 case 'n':
207 DO_REG (node_regex);
208 break;
209 case 'N':
210 DO_REG (skip_node_regex);
211 break;
212 case 'p':
213 DO_REG (point_regex);
214 break;
215 case 'P':
216 DO_REG (skip_point_regex);
217 break;
218 case 'o':
219 node = true;
220 fstype = false;
221 break;
222 case 's':
223 node = false;
224 fstype = true;
225 break;
226
227 case_RC_COMMON_GETOPT
228 }
229 }
230
231 while (optind < argc) {
232 if (argv[optind][0] != '/')
233 eerrorx ("%s: `%s' is not a mount point", argv[0], argv[optind]);
234 mounts = rc_strlist_add (mounts, argv[optind++]);
235 }
236
237 nodes = find_mounts (node_regex, skip_node_regex,
238 fstype_regex, skip_fstype_regex,
239 mounts, node, fstype);
240
241 if (node_regex)
242 regfree (node_regex);
243 if (skip_node_regex)
244 regfree (skip_node_regex);
245 if (fstype_regex)
246 regfree (fstype_regex);
247 if (skip_fstype_regex)
248 regfree (skip_fstype_regex);
249
250 rc_strlist_reverse (nodes);
251
252 result = EXIT_FAILURE;
253 STRLIST_FOREACH (nodes, n, i) {
254 if (point_regex && regexec (point_regex, n, 0, NULL, 0) != 0)
255 continue;
256 if (skip_point_regex && regexec (skip_point_regex, n, 0, NULL, 0) == 0)
257 continue;
258 printf ("%s\n", n);
259 result = EXIT_SUCCESS;
260 }
261 rc_strlist_free (nodes);
262
263 if (point_regex)
264 regfree (point_regex);
265 if (skip_point_regex)
266 regfree (skip_point_regex);
267
268 exit (result);
269 }

  ViewVC Help
Powered by ViewVC 1.1.20