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