169 lines
3.4 KiB
C
169 lines
3.4 KiB
C
#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
|