1 /* 2 * Copyright (c) 1990 Jan-Simon Pendry 3 * Copyright (c) 1990 Imperial College of Science, Technology & Medicine 4 * Copyright (c) 1990 The Regents of the University of California. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Jan-Simon Pendry at Imperial College, London. 9 * 10 * %sccs.include.redist.c% 11 * 12 * @(#)mount_aix.c 5.4 (Berkeley) 02/09/92 13 * 14 * $Id: mount_aix.c,v 5.2.2.1 1992/02/09 15:10:08 jsp beta $ 15 * 16 */ 17 18 19 /* 20 * AIX 3 Mount helper 21 */ 22 23 #include "misc-aix3.h" 24 25 static int aix3_mkvp(p, gfstype, flags, object, stub, host, info, info_size, args) 26 char *p; 27 int gfstype; 28 int flags; 29 char *object; 30 char *stub; 31 char *host; 32 char *info; 33 int info_size; 34 char *args; 35 { 36 struct vmount *vp = (struct vmount *) p; 37 bzero((voidp) vp, sizeof(*vp)); 38 /* 39 * Fill in standard fields 40 */ 41 vp->vmt_revision = VMT_REVISION; 42 vp->vmt_flags = flags; 43 vp->vmt_gfstype = gfstype; 44 45 #define VMT_ROUNDUP(len) (4 * ((len + 3) / 4)) 46 #define VMT_ASSIGN(vp, idx, data, size) \ 47 vp->vmt_data[idx].vmt_off = p - (char *) vp; \ 48 vp->vmt_data[idx].vmt_size = size; \ 49 bcopy(data, p, size); \ 50 p += VMT_ROUNDUP(size); 51 52 /* 53 * Fill in all variable length data 54 */ 55 p += sizeof(*vp); 56 57 VMT_ASSIGN(vp, VMT_OBJECT, object, strlen(object) + 1); 58 VMT_ASSIGN(vp, VMT_STUB, stub, strlen(stub) + 1); 59 VMT_ASSIGN(vp, VMT_HOST, host, strlen(host) + 1); 60 VMT_ASSIGN(vp, VMT_HOSTNAME, host, strlen(host) + 1); 61 VMT_ASSIGN(vp, VMT_INFO, info, info_size); 62 VMT_ASSIGN(vp, VMT_ARGS, args, strlen(args) + 1); 63 64 #undef VMT_ASSIGN 65 #undef VMT_ROUNDUP 66 67 /* 68 * Return length 69 */ 70 return vp->vmt_length = p - (char *) vp; 71 } 72 73 /* 74 * Map from conventional mount arguments 75 * to AIX 3-style arguments. 76 */ 77 aix3_mount(fsname, dir, flags, type, data, args) 78 char *fsname; 79 char *dir; 80 int flags; 81 int type; 82 void *data; 83 char *args; 84 { 85 char buf[4096]; 86 int size; 87 88 #ifdef DEBUG 89 dlog("aix3_mount: fsname %s, dir %s, type %d", fsname, dir, type); 90 #endif /* DEBUG */ 91 92 /* aix3_mkvp(p, gfstype, flags, object, stub, host, info, info_size, args) */ 93 94 switch (type) { 95 96 case MOUNT_TYPE_NFS: { 97 char *host = strdup(fsname); 98 char *rfs = strchr(host, ':'); 99 int free_rfs = 0; 100 if (rfs) { 101 *rfs++ = '\0'; 102 } else { 103 rfs = host; 104 free_rfs = 1; 105 host = strdup(hostname); 106 } 107 108 size = aix3_mkvp(buf, type, flags, rfs, dir, host, data, sizeof(struct nfs_args), args); 109 if (free_rfs) 110 free((voidp) rfs); 111 free(host); 112 113 } break; 114 115 case MOUNT_TYPE_UFS: 116 /* Need to open block device and extract log device info from sblk. */ 117 return EINVAL; 118 119 default: 120 return EINVAL; 121 } 122 #ifdef DEBUG 123 /*dlog("aix3_mkvp: flags %#x, size %d, args %s", flags, size, args);*/ 124 #endif /* DEBUG */ 125 126 return vmount(buf, size); 127 } 128