⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proto.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "vnc.h"#define SHORT(p) (((p)[0]<<8)|((p)[1]))#define LONG(p) ((SHORT(p)<<16)|SHORT(p+2))uchar zero[64];Vnc*vncinit(int fd, int cfd, Vnc *v){        if(v == nil)		v = mallocz(sizeof(*v), 1);	Binit(&v->in, fd, OREAD);	Binit(&v->out, fd, OWRITE);	v->datafd = fd;	v->ctlfd = cfd;	return v;}voidvncterm(Vnc *v){	Bterm(&v->out);	Bterm(&v->in);}voidvncflush(Vnc *v){	if(Bflush(&v->out) < 0){		if(verbose > 1)			fprint(2, "hungup while sending flush: %r\n");		vnchungup(v);	}}ucharvncrdchar(Vnc *v){	uchar buf[1];	vncrdbytes(v, buf, 1);	return buf[0];}ushortvncrdshort(Vnc *v){	uchar buf[2];	vncrdbytes(v, buf, 2);	return SHORT(buf);}ulongvncrdlong(Vnc *v){	uchar buf[4];	vncrdbytes(v, buf, 4);	return LONG(buf);}Pointvncrdpoint(Vnc *v){	Point p;	p.x = vncrdshort(v);	p.y = vncrdshort(v);	return p;}Rectanglevncrdrect(Vnc *v){	Rectangle r;	r.min.x = vncrdshort(v);	r.min.y = vncrdshort(v);	r.max.x = r.min.x + vncrdshort(v);	r.max.y = r.min.y + vncrdshort(v);	return r;}Rectanglevncrdcorect(Vnc *v){	Rectangle r;	r.min.x = vncrdchar(v);	r.min.y = vncrdchar(v);	r.max.x = r.min.x + vncrdchar(v);	r.max.y = r.min.y + vncrdchar(v);	return r;}voidvncrdbytes(Vnc *v, void *a, int n){	if(Bread(&v->in, a, n) != n){		if(verbose > 1)			fprint(2, "hungup while reading\n");		vnchungup(v);	}}Pixfmtvncrdpixfmt(Vnc *v){	Pixfmt fmt;	uchar pad[3];	fmt.bpp = vncrdchar(v);	fmt.depth = vncrdchar(v);	fmt.bigendian = vncrdchar(v);	fmt.truecolor = vncrdchar(v);	fmt.red.max = vncrdshort(v);	fmt.green.max = vncrdshort(v);	fmt.blue.max = vncrdshort(v);	fmt.red.shift = vncrdchar(v);	fmt.green.shift = vncrdchar(v);	fmt.blue.shift = vncrdchar(v);	vncrdbytes(v, pad, 3);	return fmt;}char*vncrdstring(Vnc *v){	ulong len;	char *s;	len = vncrdlong(v);	s = malloc(len+1);	assert(s != nil);	vncrdbytes(v, s, len);	s[len] = '\0';	return s;}/* * on the server side of the negotiation protocol, we read * the client response and then run the negotiated function. * in some cases (e.g., TLS) the negotiated function needs to * use v->datafd directly and be sure that no data has been * buffered away in the Bio.  since we know the client is waiting * for our response, it won't have sent any until we respond. * thus we read the response with vncrdstringx, which goes * behind bio's back. */char*vncrdstringx(Vnc *v){	char tmp[4];	char *s;	ulong len;	assert(Bbuffered(&v->in) == 0);	if(readn(v->datafd, tmp, 4) != 4){		fprint(2, "cannot rdstringx: %r");		vnchungup(v);	}	len = LONG(tmp);	s = malloc(len+1);	assert(s != nil);	if(readn(v->datafd, s, len) != len){		fprint(2, "cannot rdstringx len %lud: %r", len);		vnchungup(v);	}	s[len] = '\0';	return s;}voidvncwrstring(Vnc *v, char *s){	ulong len;	len = strlen(s);	vncwrlong(v, len);	vncwrbytes(v, s, len);}voidvncwrbytes(Vnc *v, void *a, int n){	if(Bwrite(&v->out, a, n) < 0){		if(verbose > 1) 			fprint(2, "hungup while writing bytes\n");		vnchungup(v);	}}voidvncwrlong(Vnc *v, ulong u){	uchar buf[4];	buf[0] = u>>24;	buf[1] = u>>16;	buf[2] = u>>8;	buf[3] = u;	vncwrbytes(v, buf, 4);}voidvncwrshort(Vnc *v, ushort u){	uchar buf[2];	buf[0] = u>>8;	buf[1] = u;	vncwrbytes(v, buf, 2);}voidvncwrchar(Vnc *v, uchar c){	vncwrbytes(v, &c, 1);}voidvncwrpixfmt(Vnc *v, Pixfmt *fmt){	vncwrchar(v, fmt->bpp);	vncwrchar(v, fmt->depth);	vncwrchar(v, fmt->bigendian);	vncwrchar(v, fmt->truecolor);	vncwrshort(v, fmt->red.max);	vncwrshort(v, fmt->green.max);	vncwrshort(v, fmt->blue.max);	vncwrchar(v, fmt->red.shift);	vncwrchar(v, fmt->green.shift);	vncwrchar(v, fmt->blue.shift);	vncwrbytes(v, zero, 3);}voidvncwrrect(Vnc *v, Rectangle r){	vncwrshort(v, r.min.x);	vncwrshort(v, r.min.y);	vncwrshort(v, r.max.x-r.min.x);	vncwrshort(v, r.max.y-r.min.y);}voidvncwrpoint(Vnc *v, Point p){	vncwrshort(v, p.x);	vncwrshort(v, p.y);}voidvnclock(Vnc *v){	qlock(v);}voidvncunlock(Vnc *v){	qunlock(v);}voidhexdump(void *a, int n){	uchar *p, *ep;	p = a;	ep = p+n;	for(; p<ep; p++) 		print("%.2ux ", *p);	print("\n");}voidvncgobble(Vnc *v, long n){	uchar buf[8192];	long m;	while(n > 0){		m = n;		if(m > sizeof(buf))			m = sizeof(buf);		vncrdbytes(v, buf, m);		n -= m;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -