147509Spendry /* 247509Spendry * Copyright (c) 1990 Jan-Simon Pendry 347509Spendry * Copyright (c) 1990 Imperial College of Science, Technology & Medicine 447509Spendry * Copyright (c) 1990 The Regents of the University of California. 547509Spendry * All rights reserved. 647509Spendry * 747509Spendry * This code is derived from software contributed to Berkeley by 847509Spendry * Jan-Simon Pendry at Imperial College, London. 947509Spendry * 1047534Spendry * %sccs.include.redist.c% 1147509Spendry * 12*52452Spendry * @(#)mount_aix.c 5.4 (Berkeley) 02/09/92 1349685Spendry * 14*52452Spendry * $Id: mount_aix.c,v 5.2.2.1 1992/02/09 15:10:08 jsp beta $ 1549685Spendry * 1647509Spendry */ 1747509Spendry 1847509Spendry 1947509Spendry /* 2047509Spendry * AIX 3 Mount helper 2147509Spendry */ 2247509Spendry 2347509Spendry #include "misc-aix3.h" 2447509Spendry 2547509Spendry static int aix3_mkvp(p, gfstype, flags, object, stub, host, info, info_size, args) 2647509Spendry char *p; 2747509Spendry int gfstype; 2847509Spendry int flags; 2947509Spendry char *object; 3047509Spendry char *stub; 3147509Spendry char *host; 3247509Spendry char *info; 3347509Spendry int info_size; 3447509Spendry char *args; 3547509Spendry { 3647509Spendry struct vmount *vp = (struct vmount *) p; 3747509Spendry bzero((voidp) vp, sizeof(*vp)); 3847509Spendry /* 3947509Spendry * Fill in standard fields 4047509Spendry */ 4147509Spendry vp->vmt_revision = VMT_REVISION; 4247509Spendry vp->vmt_flags = flags; 4347509Spendry vp->vmt_gfstype = gfstype; 4447509Spendry 4547509Spendry #define VMT_ROUNDUP(len) (4 * ((len + 3) / 4)) 4647509Spendry #define VMT_ASSIGN(vp, idx, data, size) \ 4747509Spendry vp->vmt_data[idx].vmt_off = p - (char *) vp; \ 4847509Spendry vp->vmt_data[idx].vmt_size = size; \ 4947509Spendry bcopy(data, p, size); \ 5047509Spendry p += VMT_ROUNDUP(size); 5147509Spendry 5247509Spendry /* 5347509Spendry * Fill in all variable length data 5447509Spendry */ 5547509Spendry p += sizeof(*vp); 5647509Spendry 5747509Spendry VMT_ASSIGN(vp, VMT_OBJECT, object, strlen(object) + 1); 5847509Spendry VMT_ASSIGN(vp, VMT_STUB, stub, strlen(stub) + 1); 5947509Spendry VMT_ASSIGN(vp, VMT_HOST, host, strlen(host) + 1); 6047509Spendry VMT_ASSIGN(vp, VMT_HOSTNAME, host, strlen(host) + 1); 6147509Spendry VMT_ASSIGN(vp, VMT_INFO, info, info_size); 6247509Spendry VMT_ASSIGN(vp, VMT_ARGS, args, strlen(args) + 1); 6347509Spendry 6447509Spendry #undef VMT_ASSIGN 6547509Spendry #undef VMT_ROUNDUP 6647509Spendry 6747509Spendry /* 6847509Spendry * Return length 6947509Spendry */ 7047509Spendry return vp->vmt_length = p - (char *) vp; 7147509Spendry } 7247509Spendry 7347509Spendry /* 7447509Spendry * Map from conventional mount arguments 7547509Spendry * to AIX 3-style arguments. 7647509Spendry */ 7747509Spendry aix3_mount(fsname, dir, flags, type, data, args) 7847509Spendry char *fsname; 7947509Spendry char *dir; 8047509Spendry int flags; 8147509Spendry int type; 8247509Spendry void *data; 8347509Spendry char *args; 8447509Spendry { 8547509Spendry char buf[4096]; 8647509Spendry int size; 8747509Spendry 8847509Spendry #ifdef DEBUG 8947509Spendry dlog("aix3_mount: fsname %s, dir %s, type %d", fsname, dir, type); 9047509Spendry #endif /* DEBUG */ 9147509Spendry 9247509Spendry /* aix3_mkvp(p, gfstype, flags, object, stub, host, info, info_size, args) */ 9347509Spendry 9447509Spendry switch (type) { 9547509Spendry 9647509Spendry case MOUNT_TYPE_NFS: { 9747509Spendry char *host = strdup(fsname); 9847509Spendry char *rfs = strchr(host, ':'); 9947509Spendry int free_rfs = 0; 10047509Spendry if (rfs) { 10147509Spendry *rfs++ = '\0'; 10247509Spendry } else { 10347509Spendry rfs = host; 10447509Spendry free_rfs = 1; 10547509Spendry host = strdup(hostname); 10647509Spendry } 10747509Spendry 10847509Spendry size = aix3_mkvp(buf, type, flags, rfs, dir, host, data, sizeof(struct nfs_args), args); 10947509Spendry if (free_rfs) 11047509Spendry free((voidp) rfs); 11147509Spendry free(host); 11247509Spendry 11347509Spendry } break; 11447509Spendry 11547509Spendry case MOUNT_TYPE_UFS: 11647509Spendry /* Need to open block device and extract log device info from sblk. */ 11747509Spendry return EINVAL; 11847509Spendry 11947509Spendry default: 12047509Spendry return EINVAL; 12147509Spendry } 12247509Spendry #ifdef DEBUG 12347509Spendry /*dlog("aix3_mkvp: flags %#x, size %d, args %s", flags, size, args);*/ 12447509Spendry #endif /* DEBUG */ 12547509Spendry 12647509Spendry return vmount(buf, size); 12747509Spendry } 128