Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#define Rendez KRendez

typedef struct Block    Block;
typedef struct Chan     Chan;
typedef struct Cname    Cname;
typedef struct Dev      Dev;
typedef struct Dirtab   Dirtab;
typedef struct Proc     Proc;
typedef struct Ref      Ref;
typedef struct Rendez   Rendez;
typedef struct Walkqid Walkqid;
typedef int    Devgen(Chan*, Dirtab*, int, int, Dir*);

enum
{
        KNAMELEN        = 28,
        NERR            = 15,

        COPEN           = 0x0001,               /* for i/o */
        CFREE           = 0x0010,               /* not in use */
};

struct Ref
{
        Lock;
        int     ref;
};

struct Rendez
{
        Lock;
        Proc    *p;
};

struct Chan
{
        Ref;
        Chan*   next;                   /* allocation */
        Chan*   link;
        vlong   offset;                 /* in file */
        ushort  type;
        ulong   dev;
        ushort  mode;                   /* read/write */
        ushort  flag;
        Qid     qid;
        int     fid;                    /* for devmnt */
        ulong   iounit;                 /* chunk size for i/o; 0==default */
        void*   aux;
        Cname   *name;
};

struct Cname
{
        Ref;
        int     alen;                   /* allocated length */
        int     len;                    /* strlen(s) */
        char    *s;
};

struct Dev
{
        int     dc;
        char*   name;

        void    (*reset)(void);
        void    (*init)(void);
        Chan*   (*attach)(char*);
        Walkqid*        (*walk)(Chan*, Chan*, char**, int);
        int     (*stat)(Chan*, uchar*, int);
        Chan*   (*open)(Chan*, int);
        void    (*create)(Chan*, char*, int, ulong);
        void    (*close)(Chan*);
        long    (*read)(Chan*, void*, long, vlong);
        Block*  (*bread)(Chan*, long, ulong);
        long    (*write)(Chan*, void*, long, vlong);
        long    (*bwrite)(Chan*, Block*, ulong);
        void    (*remove)(Chan*);
        int     (*wstat)(Chan*, uchar*, int);
};

struct Dirtab
{
        char    name[KNAMELEN];
        Qid     qid;
        vlong length;
        long    perm;
};

struct Walkqid
{
        Chan    *clone;
        int     nqid;
        Qid     qid[1];
};

struct Proc
{
        Lock    rlock;          /* for rendsleep, rendwakeup, intr */
        Rendez  *r;
        int     intr;

        char    name[KNAMELEN];
        char    *user;
        char    error[ERRMAX];
        int     nerrlab;
        jmp_buf errlab[NERR];
        char    genbuf[128];    /* buffer used e.g. for last name element from namec */
};

#define DEVDOTDOT -1

extern  Proc    **privup;
#define up      (*privup)
extern  char    *eve;
extern  Dev*    devtab[];

Chan*           cclone(Chan*);
void            cclose(Chan*);
void            cnameclose(Cname*);
int             decref(Ref*);
Chan*           devattach(int, char*);
Block*          devbread(Chan*, long, ulong);
long            devbwrite(Chan*, Block*, ulong);
void            devcreate(Chan*, char*, int, ulong);
void            devdir(Chan*, Qid, char*, vlong, char*, long, Dir*);
long            devdirread(Chan*, char*, long, Dirtab*, int, Devgen*);
Devgen          devgen;
void            devinit(void);
Chan*           devopen(Chan*, int, Dirtab*, int, Devgen*);
void            devremove(Chan*);
void            devreset(void);
int             devstat(Chan*, uchar*, int, Dirtab*, int, Devgen*);
Walkqid*                devwalk(Chan*, Chan*, char**, int, Dirtab*, int, Devgen*);
int             devwstat(Chan*, uchar*, int);
void            error(char*);
int             incref(Ref*);
void            isdir(Chan*);
void            kproc(char*, void(*)(void*), void*);
void            mkqid(Qid*, vlong, ulong, int);
void            nexterror(void);
Chan*           newchan(void);
Cname*          newcname(char*);
int             openmode(ulong);
void            panic(char*, ...);
int             readstr(ulong, char*, ulong, char*);
long            seconds(void);
void*           smalloc(ulong);

#define         poperror()      up->nerrlab--
#define         waserror()      (up->nerrlab++, setjmp(up->errlab[up->nerrlab-1]))

void            initcompat(void);
void            rendintr(void *v);
void            rendclearintr(void);
void            rendsleep(Rendez*, int(*)(void*), void*);
int             rendwakeup(Rendez*);
void            kexit(void);
int             sysexport(int fd, Chan **roots, int nroots);
int             errdepth(int ed);
void            newup(char *name);

int             exporter(Dev**, int*, int*);
int             mounter(char *mntpt, int how, int fds, int n);
void            shutdown(void);

void            screeninit(int, int, char*);

#pragma varargck        argpos  panic           1