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