📄 config.c
字号:
#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 + -