147509Spendry /*
247509Spendry  * Copyright (c) 1990 Jan-Simon Pendry
347509Spendry  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
4*61785Sbostic  * Copyright (c) 1990, 1993
5*61785Sbostic  *	The Regents of the University of California.  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*61785Sbostic  *	@(#)mount_aix.c	8.1 (Berkeley) 06/06/93
1349685Spendry  *
1452452Spendry  * $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 
aix3_mkvp(p,gfstype,flags,object,stub,host,info,info_size,args)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  */
aix3_mount(fsname,dir,flags,type,data,args)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