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