Mercurial > dovecot > core-2.2
annotate src/lib/mountpoint.c @ 4187:e6d38617efdf HEAD
Added mountpoint_get() for looking up a path's mount point information.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 14 Apr 2006 13:26:55 +0300 |
parents | |
children | 1fb345878e1b |
rev | line source |
---|---|
4187
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2006 Timo Sirainen */ |
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 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #ifdef HAVE_STATFS_MNTFROMNAME |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 # include <sys/param.h> /* BSDs */ |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 # include <sys/mount.h> |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #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
|
12 # include <stdio.h> |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 # include <mntent.h> /* Linux */ |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #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
|
15 # include <stdio.h> |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 # include <sys/mnttab.h> /* Solaris */ |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #else |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 # define MOUNTPOINT_UNKNOWN |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 #endif |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 #define MTAB_PATH "/etc/mtab" |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 /* 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
|
24 #ifndef MNTTYPE_SWAP |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 # 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
|
26 #endif |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 #ifndef MNTTYPE_IGNORE |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 # 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
|
29 #endif |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 int mountpoint_get(const char *path, pool_t pool, struct mountpoint *point_r) |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 { |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 #ifdef MOUNTPOINT_UNKNOWN |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 errno = ENOSYS; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 return -1; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 #elif defined (HAVE_STATFS_MNTFROMNAME) |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 /* BSDs */ |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 struct statfs buf; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 memset(point_r, 0, sizeof(*point_r)); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 if (statfs(path, &buf) < 0) { |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 i_error("statfs(%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
|
43 return -1; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 } |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 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
|
47 point_r->mount_path = p_strdup(pool, buf.f_mntonname); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 point_r->mount_path = p_strdup(pool, buf.f_fstypename); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 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
|
50 return 1; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 #else |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 /* Linux, Solaris: /etc/mtab reading */ |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 #ifdef 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
|
54 struct mnttab ent; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 #else |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 struct mntent *ent; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 #endif |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 struct stat st, st2; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 const char *device_path = NULL, *mount_path = NULL, *type = NULL; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 unsigned int block_size; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 FILE *f; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 if (stat(path, &st) < 0) { |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 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
|
65 return -1; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 } |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 block_size = st.st_blksize; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 #ifdef 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
|
70 /* Solaris */ |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 f = fopen(MTAB_PATH, "r"); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 if (f == NULL) { |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 i_error("fopen(%s) failed: %m", MTAB_PATH); |
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 while ((getmntent(f, &ent)) == 0) { |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 if (strcmp(ent.mnt_fstype, MNTTYPE_SWAP) == 0 || |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 strcmp(ent.mnt_fstype, MNTTYPE_IGNORE) == 0) |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 continue; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 if (stat(ent.mnt_mountp, &st2) == 0 && |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 CMP_DEV_T(st.st_dev, st2.st_dev)) { |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 device_path = ent.mnt_special; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 mount_path = ent.mnt_mountp; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 type = ent.mnt_fstype; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 break; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 } |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 } |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 fclose(f); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 #else |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 /* Linux */ |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 f = setmntent(MTAB_PATH, "r"); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 if (f == NULL) { |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 i_error("setmntent(%s) failed: %m", MTAB_PATH); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 return -1; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 } |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 while ((ent = getmntent(f)) != NULL) { |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 if (strcmp(ent->mnt_type, MNTTYPE_SWAP) == 0 || |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 strcmp(ent->mnt_type, MNTTYPE_IGNORE) == 0) |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 continue; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 if (stat(ent->mnt_dir, &st2) == 0 && |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 CMP_DEV_T(st.st_dev, st2.st_dev)) { |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 device_path = ent->mnt_fsname; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 mount_path = ent->mnt_dir; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 type = ent->mnt_type; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 break; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 } |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 } |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 endmntent(f); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 #endif |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 if (device_path == NULL) |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 return 0; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 point_r->device_path = p_strdup(pool, device_path); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 point_r->mount_path = p_strdup(pool, mount_path); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 point_r->type = p_strdup(pool, type); |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 point_r->block_size = block_size; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 return 1; |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 #endif |
e6d38617efdf
Added mountpoint_get() for looking up a path's mount point information.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 } |