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

📄 util.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "ssh.h"#include <bio.h>#include <ndb.h>char Edecode[] = "error decoding input packet";char Eencode[] = "out of space encoding output packet (BUG)";char Ehangup[] = "hungup connection";char Ememory[] = "out of memory";int debuglevel;int doabort;voiderror(char *fmt, ...){	va_list arg;	char buf[2048];	va_start(arg, fmt);	vseprint(buf, buf+sizeof(buf), fmt, arg);	va_end(arg);	fprint(2, "%s: %s\n", argv0, buf);	if(doabort)		abort();	exits(buf);}voiddebug(int level, char *fmt, ...){	va_list arg;	if((level&debuglevel) == 0)		return;	va_start(arg, fmt);	vfprint(2, fmt, arg);	va_end(arg);}void*emalloc(long n){	void *a;	a = mallocz(n, 1);	if(a == nil)		error(Ememory);	setmalloctag(a, getcallerpc(&n));	return a;}void*erealloc(void *v, long n){	v = realloc(v, n);	if(v == nil)		error(Ememory);	setrealloctag(v, getcallerpc(&v));	return v;}static int killpid[32];static int nkillpid;voidatexitkiller(void){	int i, pid;	pid = getpid();	debug(DBG, "atexitkiller: nkillpid=%d mypid=%d\n", nkillpid, pid);	for(i=0; i<nkillpid; i++)		if(pid != killpid[i]){			debug(DBG, "killing %d\n", killpid[i]);			postnote(PNPROC, killpid[i], "kill");		}}voidatexitkill(int pid){	killpid[nkillpid++] = pid;}intreadstrnl(int fd, char *buf, int nbuf){	int i;	for(i=0; i<nbuf; i++){		switch(read(fd, buf+i, 1)){		case -1:			return -1;		case 0:			werrstr("unexpected EOF");			return -1;		default:			if(buf[i]=='\n'){				buf[i] = '\0';				return 0;			}			break;		}	}	werrstr("line too long");	return -1;}voidcalcsessid(Conn *c){	int n;	uchar buf[1024];	n = mptobe(c->hostkey->n, buf, sizeof buf, nil);	n += mptobe(c->serverkey->n, buf+n, sizeof buf-n, nil);	memmove(buf+n, c->cookie, COOKIELEN);	n += COOKIELEN;	md5(buf, n, c->sessid, nil);}voidsshlog(char *f, ...){	char *s;	va_list arg;	Fmt fmt;	static int pid;	if(pid == 0)		pid = getpid();	va_start(arg, f);	va_end(arg);	if(fmtstrinit(&fmt) < 0)		sysfatal("fmtstrinit: %r");	fmtprint(&fmt, "[%d] ", pid);	fmtvprint(&fmt, f, arg);	s = fmtstrflush(&fmt);	if(s == nil)		sysfatal("fmtstrflush: %r");	syslog(0, "ssh", "%s", s);	free(s);}/* * this is far too smart. */static intpstrcmp(const void *a, const void *b){	return strcmp(*(char**)a, *(char**)b);}static char*trim(char *s){	char *t;	int i, last, n, nf;	char **f;	char *p;	t = emalloc(strlen(s)+1);	t[0] = '\0';	n = 1;	for(p=s; *p; p++)		if(*p == ' ')			n++;	f = emalloc((n+1)*sizeof(f[0]));	nf = tokenize(s, f, n+1);	qsort(f, nf, sizeof(f[0]), pstrcmp);	last=-1;	for(i=0; i<nf; i++){		if(last==-1 || strcmp(f[last], f[i])!=0){			if(last >= 0)				strcat(t, ",");			strcat(t, f[i]);			last = i;		}	}	return t;	}static voidusetuple(Conn *c, Ndbtuple *t, int scanentries){	int first;	Ndbtuple *l, *e;	char *s;	first=1;	s = c->host;	for(l=t; first||l!=t; l=l->line, first=0){		if(scanentries){			for(e=l; e; e=e->entry){				if(strcmp(e->val, c->host) != 0 &&				  (strcmp(e->attr, "ip")==0 || strcmp(e->attr, "dom")==0 || strcmp(e->attr, "sys")==0)){					s = smprint("%s %s", s, e->val);					if(s == nil)						error("out of memory");				}			}		}		if(strcmp(l->val, c->host) != 0 &&		  (strcmp(l->attr, "ip")==0 || strcmp(l->attr, "dom")==0 || strcmp(l->attr, "sys")==0)){			s = smprint("%s %s", s, l->val);			if(s == nil)				error("out of memory");		}	}	s = trim(s);	c->aliases = s;}voidsetaliases(Conn *c, char *name){	char *p, *net;	char *attr[2];	Ndbtuple *t;	net = "/net";	if(name[0]=='/'){		p = strchr(name+1, '/');		if(p){			net = emalloc(p-name+1);			memmove(net, name, p-name);		}	}	if(p = strchr(name, '!'))		name = p+1;	c->host = emalloc(strlen(name)+1);	strcpy(c->host, name);	c->aliases = c->host;	attr[0] = "dom";	attr[1] = "ip";	t = csipinfo(nil, ipattr(name), name, attr, 2);	if(t != nil){		usetuple(c, t, 0);		ndbfree(t);	}else{		t = dnsquery(net, name, "ip");		if(t != nil){			usetuple(c, t, 1);			ndbfree(t);		}	}}voidprivatefactotum(void){	char *user;	Dir *d;	if((user=getuser()) && (d=dirstat("/mnt/factotum/rpc")) && strcmp(user, d->uid)!=0){		/* grab the terminal's factotum */		rfork(RFNAMEG);	/* was RFNOTEG, which makes little sense */		if(access("/mnt/term/mnt/factotum", AEXIST) >= 0){//			fprint(2, "binding terminal's factotum\n");			if(bind("/mnt/term/mnt/factotum", "/mnt/factotum", MREPL) < 0)				sysfatal("cannot find factotum");		}	}}

⌨️ 快捷键说明

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