mountpoint.c revision 2dc6cf8bad599bfe9129bb496539a08ee3631cc0
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2006 Timo Sirainen */
d6c5ceea8521b92d10e51a59da00c792f6140b1dTimo Sirainen# include <sys/statvfs.h> /* NetBSD 3.0+, FreeBSD 5.0+ */
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen/* AIX doesn't have these defined */
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen/* autofs mounts will show two entries. First for autofs and second for the
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen actual filesystem type. We want the second one. */
e82e363e7a6917f470412d629db6c5b1f5891a35Timo Sirainenint mountpoint_get(const char *path, pool_t pool, struct mountpoint *point_r)
d10a370b2614712d9cb6a1dd8625f62a071b6377Timo Sirainen#elif defined (HAVE_STATFS_MNTFROMNAME) || defined(HAVE_STATVFS_MNTFROMNAME)
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen point_r->device_path = p_strdup(pool, buf.f_mntfromname);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen point_r->mount_path = p_strdup(pool, buf.f_mntonname);
905627a760ce8bf4141b361f72858a99975ded3cTimo Sirainen point_r->type = p_strdup(pool, getvfsbynumber(buf.f_type));
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen point_r->type = p_strdup(pool, buf.f_fstypename);
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen /* Linux, Solaris: /etc/mtab reading */
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen const char *device_path = NULL, *mount_path = NULL, *type = NULL;
289bd999f282a307b05e6f8beef33155a50fb837Timo Sirainen /* Solaris */
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen if (strcmp(ent.mnt_fstype, MNTTYPE_SWAP) == 0 ||
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen strcmp(ent.mnt_fstype, MNTTYPE_AUTOFS) == 0 ||
51cbc45fc1ac5dde29bc2adbb175945df1b4f7d4Timo Sirainen i_error("setmntent(%s) failed: %m", MTAB_PATH);
923eb3dde28e4d8841c14fd6b4a69635b7070c3eTimo Sirainen if (strcmp(ent->mnt_type, MNTTYPE_SWAP) == 0 ||
e82e363e7a6917f470412d629db6c5b1f5891a35Timo Sirainen point_r->device_path = p_strdup(pool, device_path);