# HG changeset patch # User Timo Sirainen # Date 1216569470 -10800 # Node ID d1da922a437d04a7effbfa15762c69c97184341b # Parent 1f20b78f37d7d6056540e049f946fa800fb70c50 mountpoint_get(): Added support for AIX support with mntctl(). diff -r 1f20b78f37d7 -r d1da922a437d configure.in --- a/configure.in Sun Jul 20 18:40:17 2008 +0300 +++ b/configure.in Sun Jul 20 18:57:50 2008 +0300 @@ -19,7 +19,8 @@ sys/uio.h sys/sysmacros.h sys/resource.h sys/select.h libgen.h \ sys/quota.h sys/fs/ufs_quota.h ufs/ufs/quota.h jfs/quota.h sys/fs/quota_common.h \ mntent.h sys/mnttab.h sys/event.h sys/time.h sys/mkdev.h linux/dqblk_xfs.h \ - xfs/xqm.h sasl.h sasl/sasl.h execinfo.h ucontext.h malloc_np.h sys/utsname.h) + xfs/xqm.h sasl.h sasl/sasl.h execinfo.h ucontext.h malloc_np.h sys/utsname.h \ + sys/vmount.h) AC_ARG_ENABLE(ipv6, [ --enable-ipv6 Enable IPv6 support (auto)], @@ -1535,6 +1536,36 @@ ]) dnl ** +dnl ** AIX mntctl +dnl ** + +if test $ac_cv_header_sys_vmount_h = yes; then + AC_MSG_CHECKING([for reasonable mntctl buffer size]) + AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #include + #include + #include + int main() { + int size,count; char *m; + FILE *f=fopen("conftestval", "w"); + if (!f) exit(1); + if ((count=mntctl(MCTL_QUERY,sizeof(size),&size))!=0 || !(m=malloc(size)) || + (count=mntctl(MCTL_QUERY,size,m))<=0) exit(1); + fprintf(f, "%d\n",(size * (count + 5))/count & ~1); /* 5 mounts more */ + exit(0); + } + ]])],[ + size=`cat conftestval` + rm -f conftestval + AC_DEFINE_UNQUOTED(STATIC_MTAB_SIZE,$size, reasonable mntctl buffer size) + AC_MSG_RESULT($size) + ],[ + AC_MSG_RESULT(default) + ]) +fi + + +dnl ** dnl ** SSL dnl ** diff -r 1f20b78f37d7 -r d1da922a437d src/lib/mountpoint.c --- a/src/lib/mountpoint.c Sun Jul 20 18:40:17 2008 +0300 +++ b/src/lib/mountpoint.c Sun Jul 20 18:57:50 2008 +0300 @@ -5,7 +5,10 @@ #include -#ifdef HAVE_STATVFS_MNTFROMNAME +#ifdef HAVE_SYS_VMOUNT_H +# include +# include /* AIX */ +#elif defined(HAVE_STATVFS_MNTFROMNAME) # include /* NetBSD 3.0+, FreeBSD 5.0+ */ # define STATVFS_STR "statvfs" #elif defined(HAVE_STATFS_MNTFROMNAME) @@ -37,6 +40,12 @@ #ifndef MNTTYPE_IGNORE # define MNTTYPE_IGNORE "ignore" #endif +#ifndef MNTTYPE_JFS +# define MNTTYPE_JFS "jfs" +#endif +#ifndef MNTTYPE_NFS +# define MNTTYPE_NFS "nfs" +#endif int mountpoint_get(const char *path, pool_t pool, struct mountpoint *point_r) @@ -93,7 +102,62 @@ } block_size = st.st_blksize; -#ifdef HAVE_SYS_MNTTAB_H +#ifdef HAVE_SYS_VMOUNT_H +{ + char static_mtab[STATIC_MTAB_SIZE], *mtab = static_mtab; + int i, count; + const struct vmount *vmt; + + count = mntctl(MCTL_QUERY, sizeof(static_mtab), mtab); + while (count == 0) { + unsigned int size = *(unsigned int *)mtab; + + mtab = t_malloc(size); + count = mntctl(MCTL_QUERY, size, mtab); + } + if (count < 0) { + i_error("mntctl(MCTL_QUERY) failed: %m"); + return -1; + } + vmt = (struct vmount *)mtab; + for (i = 0; i < count && device_path == NULL; i++) { + struct stat vst; + const char *vmt_base = (const char *)vmt; + const char *vmt_base, *vmt_object, *vmt_stub, *vmt_hostname; + + vmt_hostname = vmt_base + vmt->vmt_data[VMT_HOSTNAME].vmt_off; + vmt_object = vmt_base + vmt->vmt_data[VMT_OBJECT].vmt_off; + vmt_stub = vmt_base + vmt->vmt_data[VMT_STUB].vmt_off; + + switch (vmt->vmt_gfstype) { + case MNT_NFS: + case MNT_NFS3: + case MNT_NFS4: + case MNT_RFS4: + if (stat(vmt_stub, &vst) == 0 && + st.st_dev == vst.st_dev) { + device_path = t_strconcat(vmt_hostname, ":", + vmt_object, NULL); + mount_path = vmt_stub; + type = MNTTYPE_NFS; + } + break; + + case MNT_J2: + case MNT_JFS: + if (stat(vmt_stub, &vst) == 0 && + st.st_dev == vst.st_dev) { + device_path = vmt_object; + mount_path = vmt_stub; + type = MNTTYPE_JFS; + } + break; + } + vmt = CONST_PTR_OFFSET(vmt, vmt->vmt_length); + } +} +#elif defined(HAVE_SYS_MNTTAB_H) + /* Solaris */ f = fopen(MTAB_PATH, "r"); if (f == NULL) {