Mercurial > dovecot > core-2.2
annotate src/lib/mountpoint.c @ 22656:1789bf2a1e01
director: Make sure HOST-RESET-USERS isn't used with max_moving_users=0
The reset command would just hang in that case. doveadm would never have
sent this, so this is just an extra sanity check.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sun, 05 Nov 2017 23:51:56 +0200 |
parents | 2e2563132d5f |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21389
diff
changeset
|
1 /* Copyright (c) 2006-2017 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 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
19552
diff
changeset
|
68 i_zero(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 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
19552
diff
changeset
|
92 i_zero(point_r); |
14035
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 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
19552
diff
changeset
|
104 i_zero(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 */ |
16275
e33ec9eb166e
Fixed getmntinfo() usage with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
140 #ifndef __NetBSD__ |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
141 struct statfs *fs; |
16275
e33ec9eb166e
Fixed getmntinfo() usage with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
142 #else |
e33ec9eb166e
Fixed getmntinfo() usage with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
143 struct statvfs *fs; |
e33ec9eb166e
Fixed getmntinfo() usage with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
144 #endif |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
145 int count; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
146 #endif |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
147 struct mountpoint mnt; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
148 bool failed; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
149 }; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
150 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
151 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
|
152 { |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
153 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
|
154 #ifdef MOUNTPOINT_AIX_MNTCTL |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
155 unsigned int size = STATIC_MTAB_SIZE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
156 char *mtab; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
157 int count; |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
158 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
159 mtab = t_buffer_get(size); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
160 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
|
161 size = *(unsigned int *)mtab; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
162 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
|
163 } |
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
164 if (count < 0) { |
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
165 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
|
166 iter->failed = TRUE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
167 return iter; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
168 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
169 iter->count = count; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
170 iter->mtab = i_malloc(size); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
171 memcpy(iter->mtab, mtab, size); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
172 iter->vmt = (void *)iter->mtab; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
173 #elif defined(MOUNTPOINT_SOLARIS) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
174 iter->f = fopen(MTAB_PATH, "r"); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
175 if (iter->f == NULL) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
176 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
|
177 iter->failed = TRUE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
178 return iter; |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
179 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
180 resetmnttab(iter->f); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
181 #elif defined(MOUNTPOINT_LINUX) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
182 iter->f = setmntent(MTAB_PATH, "r"); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
183 if (iter->f == NULL) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
184 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
|
185 iter->failed = TRUE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
186 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
187 #elif defined(HAVE_GETMNTINFO) /* BSDs */ |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
188 iter->count = getmntinfo(&iter->fs, MNT_NOWAIT); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
189 if (iter->count < 0) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
190 i_error("getmntinfo() failed: %m"); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
191 iter->failed = TRUE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
192 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
193 #else |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
194 iter->failed = TRUE; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
195 #endif |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
196 return iter; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
197 } |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
198 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
199 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
|
200 { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
201 #ifdef MOUNTPOINT_AIX_MNTCTL |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
202 struct vmount *vmt = iter->vmt; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
203 char *vmt_base = (char *)vmt; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
204 char *vmt_object, *vmt_stub, *vmt_hostname; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
205 struct stat vst; |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
206 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
207 if (iter->count == 0) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
208 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
209 iter->count--; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
210 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
211 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
|
212 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
|
213 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
|
214 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
|
215 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
19552
diff
changeset
|
216 i_zero(&iter->mnt); |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
217 switch (vmt->vmt_gfstype) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
218 case MNT_NFS: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
219 case MNT_NFS3: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
220 case MNT_NFS4: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
221 case MNT_RFS4: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
222 iter->mnt.device_path = |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
223 t_strconcat(vmt_hostname, ":", vmt_object, NULL); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
224 iter->mnt.mount_path = vmt_stub; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
225 iter->mnt.type = MNTTYPE_NFS; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
226 break; |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
227 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
228 case MNT_J2: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
229 case MNT_JFS: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
230 iter->mnt.device_path = vmt_object; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
231 iter->mnt.mount_path = vmt_stub; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
232 iter->mnt.type = MNTTYPE_JFS; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
233 break; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
234 default: |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
235 /* unwanted filesystem */ |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
236 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
|
237 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
238 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
|
239 iter->mnt.dev = vst.st_dev; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
240 iter->mnt.block_size = vst.st_blksize; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
241 } |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
242 return &iter->mnt; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
243 #elif defined (MOUNTPOINT_SOLARIS) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
244 union { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
245 struct mnttab ent; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
246 struct extmnttab ext; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
247 } ent; |
8022
d1da922a437d
mountpoint_get(): Added support for AIX support with mntctl().
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
248 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
249 if (iter->f == NULL) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
250 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
251 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
19552
diff
changeset
|
252 i_zero(&iter->mnt); |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
253 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
|
254 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
|
255 continue; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 |
6085
cc8b6e73e830
Removed special autofs check. Instead check ignore mount option and swap
Timo Sirainen <tss@iki.fi>
parents:
6039
diff
changeset
|
257 /* 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
|
258 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
|
259 continue; |
cc8b6e73e830
Removed special autofs check. Instead check ignore mount option and swap
Timo Sirainen <tss@iki.fi>
parents:
6039
diff
changeset
|
260 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
261 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
|
262 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
|
263 iter->mnt.type = ent.ent.mnt_fstype; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
264 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
|
265 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
|
266 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
267 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
268 #elif defined (MOUNTPOINT_LINUX) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
269 const struct mntent *ent; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
270 struct stat st; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
271 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
272 if (iter->f == NULL) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
273 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
274 |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
19552
diff
changeset
|
275 i_zero(&iter->mnt); |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
276 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
|
277 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
|
278 strcmp(ent->mnt_type, MNTTYPE_IGNORE) == 0 || |
3f5c53f84d0a
mountpoint_get(): Skip rootfs mounts with Linux.
Timo Sirainen <tss@iki.fi>
parents:
11756
diff
changeset
|
279 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
|
280 continue; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
282 iter->mnt.device_path = ent->mnt_fsname; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
283 iter->mnt.mount_path = ent->mnt_dir; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
284 iter->mnt.type = ent->mnt_type; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
285 if (stat(ent->mnt_dir, &st) == 0) { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
286 iter->mnt.dev = st.st_dev; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
287 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
|
288 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
289 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
|
290 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
291 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
292 #elif defined(HAVE_GETMNTINFO) /* BSDs */ |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
293 while (iter->count > 0) { |
16275
e33ec9eb166e
Fixed getmntinfo() usage with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
294 #ifndef __NetBSD__ |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
295 struct statfs *fs = iter->fs; |
16275
e33ec9eb166e
Fixed getmntinfo() usage with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
296 #else |
e33ec9eb166e
Fixed getmntinfo() usage with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
297 struct statvfs *fs = iter->fs; |
e33ec9eb166e
Fixed getmntinfo() usage with NetBSD.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
298 #endif |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
299 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
300 iter->fs++; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
301 iter->count--; |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
303 iter->mnt.device_path = fs->f_mntfromname; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
304 iter->mnt.mount_path = fs->f_mntonname; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
305 #ifdef __osf__ /* Tru64 */ |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
306 iter->mnt.type = getvfsbynumber(fs->f_type); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
307 #else |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
308 iter->mnt.type = fs->f_fstypename; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
309 #endif |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
310 iter->mnt.block_size = fs->f_bsize; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
311 return &iter->mnt; |
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 return NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
314 #else |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
315 return NULL; |
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 #endif |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 } |
14035
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
318 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
319 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
|
320 { |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
321 struct mountpoint_iter *iter = *_iter; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
322 int ret = iter->failed ? -1 : 0; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
323 |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
324 *_iter = NULL; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
325 #ifdef MOUNTPOINT_AIX_MNTCTL |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
326 i_free(iter->mtab); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
327 #elif defined (MOUNTPOINT_SOLARIS) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
328 if (iter->f != NULL) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
329 fclose(iter->f); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
330 #elif defined (MOUNTPOINT_LINUX) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
331 if (iter->f != NULL) |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
332 endmntent(iter->f); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
333 #endif |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
334 i_free(iter); |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
335 return ret; |
8be75a2ea2dd
Added mountpoint_iter_*() for iterating mounted filesystems.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
336 } |