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