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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
22e40b2c1c60 Compile fix
Timo Sirainen <tss@iki.fi>
parents: 4736
diff changeset
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
790dec1815e0 Compile fix for Tru64.
Timo Sirainen <tss@iki.fi>
parents: 4753
diff changeset
79 #ifdef __osf__ /* Tru64 */
790dec1815e0 Compile fix for Tru64.
Timo Sirainen <tss@iki.fi>
parents: 4753
diff changeset
80 point_r->type = p_strdup(pool, getvfsbynumber(buf.f_type));
790dec1815e0 Compile fix for Tru64.
Timo Sirainen <tss@iki.fi>
parents: 4753
diff changeset
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
790dec1815e0 Compile fix for Tru64.
Timo Sirainen <tss@iki.fi>
parents: 4753
diff changeset
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 }