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

📄 listen.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <auth.h>#include <fcall.h>#include <thread.h>#include <9p.h>static void listenproc(void*);static void srvproc(void*);static char *getremotesys(char*);void_listensrv(Srv *os, char *addr){	Srv *s;	if(_forker == nil)		sysfatal("no forker");	s = emalloc9p(sizeof *s);	*s = *os;	s->addr = estrdup9p(addr);	_forker(listenproc, s, 0);}static voidlistenproc(void *v){	char ndir[NETPATHLEN], dir[NETPATHLEN];	int ctl, data, nctl;	Srv *os, *s;		os = v;	ctl = announce(os->addr, dir);	if(ctl < 0){		fprint(2, "%s: announce %s: %r", argv0, os->addr);		return;	}	for(;;){		nctl = listen(dir, ndir);		if(nctl < 0){			fprint(2, "%s: listen %s: %r", argv0, os->addr);			break;		}				data = accept(ctl, ndir);		if(data < 0){			fprint(2, "%s: accept %s: %r\n", argv0, ndir);			continue;		}		s = emalloc9p(sizeof *s);		*s = *os;		s->addr = getremotesys(ndir);		s->infd = s->outfd = data;		s->fpool = nil;		s->rpool = nil;		s->rbuf = nil;		s->wbuf = nil;		_forker(srvproc, s, 0);	}	free(os->addr);	free(os);}static voidsrvproc(void *v){	int data;	Srv *s;		s = v;	data = s->infd;	srv(s);	close(data);	free(s->addr);	free(s);}static char*getremotesys(char *ndir){	char buf[128], *serv, *sys;	int fd, n;	snprint(buf, sizeof buf, "%s/remote", ndir);	sys = nil;	fd = open(buf, OREAD);	if(fd >= 0){		n = read(fd, buf, sizeof(buf)-1);		if(n>0){			buf[n-1] = 0;			serv = strchr(buf, '!');			if(serv)				*serv = 0;			sys = estrdup9p(buf);		}		close(fd);	}	if(sys == nil)		sys = estrdup9p("unknown");	return sys;}

⌨️ 快捷键说明

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