Mercurial > dovecot > core-2.2
annotate src/lib/mountpoint.c @ 14682:d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Checked using a patched clang that adds attribute(warn_unused_result) to all
functions. This commit fixes several error handling mistakes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 25 Jun 2012 01:14:03 +0300 |
parents | ba770cba5598 |
children | 90710c6c3beb |
rev | line source |
---|---|
14133
ba770cba5598
Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents:
14035
diff
changeset
|
1 /* Copyright (c) 2006-2012 Dovecot authors, see the included COPYING file */ |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "mountpoint.h" |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include <sys/stat.h> |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
8 #ifdef HAVE_SYS_VMOUNT_H |
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
9 # include <stdio.h> |
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
10 # include <sys/vmount.h> /* AIX */ |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
11 # define MOUNTPOINT_AIX_MNTCTL |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
12 #elif defined(HAVE_STATVFS_MNTFROMNAME) |
4736
6789961fe02e
Added support for statvfs(), which is what the newer BSDs use.
Timo Sirainen <tss@iki.fi>
parents:
4648
diff
changeset
|
13 # include <sys/statvfs.h> /* NetBSD 3.0+, FreeBSD 5.0+ */ |
6789961fe02e
Added support for statvfs(), which is what the newer BSDs use.
Timo Sirainen <tss@iki.fi>
parents:
4648
diff
changeset
|
14 # define STATVFS_STR "statvfs" |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
15 # define MOUNTPOINT_STATVFS |
4753 | 16 #elif defined(HAVE_STATFS_MNTFROMNAME) |
4736
6789961fe02e
Added support for statvfs(), which is what the newer BSDs use.
Timo Sirainen <tss@iki.fi>
parents:
4648
diff
changeset
|
17 # include <sys/param.h> /* Older BSDs */ |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 # include <sys/mount.h> |
4736
6789961fe02e
Added support for statvfs(), which is what the newer BSDs use.
Timo Sirainen <tss@iki.fi>
parents:
4648
diff
changeset
|
19 # define statvfs statfs |
6789961fe02e
Added support for statvfs(), which is what the newer BSDs use.
Timo Sirainen <tss@iki.fi>
parents:
4648
diff
changeset
|
20 # define STATVFS_STR "statfs" |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
21 # define MOUNTPOINT_STATVFS |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 #elif defined(HAVE_MNTENT_H) |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 # include <stdio.h> |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 # include <mntent.h> /* Linux */ |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
25 # define MOUNTPOINT_LINUX |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 #elif defined(HAVE_SYS_MNTTAB_H) |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 # include <stdio.h> |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 # include <sys/mnttab.h> /* Solaris */ |
6085
cc8b6e73e830
Removed special autofs check. Instead check ignore mount option and swap
Timo Sirainen <tss@iki.fi>
parents:
6039
diff
changeset
|
29 # include <sys/mntent.h> |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
30 # define MOUNTPOINT_SOLARIS |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 #else |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 # define MOUNTPOINT_UNKNOWN |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 #endif |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
35 #ifdef MOUNTPOINT_SOLARIS |
4270
455b8162e0a9
Minor cleanup: Switch hardcoded /etc/mnttab in Solaris to use MNTTAB macro
Timo Sirainen <tss@iki.fi>
parents:
4195
diff
changeset
|
36 # define MTAB_PATH MNTTAB /* Solaris */ |
4194
de4609242c8a
mtab path is /etc/mnttab with Solaris
Timo Sirainen <tss@iki.fi>
parents:
4189
diff
changeset
|
37 #else |
de4609242c8a
mtab path is /etc/mnttab with Solaris
Timo Sirainen <tss@iki.fi>
parents:
4189
diff
changeset
|
38 # define MTAB_PATH "/etc/mtab" /* Linux */ |
de4609242c8a
mtab path is /etc/mnttab with Solaris
Timo Sirainen <tss@iki.fi>
parents:
4189
diff
changeset
|
39 #endif |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 /* AIX doesn't have these defined */ |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 #ifndef MNTTYPE_SWAP |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 # define MNTTYPE_SWAP "swap" |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 #endif |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 #ifndef MNTTYPE_IGNORE |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 # define MNTTYPE_IGNORE "ignore" |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 #endif |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
48 #ifndef MNTTYPE_JFS |
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
49 # define MNTTYPE_JFS "jfs" |
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
50 #endif |
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
51 #ifndef MNTTYPE_NFS |
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
52 # define MNTTYPE_NFS "nfs" |
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
53 #endif |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
11966
3f5c53f84d0a
mountpoint_get(): Skip rootfs mounts with Linux.
Timo Sirainen <tss@iki.fi>
parents:
11756
diff
changeset
|
55 /* Linux sometimes has mtab entry for "rootfs" as well as the real root |
3f5c53f84d0a
mountpoint_get(): Skip rootfs mounts with Linux.
Timo Sirainen <tss@iki.fi>
parents:
11756
diff
changeset
|
56 entry. Skip the rootfs. */ |
3f5c53f84d0a
mountpoint_get(): Skip rootfs mounts with Linux.
Timo Sirainen <tss@iki.fi>
parents:
11756
diff
changeset
|
57 #ifndef MNTTYPE_ROOTFS |
3f5c53f84d0a
mountpoint_get(): Skip rootfs mounts with Linux.
Timo Sirainen <tss@iki.fi>
parents:
11756
diff
changeset
|
58 # define MNTTYPE_ROOTFS "rootfs" |
3f5c53f84d0a
mountpoint_get(): Skip rootfs mounts with Linux.
Timo Sirainen <tss@iki.fi>
parents:
11756
diff
changeset
|
59 #endif |
6039
3887591e7a54
Skip over autofs entries. Patch by Mike Brudenell
Timo Sirainen <tss@iki.fi>
parents:
5583
diff
changeset
|
60 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
61 #ifdef MOUNTPOINT_STATVFS |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
62 static int |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
63 mountpoint_get_statvfs(const char *path, pool_t pool, |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
64 struct mountpoint *point_r) |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 { |
4736
6789961fe02e
Added support for statvfs(), which is what the newer BSDs use.
Timo Sirainen <tss@iki.fi>
parents:
4648
diff
changeset
|
66 struct statvfs buf; |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 memset(point_r, 0, sizeof(*point_r)); |
4736
6789961fe02e
Added support for statvfs(), which is what the newer BSDs use.
Timo Sirainen <tss@iki.fi>
parents:
4648
diff
changeset
|
69 if (statvfs(path, &buf) < 0) { |
4648
93a6d2194c5d
Handle ENOENT silently and return 0.
Timo Sirainen <tss@iki.fi>
parents:
4469
diff
changeset
|
70 if (errno == ENOENT) |
93a6d2194c5d
Handle ENOENT silently and return 0.
Timo Sirainen <tss@iki.fi>
parents:
4469
diff
changeset
|
71 return 0; |
93a6d2194c5d
Handle ENOENT silently and return 0.
Timo Sirainen <tss@iki.fi>
parents:
4469
diff
changeset
|
72 |
4736
6789961fe02e
Added support for statvfs(), which is what the newer BSDs use.
Timo Sirainen <tss@iki.fi>
parents:
4648
diff
changeset
|
73 i_error(STATVFS_STR"(%s) failed: %m", path); |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 return -1; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 } |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 point_r->device_path = p_strdup(pool, buf.f_mntfromname); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 point_r->mount_path = p_strdup(pool, buf.f_mntonname); |
5583 | 79 #ifdef __osf__ /* Tru64 */ |
80 point_r->type = p_strdup(pool, getvfsbynumber(buf.f_type)); | |
81 #else | |
4469
e3310e19c6f3
mountpoint_get() returned broken mount_path and type with BSDs.
Timo Sirainen <tss@iki.fi>
parents:
4270
diff
changeset
|
82 point_r->type = p_strdup(pool, buf.f_fstypename); |
5583 | 83 #endif |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 point_r->block_size = buf.f_bsize; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 return 1; |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
86 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
87 #endif |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
88 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
89 int mountpoint_get(const char *path, pool_t pool, struct mountpoint *point_r) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
90 { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
91 #ifdef MOUNTPOINT_UNKNOWN |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
92 memset(point_r, 0, sizeof(*point_r)); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
93 errno = ENOSYS; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
94 return -1; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
95 #elif defined (MOUNTPOINT_STATVFS) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
96 /* BSDs, Tru64 */ |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
97 return mountpoint_get_statvfs(path, pool, point_r); |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 #else |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
99 /* find via mount iteration */ |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
100 struct mountpoint_iter *iter; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
101 const struct mountpoint *mnt; |
6085
cc8b6e73e830
Removed special autofs check. Instead check ignore mount option and swap
Timo Sirainen <tss@iki.fi>
parents:
6039
diff
changeset
|
102 struct stat st; |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 |
4195
a00c5d4915f3
Clear mountpoint struct even in error cases.
Timo Sirainen <tss@iki.fi>
parents:
4194
diff
changeset
|
104 memset(point_r, 0, sizeof(*point_r)); |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 if (stat(path, &st) < 0) { |
4648
93a6d2194c5d
Handle ENOENT silently and return 0.
Timo Sirainen <tss@iki.fi>
parents:
4469
diff
changeset
|
106 if (errno == ENOENT) |
93a6d2194c5d
Handle ENOENT silently and return 0.
Timo Sirainen <tss@iki.fi>
parents:
4469
diff
changeset
|
107 return 0; |
93a6d2194c5d
Handle ENOENT silently and return 0.
Timo Sirainen <tss@iki.fi>
parents:
4469
diff
changeset
|
108 |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 i_error("stat(%s) failed: %m", path); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 return -1; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 } |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
113 iter = mountpoint_iter_init(); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
114 while ((mnt = mountpoint_iter_next(iter)) != NULL) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
115 if (minor(st.st_dev) == minor(mnt->dev) && |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
116 major(st.st_dev) == major(mnt->dev)) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
117 break; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
118 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
119 if (mnt != NULL) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
120 point_r->device_path = p_strdup(pool, mnt->device_path); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
121 point_r->mount_path = p_strdup(pool, mnt->mount_path); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
122 point_r->type = p_strdup(pool, mnt->type); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
123 point_r->dev = mnt->dev; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
124 point_r->block_size = st.st_blksize; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
125 } |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
126 if (mountpoint_iter_deinit(&iter) < 0 && mnt == NULL) |
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
127 return -1; |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
128 return mnt != NULL ? 1 : 0; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
129 #endif |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
130 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
131 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
132 struct mountpoint_iter { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
133 #ifdef MOUNTPOINT_AIX_MNTCTL |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
134 char *mtab; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
135 struct vmount *vmt; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
136 int count; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
137 #elif defined(MOUNTPOINT_SOLARIS) || defined(MOUNTPOINT_LINUX) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
138 FILE *f; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
139 #elif defined(HAVE_GETMNTINFO) /* BSDs */ |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
140 struct statfs *fs; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
141 int count; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
142 #endif |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
143 struct mountpoint mnt; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
144 bool failed; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
145 }; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
146 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
147 struct mountpoint_iter *mountpoint_iter_init(void) |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
148 { |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
149 struct mountpoint_iter *iter = i_new(struct mountpoint_iter, 1); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
150 #ifdef MOUNTPOINT_AIX_MNTCTL |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
151 unsigned int size = STATIC_MTAB_SIZE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
152 char *mtab; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
153 int count; |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
154 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
155 mtab = t_buffer_get(size); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
156 while ((count = mntctl(MCTL_QUERY, size, mtab)) == 0) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
157 size = *(unsigned int *)mtab; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
158 mtab = t_buffer_get(size); |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
159 } |
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
160 if (count < 0) { |
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
161 i_error("mntctl(MCTL_QUERY) failed: %m"); |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
162 iter->failed = TRUE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
163 return iter; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
164 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
165 iter->count = count; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
166 iter->mtab = i_malloc(size); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
167 memcpy(iter->mtab, mtab, size); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
168 iter->vmt = (void *)iter->mtab; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
169 #elif defined(MOUNTPOINT_SOLARIS) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
170 iter->f = fopen(MTAB_PATH, "r"); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
171 if (iter->f == NULL) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
172 i_error("fopen(%s) failed: %m", MTAB_PATH); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
173 iter->failed = TRUE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
174 return iter; |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
175 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
176 resetmnttab(iter->f); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
177 #elif defined(MOUNTPOINT_LINUX) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
178 iter->f = setmntent(MTAB_PATH, "r"); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
179 if (iter->f == NULL) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
180 i_error("setmntent(%s) failed: %m", MTAB_PATH); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
181 iter->failed = TRUE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
182 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
183 #elif defined(HAVE_GETMNTINFO) /* BSDs */ |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
184 iter->count = getmntinfo(&iter->fs, MNT_NOWAIT); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
185 if (iter->count < 0) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
186 i_error("getmntinfo() failed: %m"); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
187 iter->failed = TRUE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
188 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
189 #else |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
190 iter->failed = TRUE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
191 #endif |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
192 return iter; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
193 } |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
194 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
195 const struct mountpoint *mountpoint_iter_next(struct mountpoint_iter *iter) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
196 { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
197 #ifdef MOUNTPOINT_AIX_MNTCTL |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
198 struct vmount *vmt = iter->vmt; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
199 char *vmt_base = (char *)vmt; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
200 char *vmt_object, *vmt_stub, *vmt_hostname; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
201 struct stat vst; |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
202 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
203 if (iter->count == 0) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
204 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
205 iter->count--; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
206 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
207 iter->vmt = PTR_OFFSET(vmt, vmt->vmt_length); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
208 vmt_hostname = vmt_base + vmt->vmt_data[VMT_HOSTNAME].vmt_off; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
209 vmt_object = vmt_base + vmt->vmt_data[VMT_OBJECT].vmt_off; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
210 vmt_stub = vmt_base + vmt->vmt_data[VMT_STUB].vmt_off; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
211 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
212 memset(&iter->mnt, 0, sizeof(iter->mnt)); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
213 switch (vmt->vmt_gfstype) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
214 case MNT_NFS: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
215 case MNT_NFS3: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
216 case MNT_NFS4: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
217 case MNT_RFS4: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
218 iter->mnt.device_path = |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
219 t_strconcat(vmt_hostname, ":", vmt_object, NULL); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
220 iter->mnt.mount_path = vmt_stub; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
221 iter->mnt.type = MNTTYPE_NFS; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
222 break; |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
223 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
224 case MNT_J2: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
225 case MNT_JFS: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
226 iter->mnt.device_path = vmt_object; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
227 iter->mnt.mount_path = vmt_stub; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
228 iter->mnt.type = MNTTYPE_JFS; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
229 break; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
230 default: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
231 /* unwanted filesystem */ |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
232 return mountpoint_iter_next(iter); |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
233 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
234 if (stat(iter->mnt.mount_path, &vst) == 0) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
235 iter->mnt.dev = vst.st_dev; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
236 iter->mnt.block_size = vst.st_blksize; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
237 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
238 return &iter->mnt; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
239 #elif defined (MOUNTPOINT_SOLARIS) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
240 union { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
241 struct mnttab ent; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
242 struct extmnttab ext; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
243 } ent; |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
244 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
245 if (iter->f == NULL) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
246 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
247 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
248 memset(&iter->mnt, 0, sizeof(iter->mnt)); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
249 while ((getextmntent(iter->f, &ent.ext, sizeof(ent.ext))) == 0) { |
6085
cc8b6e73e830
Removed special autofs check. Instead check ignore mount option and swap
Timo Sirainen <tss@iki.fi>
parents:
6039
diff
changeset
|
250 if (hasmntopt(&ent.ent, MNTOPT_IGNORE) != NULL) |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 continue; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 |
6085
cc8b6e73e830
Removed special autofs check. Instead check ignore mount option and swap
Timo Sirainen <tss@iki.fi>
parents:
6039
diff
changeset
|
253 /* mnt_type contains tmpfs with swap */ |
cc8b6e73e830
Removed special autofs check. Instead check ignore mount option and swap
Timo Sirainen <tss@iki.fi>
parents:
6039
diff
changeset
|
254 if (strcmp(ent.ent.mnt_special, MNTTYPE_SWAP) == 0) |
cc8b6e73e830
Removed special autofs check. Instead check ignore mount option and swap
Timo Sirainen <tss@iki.fi>
parents:
6039
diff
changeset
|
255 continue; |
cc8b6e73e830
Removed special autofs check. Instead check ignore mount option and swap
Timo Sirainen <tss@iki.fi>
parents:
6039
diff
changeset
|
256 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
257 iter->mnt.device_path = ent.ent.mnt_special; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
258 iter->mnt.mount_path = ent.ent.mnt_mountp; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
259 iter->mnt.type = ent.ent.mnt_fstype; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
260 iter->mnt.dev = makedev(ent.ext.mnt_major, ent.ext.mnt_minor); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
261 return &iter->mnt; |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
263 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
264 #elif defined (MOUNTPOINT_LINUX) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
265 const struct mntent *ent; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
266 struct stat st; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
267 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
268 if (iter->f == NULL) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
269 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
270 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
271 memset(&iter->mnt, 0, sizeof(iter->mnt)); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
272 while ((ent = getmntent(iter->f)) != NULL) { |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 if (strcmp(ent->mnt_type, MNTTYPE_SWAP) == 0 || |
11966
3f5c53f84d0a
mountpoint_get(): Skip rootfs mounts with Linux.
Timo Sirainen <tss@iki.fi>
parents:
11756
diff
changeset
|
274 strcmp(ent->mnt_type, MNTTYPE_IGNORE) == 0 || |
3f5c53f84d0a
mountpoint_get(): Skip rootfs mounts with Linux.
Timo Sirainen <tss@iki.fi>
parents:
11756
diff
changeset
|
275 strcmp(ent->mnt_type, MNTTYPE_ROOTFS) == 0) |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 continue; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
278 iter->mnt.device_path = ent->mnt_fsname; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
279 iter->mnt.mount_path = ent->mnt_dir; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
280 iter->mnt.type = ent->mnt_type; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
281 if (stat(ent->mnt_dir, &st) == 0) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
282 iter->mnt.dev = st.st_dev; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
283 iter->mnt.block_size = st.st_blksize; |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
285 return &iter->mnt; |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
287 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
288 #elif defined(HAVE_GETMNTINFO) /* BSDs */ |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
289 while (iter->count > 0) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
290 struct statfs *fs = iter->fs; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
291 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
292 iter->fs++; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
293 iter->count--; |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
295 iter->mnt.device_path = fs->f_mntfromname; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
296 iter->mnt.mount_path = fs->f_mntonname; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
297 #ifdef __osf__ /* Tru64 */ |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
298 iter->mnt.type = getvfsbynumber(fs->f_type); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
299 #else |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
300 iter->mnt.type = fs->f_fstypename; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
301 #endif |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
302 iter->mnt.block_size = fs->f_bsize; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
303 return &iter->mnt; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
304 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
305 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
306 #else |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
307 return NULL; |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 #endif |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
310 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
311 int mountpoint_iter_deinit(struct mountpoint_iter **_iter) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
312 { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
313 struct mountpoint_iter *iter = *_iter; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
314 int ret = iter->failed ? -1 : 0; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
315 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
316 *_iter = NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
317 #ifdef MOUNTPOINT_AIX_MNTCTL |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
318 i_free(iter->mtab); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
319 #elif defined (MOUNTPOINT_SOLARIS) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
320 if (iter->f != NULL) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
321 fclose(iter->f); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
322 #elif defined (MOUNTPOINT_LINUX) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
323 if (iter->f != NULL) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
324 endmntent(iter->f); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
325 #endif |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
326 i_free(iter); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
327 return ret; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
328 } |