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

📄 vncv.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "vnc.h"#include "vncv.h"#include <libsec.h>char*	encodings = "copyrect hextile corre rre raw mousewarp";int		bpp12;int		shared;int		verbose;Vnc*		vnc;int		mousefd;int		tls;static int	vncstart(Vnc*, int);enum{	NProcs	= 4};static int pids[NProcs];static char killkin[] = "die vnc kin";/* * called by any proc when exiting to tear everything down. */static voidshutdown(void){	int i, pid;	hangup(vnc->ctlfd);	close(vnc->ctlfd);	vnc->ctlfd = -1;	close(vnc->datafd);	vnc->datafd = -1;	pid = getpid();	for(i = 0; i < NProcs; i++)		if(pids[i] != pid)			postnote(PNPROC, pids[i], killkin);}char*netmkvncaddr(char *inserver){	char *p, portstr[NETPATHLEN], *server;	int port;	server = strdup(inserver);	assert(server != nil);	port = 5900;	if(tls)		port = 35729;	if(p = strchr(server, ':')) {		*p++ = '\0';		port += atoi(p);	}	snprint(portstr, sizeof portstr, "%d", port);	p = netmkaddr(server, "tcp", portstr);	free(server);	return p;}voidvnchungup(Vnc*){	sysfatal("connection closed");}voidusage(void){	fprint(2, "usage: vncv [-e encodings] [-k keypattern] [-csv] host[:n]\n");	exits("usage");}voidmain(int argc, char **argv){	int p, fd, dfd, cfd, shared;	char *keypattern, *addr;	Point d;	TLSconn conn;	keypattern = nil;	shared = 0;	ARGBEGIN{	case 'c':		bpp12 = 1;		break;	case 'e':		encodings = EARGF(usage());		break;	case 's':		shared = 1;		break;	case 't':		tls = 1;		break;	case 'v':		verbose = 1;		break;	case 'k':		keypattern = EARGF(usage());		break;	default:		usage();	}ARGEND;	if(argc != 1)		usage();	addr = netmkvncaddr(argv[0]);	serveraddr = argv[0];	dfd = dial(addr, nil, nil, &cfd);	if(dfd < 0)		sysfatal("cannot dial %s: %r", addr);	if(tls){		dfd = tlsClient(dfd, &conn);		if(dfd < 0)			sysfatal("tlsClient: %r");		/* XXX check thumbprint */	}	vnc = vncinit(dfd, cfd, nil);	if(vnchandshake(vnc) < 0)		sysfatal("handshake failure: %r");	if(vncauth(vnc, keypattern) < 0)		sysfatal("authentication failure: %r");	if(vncstart(vnc, shared) < 0)		sysfatal("init failure: %r");	initdraw(0, 0, "vncv");	display->locking = 1;	unlockdisplay(display);	d = addpt(vnc->dim, Pt(2*Borderwidth, 2*Borderwidth));	if(verbose)		fprint(2, "screen size %P, desktop size %P\n", display->image->r.max, d);	choosecolor(vnc);	sendencodings(vnc);	initmouse();	rfork(RFREND);	atexit(shutdown);	pids[0] = getpid();	switch(p = rfork(RFPROC|RFMEM)){	case -1:		sysfatal("rfork: %r");	default:		break;	case 0:		atexit(shutdown);		readfromserver(vnc);		exits(nil);	}	pids[1] = p;	switch(p = rfork(RFPROC|RFMEM)){	case -1:		sysfatal("rfork: %r");	default:		break;	case 0:		atexit(shutdown);		checksnarf(vnc);		exits(nil);	}	pids[2] = p;	fd = open("/dev/label", OWRITE);	if(fd >= 0){		fprint(fd, "vnc %s", serveraddr);		close(fd);	}	if(access("/dev/snarf", AEXIST) >= 0){		switch(p = rfork(RFPROC|RFMEM)){		case -1:			sysfatal("rfork: %r");		default:			break;		case 0:			atexit(shutdown);			readkbd(vnc);			exits(nil);		}	}	pids[3] = p;	readmouse(vnc);	exits(nil);}static intvncstart(Vnc *v, int shared){	vncwrchar(v, shared);	vncflush(v);	v->dim = vncrdpoint(v);	v->Pixfmt = vncrdpixfmt(v);	v->name = vncrdstring(v);	return 0;}

⌨️ 快捷键说明

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