Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#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