mountpoint.c revision d6f3618b17298bb8b1ba57bf2abf848e7e3bc21a
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2006 Timo Sirainen */
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#include "lib.h"
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#include "mountpoint.h"
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#include <sys/stat.h>
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#ifdef HAVE_STATFS_MNTFROMNAME
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen# include <sys/param.h> /* BSDs */
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen# include <sys/mount.h>
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#elif defined(HAVE_MNTENT_H)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen# include <stdio.h>
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen# include <mntent.h> /* Linux */
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#elif defined(HAVE_SYS_MNTTAB_H)
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen# include <stdio.h>
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen# include <sys/mnttab.h> /* Solaris */
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen#else
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen# define MOUNTPOINT_UNKNOWN
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen#endif
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen#define MTAB_PATH "/etc/mtab"
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen/* AIX doesn't have these defined */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#ifndef MNTTYPE_SWAP
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen# define MNTTYPE_SWAP "swap"
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#endif
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#ifndef MNTTYPE_IGNORE
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen# define MNTTYPE_IGNORE "ignore"
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen#endif
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainenint mountpoint_get(const char *path, pool_t pool, struct mountpoint *point_r)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen{
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#ifdef MOUNTPOINT_UNKNOWN
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen errno = ENOSYS;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen return -1;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#elif defined (HAVE_STATFS_MNTFROMNAME)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen /* BSDs */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen struct statfs buf;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen memset(point_r, 0, sizeof(*point_r));
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (statfs(path, &buf) < 0) {
82b990b0bb2a1dad5c2634a508a5ad87715db402Timo Sirainen i_error("statfs(%s) failed: %m", path);
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen return -1;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen }
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen point_r->device_path = p_strdup(pool, buf.f_mntfromname);
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen point_r->mount_path = p_strdup(pool, buf.f_mntonname);
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen point_r->mount_path = p_strdup(pool, buf.f_fstypename);
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen point_r->block_size = buf.f_bsize;
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen return 1;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#else
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen /* Linux, Solaris: /etc/mtab reading */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#ifdef HAVE_SYS_MNTTAB_H
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen struct mnttab ent;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#else
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen struct mntent *ent;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#endif
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen struct stat st, st2;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen const char *device_path = NULL, *mount_path = NULL, *type = NULL;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen unsigned int block_size;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen FILE *f;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (stat(path, &st) < 0) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen i_error("stat(%s) failed: %m", path);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen return -1;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen }
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen block_size = st.st_blksize;
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen
3320f4770d1f6c2cdd10f3c4ca5a324beb335339Timo Sirainen#ifdef HAVE_SYS_MNTTAB_H
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen /* Solaris */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen f = fopen(MTAB_PATH, "r");
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (f == NULL) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen i_error("fopen(%s) failed: %m", MTAB_PATH);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen return -1;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen }
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen while ((getmntent(f, &ent)) == 0) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (strcmp(ent.mnt_fstype, MNTTYPE_SWAP) == 0 ||
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen strcmp(ent.mnt_fstype, MNTTYPE_IGNORE) == 0)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen continue;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (stat(ent.mnt_mountp, &st2) == 0 &&
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen CMP_DEV_T(st.st_dev, st2.st_dev)) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen device_path = ent.mnt_special;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen mount_path = ent.mnt_mountp;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen type = ent.mnt_fstype;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen break;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen }
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen }
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen fclose(f);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#else
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen /* Linux */
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen f = setmntent(MTAB_PATH, "r");
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (f == NULL) {
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen i_error("setmntent(%s) failed: %m", MTAB_PATH);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen return -1;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen }
f6c1297c26b355c4aec2a08978f51ec3efecb351Timo Sirainen while ((ent = getmntent(f)) != NULL) {
f6c1297c26b355c4aec2a08978f51ec3efecb351Timo Sirainen if (strcmp(ent->mnt_type, MNTTYPE_SWAP) == 0 ||
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen strcmp(ent->mnt_type, MNTTYPE_IGNORE) == 0)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen continue;
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen if (stat(ent->mnt_dir, &st2) == 0 &&
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen CMP_DEV_T(st.st_dev, st2.st_dev)) {
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen device_path = ent->mnt_fsname;
df02611c44e9432e7961223bf9bfa3fb233b1789Timo Sirainen mount_path = ent->mnt_dir;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen type = ent->mnt_type;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen break;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen }
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen }
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen endmntent(f);
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen#endif
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen if (device_path == NULL)
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen return 0;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen memset(point_r, 0, sizeof(*point_r));
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen point_r->device_path = p_strdup(pool, device_path);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen point_r->mount_path = p_strdup(pool, mount_path);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen point_r->type = p_strdup(pool, type);
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen point_r->block_size = block_size;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen return 1;
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen#endif
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen}
cb1fd563e6000153d1be76fd8722a096bd144b77Timo Sirainen