summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vnc/compat.h
blob: 6c3acfe6cf8fefe37811b9773bf8e8ce8efa4c70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#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