mtab_bsd.c revision 310490
1/* 2 * Copyright (c) 1997-2014 Erez Zadok 3 * Copyright (c) 1990 Jan-Simon Pendry 4 * Copyright (c) 1990 Imperial College of Science, Technology & Medicine 5 * Copyright (c) 1990 The Regents of the University of California. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to Berkeley by 9 * Jan-Simon Pendry at Imperial College, London. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * 36 * File: am-utils/conf/mtab/mtab_bsd.c 37 * 38 */ 39 40/* 41 * BSD 4.4 systems don't write their mount tables on a file. Instead, they 42 * use a (better) system where the kernel keeps this state, and you access 43 * the mount tables via a known interface. 44 */ 45 46#ifdef HAVE_CONFIG_H 47# include <config.h> 48#endif /* HAVE_CONFIG_H */ 49#include <am_defs.h> 50#include <amu.h> 51 52#if __NetBSD_Version__ > 200030000 53#define statfs statvfs 54#endif 55 56static mntent_t * 57mnt_dup(struct statfs *mp) 58{ 59 mntent_t *new_mp = ALLOC(mntent_t); 60 char *ty; 61 62 new_mp->mnt_fsname = xstrdup(mp->f_mntfromname); 63 new_mp->mnt_dir = xstrdup(mp->f_mntonname); 64 65#ifdef HAVE_STRUCT_STATFS_F_FSTYPENAME 66 ty = mp->f_fstypename; 67#else /* not HAVE_STRUCT_STATFS_F_FSTYPENAME */ 68 switch (mp->f_type) { 69 70# if defined(MOUNT_UFS) && defined(MNTTAB_TYPE_UFS) 71 case MOUNT_UFS: 72 ty = MNTTAB_TYPE_UFS; 73 break; 74# endif /* defined(MOUNT_UFS) && defined(MNTTAB_TYPE_UFS) */ 75 76# if defined(MOUNT_NFS) && defined(MNTTAB_TYPE_NFS) 77 case MOUNT_NFS: 78 ty = MNTTAB_TYPE_NFS; 79 break; 80# endif /* defined(MOUNT_NFS) && defined(MNTTAB_TYPE_NFS) */ 81 82# if defined(MOUNT_MFS) && defined(MNTTAB_TYPE_MFS) 83 case MOUNT_MFS: 84 ty = MNTTAB_TYPE_MFS; 85 break; 86# endif /* defined(MOUNT_MFS) && defined(MNTTAB_TYPE_MFS) */ 87 88 default: 89 ty = "unknown"; 90 91 break; 92 } 93#endif /* not HAVE_STRUCT_STATFS_F_FSTYPENAME */ 94 95 new_mp->mnt_type = xstrdup(ty); 96 new_mp->mnt_opts = xstrdup("unset"); 97 new_mp->mnt_freq = 0; 98 new_mp->mnt_passno = 0; 99 100 return new_mp; 101} 102 103 104/* 105 * Read a mount table into memory 106 */ 107mntlist * 108read_mtab(char *fs, const char *mnttabname) 109{ 110 mntlist **mpp, *mhp; 111 struct statfs *mntbufp, *mntp; 112 113 int nloc = getmntinfo(&mntbufp, MNT_NOWAIT); 114 115 if (nloc == 0) { 116 plog(XLOG_ERROR, "Can't read mount table"); 117 return 0; 118 } 119 mpp = &mhp; 120 for (mntp = mntbufp; mntp < mntbufp + nloc; mntp++) { 121 /* 122 * Allocate a new slot 123 */ 124 *mpp = ALLOC(struct mntlist); 125 126 /* 127 * Copy the data returned by getmntent 128 */ 129 (*mpp)->mnt = mnt_dup(mntp); 130 131 /* 132 * Move to next pointer 133 */ 134 mpp = &(*mpp)->mnext; 135 } 136 137 /* 138 * Terminate the list 139 */ 140 *mpp = NULL; 141 142 return mhp; 143} 144