#ifndef _9FS_9P_H_
#define _9FS_9P_H_
#define U9FS_AUTHLEN 13
#define U9FS_NAMELEN 28
#define U9FS_TICKETLEN 72
#define U9FS_ERRLEN 64
#define U9FS_DOMLEN 48
#define U9FS_CHALLEN 8
#define U9FS_DIRLEN 116
#define U9FS_MAXFDATA 8192
#define U9FS_MAXDDATA (((int)U9FS_MAXFDATA/U9FS_DIRLEN)*U9FS_DIRLEN)
#define U9P_MODE_RD 0x0
#define U9P_MODE_WR 0x1
#define U9P_MODE_RDWR 0x2
#define U9P_MODE_EX 0x3
#define U9P_MODE_TRUNC 0x10
#define U9P_MODE_CLOSE 0x40
#define U9P_PERM_CHDIR(m) (0x80000000&(m))
#define U9P_PERM_OWNER(m) ((m)&0x7)
#define U9P_PERM_GROUP(m) (((m)>>3)&0x7)
#define U9P_PERM_OTHER(m) (((m)>>6)&0x7)
#define U9P_PERM_ALL(m) ((m)&0777)
/* this is too small */
typedef u_int32_t u9fsfh_t;
struct u9fd_qid {
u9fsfh_t path;
u_int32_t vers;
};
struct u9fsreq {
TAILQ_ENTRY(u9fsreq) r_chain;
struct u9fsreq * r_rep;
struct mbuf * r_mrep;
struct proc *r_procp; /* Proc that did I/O system call */
struct u9fsmount *r_nmp;
/* actual content of the 9P message */
char r_type;
short r_fid;
u_short r_tag;
union {
struct {
u_short oldtag; /* Tflush */
struct u9fd_qid qid; /* Rattach, Rwalk, Ropen, Rcreate */
char rauth[U9FS_AUTHLEN]; /* Rattach */
} u1;
struct {
char uname[U9FS_NAMELEN]; /* Tattach */
char aname[U9FS_NAMELEN]; /* Tattach */
char ticket[U9FS_TICKETLEN]; /* Tattach */
char auth[U9FS_AUTHLEN]; /* Tattach */
} u2;
struct {
char ename[U9FS_ERRLEN]; /* Rerror */
char authid[U9FS_NAMELEN]; /* Rsession */
char authdom[U9FS_DOMLEN]; /* Rsession */
char chal[U9FS_CHALLEN]; /* Tsession/Rsession */
} u3;
struct {
u_int32_t perm; /* Tcreate */
short newfid; /* Tclone, Tclwalk */
char name[U9FS_NAMELEN]; /* Twalk, Tclwalk, Tcreate */
char mode; /* Tcreate, Topen */
} u4;
struct {
u_int64_t offset; /* Tread, Twrite */
u_short count; /* Tread, Twrite, Rread */
char *data; /* Twrite, Rread */
} u5;
char stat[U9FS_DIRLEN]; /* Twstat, Rstat */
} u;
};
#define r_oldtag u.u1.oldtag
#define r_qid u.u1.qid
#define r_rauth u.u1.rauth
#define r_uname u.u2.uname
#define r_aname u.u2.aname
#define r_ticket u.u2.ticket
#define r_auth u.u2.auth
#define r_ename u.u3.ename
#define r_authid u.u3.authid
#define r_authdom u.u3.authdom
#define r_chal u.u3.chal
#define r_perm u.u4.perm
#define r_newfid u.u4.newfid
#define r_name u.u4.name
#define r_mode u.u4.mode
#define r_offset u.u5.offset
#define r_count u.u5.count
#define r_data u.u5.data
#define r_stat u.stat
extern TAILQ_HEAD(u9fs_reqq, u9fsreq) u9fs_reqq;
struct u9fsdir {
char dir_name[U9FS_NAMELEN];
char dir_uid[U9FS_NAMELEN];
char dir_gid[U9FS_NAMELEN];
struct u9fd_qid dir_qid;
u_int32_t dir_mode;
u_int32_t dir_atime;
u_int32_t dir_mtime;
union {
u_int64_t length;
struct { /* little endian */
u_int32_t llength;
u_int32_t hlength;
} l;
} u;
u_short dir_type;
u_short dir_dev;
};
#define dir_length u.length
#define dir_llength u.l.llength
#define dir_hlength u.l.hlength
enum
{
Tnop = 50,
Rnop,
Tosession = 52, /* illegal */
Rosession, /* illegal */
Terror = 54, /* illegal */
Rerror,
Tflush = 56,
Rflush,
Toattach = 58, /* illegal */
Roattach, /* illegal */
Tclone = 60,
Rclone,
Twalk = 62,
Rwalk,
Topen = 64,
Ropen,
Tcreate = 66,
Rcreate,
Tread = 68,
Rread,
Twrite = 70,
Rwrite,
Tclunk = 72,
Rclunk,
Tremove = 74,
Rremove,
Tstat = 76,
Rstat,
Twstat = 78,
Rwstat,
Tclwalk = 80,
Rclwalk,
Tauth = 82, /* illegal */
Rauth, /* illegal */
Tsession = 84,
Rsession,
Tattach = 86,
Rattach,
Ttunnel = 88,
Rtunnel,
Tmax
};
static char * u9p_types[] = {
"Tnop",
"Rnop",
"Tosession",
"Rosession",
"Terror",
"Rerror",
"Tflush",
"Rflush",
"Toattach",
"Roattach",
"Tclone",
"Rclone",
"Twalk",
"Rwalk",
"Topen",
"Ropen",
"Tcreate",
"Rcreate",
"Tread",
"Rread",
"Twrite",
"Rwrite",
"Tclunk",
"Rclunk",
"Tremove",
"Rremove",
"Tstat",
"Rstat",
"Twstat",
"Rwstat",
"Tclwalk",
"Rclwalk",
"Tauth",
"Rauth",
"Tsession",
"Rsession",
"Tattach",
"Rattach",
"Ttunnel",
"Rtunnel",
"Tmax"
};
int u9p_m2s __P((char *ap, int n, struct u9fsreq *f));
int u9p_s2m __P((struct u9fsreq *f, char *ap, int copydata));
int u9p_m2d __P((char *ap, struct u9fsdir *f));
int u9p_d2m __P((struct u9fsdir *f, char *ap));
int u9p_type __P((char * t));
int u9p_m_m2s __P((struct mbuf **m, struct u9fsreq *f));
struct mbuf * u9p_m_s2m __P((struct u9fsreq *f));
int u9p_m_m2d __P((struct mbuf **m, struct u9fsdir *f));
struct mbuf * u9p_m_d2m __P((struct u9fsdir *f));
u_short u9p_m_tag __P((struct mbuf **m));
#endif
|