/* 
 * This file is part of the UCB release of Plan 9. It is subject to the license
 * terms in the LICENSE file found in the top-level directory of this
 * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
 * part of the UCB release of Plan 9, including this file, may be copied,
 * modified, propagated, or distributed except according to the terms contained
 * in the LICENSE file.
 */
/*
 * Copyright 2013 Google Inc.
 * Copyright (c) 1989-2003 by Lucent Technologies, Bell Laboratories.
 */

#ifndef _GLIBC_AKAROS_FCALL_H
#define _GLIBC_AKAROS_FCALL_H

#include <ros/common.h>

/* There are a bunch of structs and macros in there that the kernel also uses,
 * though none of this is part of the actual kernel interface (I think) */

/* STATFIXLEN includes leading 16-bit count */
/* The count, however, excludes itself; total size is BIT16SZ+count */
#define STATFIXLEN	(BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ)	/* amount of fixed length data in a stat buffer */

struct qid {
	uint64_t path;
	uint32_t vers;
	uint8_t type;
};

struct dir {
	/* system-modified data */
	uint16_t type;				/* server type */
	unsigned int dev;			/* server subtype */
	/* file data */
	struct qid qid;				/* unique id from server */
	uint32_t mode;				/* permissions */
	uint32_t atime;				/* last read time */
	uint32_t mtime;				/* last write time */
	int64_t length;				/* file length: see <u.h> */
	char *name;				/* last element of path */
	char *uid;				/* owner name */
	char *gid;				/* group name */
	char *muid;				/* last modifier name */
};

#define	VERSION9P	"9P2000"

#define	MAXWELEM	16

struct fcall {
	uint8_t type;
	uint32_t fid;
	uint16_t tag;
	union {
		struct {
			uint32_t msize;		/* Tversion, Rversion */
			char *version;		/* Tversion, Rversion */
		};
		struct {
			uint16_t oldtag;	/* Tflush */
		};
		struct {
			char *ename;		/* Rerror */
		};
		struct {
			struct qid qid;		/* Rattach, Ropen, Rcreate */
			uint32_t iounit;	/* Ropen, Rcreate */
		};
		struct {
			struct qid aqid;	/* Rauth */
		};
		struct {
			uint32_t afid;		/* Tauth, Tattach */
			char *uname;		/* Tauth, Tattach */
			char *aname;		/* Tauth, Tattach */
		};
		struct {
			uint32_t perm;		/* Tcreate */
			char *name;		/* Tcreate */
			uint8_t mode;		/* Tcreate, Topen */
		};
		struct {
			uint32_t newfid;	/* Twalk */
			uint16_t nwname;	/* Twalk */
			char *wname[MAXWELEM];	/* Twalk */
		};
		struct {
			uint16_t nwqid;		/* Rwalk */
			struct qid wqid[MAXWELEM];	/* Rwalk */
		};
		struct {
			int64_t offset;		/* Tread, Twrite */
			uint32_t count;		/* Tread, Twrite, Rread */
			char *data;		/* Twrite, Rread */
		};
		struct {
			uint16_t nstat;		/* Twstat, Rstat */
			uint8_t *stat;		/* Twstat, Rstat */
		};
	};
};

#define	GBIT8(p)  ((p)[0])
#define	GBIT16(p) ((p)[0]|((p)[1]<<8))
#define	GBIT32(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))
#define	GBIT64(p) ((uint32_t)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\
	((int64_t)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32))

#define	PBIT8(p,v)  (p)[0]=(v)
#define	PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8
#define	PBIT32(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
#define	PBIT64(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\
	(p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56

#define	BIT8SZ		1
#define	BIT16SZ		2
#define	BIT32SZ		4
#define	BIT64SZ		8
#define	QIDSZ		(BIT8SZ+BIT32SZ+BIT64SZ)

/* STATFIXLEN includes leading 16-bit count */
/* The count, however, excludes itself; total size is BIT16SZ+count */
#define STATFIXLEN	(BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ)	/* amount of fixed length data in a stat buffer */

#define	NOTAG		(uint16_t)~0U	/* Dummy tag */
#define	NOFID		(uint32_t)~0U	/* Dummy fid */
#define	IOHDRSZ		24	/* ample room for Twrite/Rread header (iounit) */

enum {
	Tversion = 100,
	Rversion,
	Tauth = 102,
	Rauth,
	Tattach = 104,
	Rattach,
	Terror = 106,	/* illegal */
	Rerror,
	Tflush = 108,
	Rflush,
	Twalk = 110,
	Rwalk,
	Topen = 112,
	Ropen,
	Tcreate = 114,
	Rcreate,
	Tread = 116,
	Rread,
	Twrite = 118,
	Rwrite,
	Tclunk = 120,
	Rclunk,
	Tremove = 122,
	Rremove,
	Tstat = 124,
	Rstat,
	Twstat = 126,
	Rwstat,
	Tmax,
};

void init_empty_dir(struct dir *d);
unsigned int convM2S(uint8_t *, unsigned int, struct fcall *);
unsigned int convS2M(struct fcall *, uint8_t *, unsigned int);
unsigned int sizeS2M(struct fcall *);

int statcheck(uint8_t * abuf, unsigned int nbuf);
unsigned int convM2D(uint8_t *, unsigned int, struct dir *, char *);
unsigned int convD2M(struct dir *, uint8_t *, unsigned int);
unsigned int sizeD2M(struct dir *);

#endif /* _GLIBC_AKAROS_FCALL_H */
