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

📄 config.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
#include	"all.h"#include	"io.h"static void	dowormcopy(void);static int	dodevcopy(void);/* * This is needed for IP configuration. */#include	"../ip/ip.h"struct{	char*	icharp;	char*	charp;	int	error;	int	newconf;	/* clear befor start */	int	modconf;	/* write back when done */	int	nextiter;	int	lastiter;	int	diriter;	int	ipauthset;	Device*	lastcw;	Device*	devlist;} f;static Device* confdev;static int copyworm = 0, copydev = 0;static char *src, *dest;intdevcmpr(Device *d1, Device *d2){	while (d1 != d2) {		if(d1 == 0 || d2 == 0 || d1->type != d2->type)			return 1;		switch(d1->type) {		default:			print("can't compare dev: %Z\n", d1);			panic("devcmp");			return 1;		case Devmcat:		case Devmlev:		case Devmirr:			d1 = d1->cat.first;			d2 = d2->cat.first;			while(d1 && d2) {				if(devcmpr(d1, d2))					return 1;				d1 = d1->link;				d2 = d2->link;			}			break;		case Devnone:			return 0;		case Devro:			d1 = d1->ro.parent;			d2 = d2->ro.parent;			break;		case Devjuke:		case Devcw:			if(devcmpr(d1->cw.c, d2->cw.c))				return 1;			d1 = d1->cw.w;			d2 = d2->cw.w;			break;		case Devfworm:			d1 = d1->fw.fw;			d2 = d2->fw.fw;			break;		case Devwren:		case Devworm:		case Devlworm:		case Devide:		case Devmarvsata:			if(d1->wren.ctrl == d2->wren.ctrl)			if(d1->wren.targ == d2->wren.targ)			if(d1->wren.lun == d2->wren.lun)				return 0;			return 1;		case Devpart:			if(d1->part.base == d2->part.base)			if(d1->part.size == d2->part.size) {				d1 = d1->part.d;				d2 = d2->part.d;				break;			}			return 1;		}	}	return 0;}voidcdiag(char *s, int c1){	f.charp--;	if(f.error == 0) {		print("config diag: %s -- <%c>\n", s, c1);		f.error = 1;	}}intcnumb(void){	int c, n;	c = *f.charp++;	if(c == '<') {		n = f.nextiter;		if(n >= 0) {			f.nextiter = n+f.diriter;			if(n == f.lastiter) {				f.nextiter = -1;				f.lastiter = -1;			}			do {				c = *f.charp++;			} while (c != '>');			return n;		}		n = cnumb();		if(*f.charp++ != '-') {			cdiag("- expected", f.charp[-1]);			return 0;		}		c = cnumb();		if(*f.charp++ != '>') {			cdiag("> expected", f.charp[-1]);			return 0;		}		f.lastiter = c;		f.diriter = 1;		if(n > c)			f.diriter = -1;		f.nextiter = n+f.diriter;		return n;	}	if(c < '0' || c > '9') {		cdiag("number expected", c);		return 0;	}	n = 0;	while(c >= '0' && c <= '9') {		n = n*10 + (c-'0');		c = *f.charp++;	}	f.charp--;	return n;}Device*config1(int c){	Device *d, *t;	int m;	d = ialloc(sizeof(Device), 0);	for(;;) {		t = config();		if(d->cat.first == 0)			d->cat.first = t;		else			d->cat.last->link = t;		d->cat.last = t;		if(f.error)			return devnone;		m = *f.charp;		if(c == '(' && m == ')') {			d->type = Devmcat;			break;		}		if(c == '[' && m == ']') {			d->type = Devmlev;			break;		}		if(c == '{' && m == '}') {			d->type = Devmirr;			break;		}	}	f.charp++;	if(d->cat.first == d->cat.last)		d = d->cat.first;	return d;}Device*config(void){	int c, m;	Device *d;	char *icp;	if(f.error)		return devnone;	d = ialloc(sizeof(Device), 0);	c = *f.charp++;	switch(c) {	default:		cdiag("unknown type", c);		return devnone;	case '(':	/* (d+) one or multiple cat */	case '[':	/* [d+] one or multiple interleave */	case '{':	/* {d+} a mirrored device and optional mirrors */		return config1(c);	case 'f':	/* fd fake worm */		d->type = Devfworm;		d->fw.fw = config();		break;	case 'n':		d->type = Devnone;		break;	case 'w':	/* w[#.]#[.#] wren	[ctrl] unit [lun] */	case 'h':	/* h[#.]# ide		[ctlr] unit */	case 'm':	/* m[#.]# marvell sata	[ctlr] unit */	case 'r':	/* r# worm side */	case 'l':	/* l# labelled-worm side */		icp = f.charp;		if(c == 'm')			d->type = Devmarvsata;		else if(c == 'h')			d->type = Devide;		else			d->type = Devwren;		d->wren.ctrl = 0;		d->wren.targ = cnumb();		d->wren.lun = 0;		m = *f.charp;		if(m == '.') {			f.charp++;			d->wren.lun = cnumb();			m = *f.charp;			if(m == '.') {				f.charp++;				d->wren.ctrl = d->wren.targ;				d->wren.targ = d->wren.lun;				d->wren.lun = cnumb();			}		}		if(f.nextiter >= 0)			f.charp = icp-1;		if(c == 'r') {	/* worms are virtual and not uniqued */			d->type = Devworm;			break;		}		if(c == 'l') {			d->type = Devlworm;			break;		}		break;	case 'o':	/* o ro part of last cw */		if(f.lastcw == 0) {			cdiag("no cw to match", c);			return devnone;		}		return f.lastcw->cw.ro;	case 'j':	/* DD jukebox */		d->type = Devjuke;		d->j.j = config();		d->j.m = config();		break;	case 'c':	/* cache/worm */		d->type = Devcw;		d->cw.c = config();		d->cw.w = config();		d->cw.ro = ialloc(sizeof(Device), 0);		d->cw.ro->type = Devro;		d->cw.ro->ro.parent = d;		f.lastcw = d;		break;	case 'p':	/* pd#.# partition base% size% */		d->type = Devpart;		d->part.d = config();		d->part.base = cnumb();		c = *f.charp++;		if(c != '.')			cdiag("dot expected", c);		d->part.size = cnumb();		break;	case 'x':	/* xD swab a device's metadata */		d->type = Devswab;		d->swab.d = config();		break;	}	d->dlink = f.devlist;	f.devlist = d;	return d;}char*strdup(char *s){	int n;	char *s1;	n = strlen(s);	s1 = ialloc(n+1, 0);	strcpy(s1, s);	return s1;}Device*iconfig(char *s){	Device *d;	f.nextiter = -1;	f.lastiter = -1;	f.error = 0;	f.icharp = s;	f.charp = f.icharp;	d = config();	if(*f.charp) {		cdiag("junk on end", *f.charp);		f.error = 1;	}	return d;}inttestconfig(char *s){	iconfig(s);	return f.error;}intastrcmp(char *a, char *b){	int n, c;	n = strlen(b);	if(memcmp(a, b, n))		return 1;	c = a[n];	if(c == 0) {		aindex = 0;		return 0;	}	if(a[n+1])		return 1;	if(c >= '0' && c <= '9') {		aindex = c - '0';		return 0;	}	return 1;}voidmergeconf(Iobuf *p){	char word[Maxword+1];	char *cp;	Filsys *fs;	for (cp = p->iobuf; ; cp++) {		cp = getwd(word, cp);		if(strcmp(word, "") == 0)			return;		else if(strcmp(word, "service") == 0) {			cp = getwd(word, cp);			if(service[0] == 0)				strcpy(service, word);		} else if(strcmp(word, "ipauth") == 0) {			cp = getwd(word, cp);			if(!f.ipauthset)				if(chartoip(authip, word))					goto bad;		} else if(astrcmp(word, "ip") == 0) {			cp = getwd(word, cp);			if(!isvalidip(ipaddr[aindex].sysip))				if(chartoip(ipaddr[aindex].sysip, word))					goto bad;		} else if(astrcmp(word, "ipgw") == 0) {			cp = getwd(word, cp);			if(!isvalidip(ipaddr[aindex].defgwip))				if(chartoip(ipaddr[aindex].defgwip, word))					goto bad;		} else if(astrcmp(word, "ipsntp") == 0) {			cp = getwd(word, cp);			if (!isvalidip(sntpip))				if (chartoip(sntpip, word))					goto bad;		} else if(astrcmp(word, "ipmask") == 0) {			cp = getwd(word, cp);			if(!isvalidip(ipaddr[aindex].defmask))				if(chartoip(ipaddr[aindex].defmask, word))					goto bad;		} else if(strcmp(word, "filsys") == 0) {			cp = getwd(word, cp);			for(fs=filsys; fs->name; fs++)				if(strcmp(fs->name, word) == 0) {					if(fs->flags & FEDIT) {						cp = getwd(word, cp);						goto loop;					}					break;				}			fs->name = strdup(word);			cp = getwd(word, cp);			fs->conf = strdup(word);		} else {bad:			putbuf(p);			panic("unknown word in config block: %s", word);		}loop:		if(*cp != '\n')			goto bad;	}}voidcmd_printconf(int, char *[]){	char *p, *s;	Iobuf *iob;	iob = getbuf(confdev, 0, Bread);	if(iob == nil)		return;	if(checktag(iob, Tconfig, 0)){		putbuf(iob);		return;	}	print("config %s\n", nvrgetconfig());	s = p = iob->iobuf;	while(*p != 0 && p < iob->iobuf+BUFSIZE){		if(*p++ != '\n')			continue;		print("%.*s", (int)(p-s), s);		s = p;	}	if(p != s)		print("%.*s", (int)(p-s), s);	print("end\n");	putbuf(iob);}extern void floppyhalt(void);voidsysinit(void){	Filsys *fs;	int error, i;	Device *d;	Iobuf *p;	char *cp;	dofilter(u->time+0, C0a, C0b, 1);	dofilter(u->time+1, C1a, C1b, 1);	dofilter(u->time+2, C2a, C2b, 1);	dofilter(cons.work+0, C0a, C0b, 1);	dofilter(cons.work+1, C1a, C1b, 1);	dofilter(cons.work+2, C2a, C2b, 1);	dofilter(cons.rate+0, C0a, C0b, 1000);	dofilter(cons.rate+1, C1a, C1b, 1000);	dofilter(cons.rate+2, C2a, C2b, 1000);	dofilter(cons.bhit+0, C0a, C0b, 1);	dofilter(cons.bhit+1, C1a, C1b, 1);	dofilter(cons.bhit+2, C2a, C2b, 1);	dofilter(cons.bread+0, C0a, C0b, 1);	dofilter(cons.bread+1, C1a, C1b, 1);	dofilter(cons.bread+2, C2a, C2b, 1);	dofilter(cons.brahead+0, C0a, C0b, 1);	dofilter(cons.brahead+1, C1a, C1b, 1);	dofilter(cons.brahead+2, C2a, C2b, 1);	dofilter(cons.binit+0, C0a, C0b, 1);	dofilter(cons.binit+1, C1a, C1b, 1);	dofilter(cons.binit+2, C2a, C2b, 1);	cons.chan = chaninit(Devcon, 1, 0);start:	/*	 * part 1 -- read the config file	 */	devnone = iconfig("n");	cp = nvrgetconfig();	print("config %s\n", cp);	confdev = d = iconfig(cp);	devinit(d);	if(f.newconf) {		p = getbuf(d, 0, Bmod);		memset(p->iobuf, 0, RBUFSIZE);		settag(p, Tconfig, 0);	} else		p = getbuf(d, 0, Bread|Bmod);	if(!p || checktag(p, Tconfig, 0))		panic("config io");	mergeconf(p);	if(f.modconf) {		memset(p->iobuf, 0, BUFSIZE);		p->flags |= Bmod|Bimm;		if(service[0])			sprint(strchr(p->iobuf, 0), "service %s\n", service);		for(fs=filsys; fs->name; fs++)			if(fs->conf)				sprint(strchr(p->iobuf, 0),					"filsys %s %s\n", fs->name, fs->conf);		sprint(strchr(p->iobuf, 0), "ipauth %I\n", authip);		sprint(strchr(p->iobuf, 0), "ipsntp %I\n", sntpip);		for(i=0; i<10; i++) {			if(isvalidip(ipaddr[i].sysip))				sprint(strchr(p->iobuf, 0),					"ip%d %I\n", i, ipaddr[i].sysip);			if(isvalidip(ipaddr[i].defgwip))				sprint(strchr(p->iobuf, 0),					"ipgw%d %I\n", i, ipaddr[i].defgwip);			if(isvalidip(ipaddr[i].defmask))				sprint(strchr(p->iobuf, 0),

⌨️ 快捷键说明

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