blob: 51928b496ee631fcd241ea95c3f3c749bac815f0 [file] [log] [blame]
/*
* 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 */