$NetBSD: patch-af,v 1.4 2004/11/19 12:35:22 sketch Exp $ --- src/FileSystemTable.c++.orig 2003-01-18 14:18:12.000000000 +0000 +++ src/FileSystemTable.c++ 2004-11-08 17:08:21.655221000 +0000 @@ -21,11 +21,13 @@ // Temple Place - Suite 330, Boston MA 02111-1307, USA. #include +#include #include "FileSystemTable.h" -#include +#include "fam-mntent.h" #include #include +#include #if HAVE_STATVFS #include @@ -106,7 +108,11 @@ // Read /etc/mtab. Cred::SuperUser.become_user(); +#if defined(HAVE_SYS_MNTTAB_H) + FILE *mtab = fopen(mtab_name, "r"); +#else FILE *mtab = setmntent(mtab_name, "r"); +#endif if(mtab == NULL) { Log::error("couldn't open %s for reading", mtab_name); @@ -114,40 +120,86 @@ return; } root = NULL; +#if defined(HAVE_SYS_MNTTAB_H) + resetmnttab(mtab); + int ret = 0; + do +#else for (mntent *mp; ((mp = getmntent(mtab)) != NULL); ) +#endif { +#if defined(HAVE_SYS_MNTTAB_H) + struct mnttab ment, *mp; + mp = &ment; + ret = getmntent(mtab, mp); + FileSystem *fs = fs_by_name ? fs_by_name->find(mp->mnt_mountp) : NULL; +#else FileSystem *fs = fs_by_name ? fs_by_name->find(mp->mnt_dir) : NULL; +#endif if (fs && fs->matches(*mp)) { Log::debug("mtab: MATCH \"%s\" on \"%s\" using type <%s>", +#if defined(HAVE_SYS_MNTTAB_H) + mp->mnt_special, mp->mnt_mountp, mp->mnt_fstype); + + new_fs_by_name->insert(mp->mnt_mountp, fs); + if (dismounted_fses.find(mp->mnt_mountp)) + dismounted_fses.remove(mp->mnt_mountp); +#else mp->mnt_fsname, mp->mnt_dir, mp->mnt_type); new_fs_by_name->insert(mp->mnt_dir, fs); if (dismounted_fses.find(mp->mnt_dir)) dismounted_fses.remove(mp->mnt_dir); +#endif } else { +#if defined(HAVE_SYS_MNTTAB_H) + if ((!strcmp(mp->mnt_fstype, MNTTYPE_NFS) +#else if ((!strcmp(mp->mnt_type, MNTTYPE_NFS) +#endif #if HAVE_MNTTYPE_NFS2 +#if defined(HAVE_SYS_MNTTAB_H) + || !strcmp(mp->mnt_fstype, MNTTYPE_NFS2) +#else || !strcmp(mp->mnt_type, MNTTYPE_NFS2) #endif +#endif #if HAVE_MNTTYPE_NFS3 +#if defined(HAVE_SYS_MNTTAB_H) + || !strcmp(mp->mnt_fstype, MNTTYPE_NFS3) +#else || !strcmp(mp->mnt_type, MNTTYPE_NFS3) #endif +#endif #if HAVE_MNTTYPE_CACHEFS +#if defined(HAVE_SYS_MNTTAB_H) + || !strcmp(mp->mnt_fstype, MNTTYPE_CACHEFS) +#else || !strcmp(mp->mnt_type, MNTTYPE_CACHEFS) #endif +#endif +#if defined(HAVE_SYS_MNTTAB_H) + ) && strchr(mp->mnt_special, ':')) +#else ) && strchr(mp->mnt_fsname, ':')) +#endif { if(Log::get_level() == Log::DEBUG) { const char *mntopt = hasmntopt(mp, "dev"); if(mntopt == NULL) mntopt = ""; Log::debug("mtab: new NFS \"%s\" on \"%s\" %s using <%s>", +#if defined(HAVE_SYS_MNTTAB_H) + mp->mnt_special, mp->mnt_mountp, mntopt, + mp->mnt_fstype); +#else mp->mnt_fsname, mp->mnt_dir, mntopt, mp->mnt_type); +#endif } fs = new NFSFileSystem(*mp); @@ -155,24 +207,45 @@ else { Log::debug("mtab: new local \"%s\" on \"%s\"", +#if defined(HAVE_SYS_MNTTAB_H) + mp->mnt_special, mp->mnt_mountp); +#else mp->mnt_fsname, mp->mnt_dir); +#endif fs = new LocalFileSystem(*mp); } +#if defined(HAVE_SYS_MNTTAB_H) + new_fs_by_name->insert(mp->mnt_mountp, fs); +#else new_fs_by_name->insert(mp->mnt_dir, fs); +#endif if (fs_by_name) { // Find parent filesystem. +#if defined(HAVE_SYS_MNTTAB_H) + FileSystem *parent = longest_prefix(mp->mnt_mountp); +#else FileSystem *parent = longest_prefix(mp->mnt_dir); +#endif assert(parent); mount_parents.insert(parent->dir(), parent); } } +#if defined(HAVE_SYS_MNTTAB_H) + if (!strcmp(mp->mnt_mountp, "/")) +#else if (!strcmp(mp->mnt_dir, "/")) +#endif root = fs; } +#if defined(HAVE_SYS_MNTTAB_H) + while (ret != -1); + fclose(mtab); +#else endmntent(mtab); +#endif if(root == NULL) { @@ -255,7 +328,10 @@ // create_fs_by_name initializes our "root" member variable. if (!fs_by_name) { create_fs_by_name(); +#if !defined(BSD) + /* there is no mtab "file" in BSD */ mtab_watcher = new InternalClient(mtab_name, mtab_event_handler, NULL); +#endif } cr.become_user();