|  | /* | 
|  | * 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 */ |