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