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

📄 mkhosts.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <bio.h>#include <ndb.h>#include <ip.h>typedef struct x{	Ndbtuple *t;	Ndbtuple *it;	Ndbtuple *nt;} X;X x[4096];int nx;char *domname = "research.att.com";int domnamlen;char*upper(char *x){	char *p;	int c;	for(p = x; c = *p; p++)		*p = toupper(c);	return x;}voidprintArecord(int fd, X *p){	Ndbtuple *nt;	char *c;	char *dom = 0;	char *curdom = 0;	int i, cdlen = 0;	int mxweight = 0;	if(p->nt) {		return;	}	for(nt=p->t; nt; nt = nt->entry) {		/* we are only going to handle things in the specified domain */		c = strchr(nt->val, '.');		if (c==0 || strcmp(++c, domname)!=0)			continue;		i = c - nt->val - 1;		if(strcmp(nt->attr, "dom") == 0) {			curdom = nt->val;			cdlen = i;			if (dom == 0) {				dom = curdom;				fprint(fd, "%-.*s%.*s	IN A	%s\n", i, nt->val, 15-i, "               ", p->it->val);			} else				fprint(fd, "%-.*s%.*s	IN CNAME	%s.\n", i, nt->val, 15-i, "               ", dom);		} else if(strcmp(nt->attr, "mx") == 0) {			if (curdom != 0)				fprint(fd, "%-.*s%.*s	MX	%d	%s.\n", cdlen, curdom, 15-cdlen, "               ", mxweight++, nt->val);		}	}}voidprintentry(int fd, X *p){	Ndbtuple *nt;	if(p->nt)		return;	fprint(fd, "%s	", p->it->val);	for(nt = p->t; nt; nt = nt->entry)		if(strcmp(nt->attr, "dom") == 0)			fprint(fd, " %s", nt->val);	for(nt = p->t; nt; nt = nt->entry)		if(strcmp(nt->attr, "sys") == 0)			fprint(fd, " %s", nt->val);	fprint(fd, "\n");}voidprintsys(int fd, X *p){	Ndbtuple *nt;	for(nt = p->t; nt; nt = nt->entry)		if(strcmp(nt->attr, "dom") == 0)			fprint(fd, "%s\n", nt->val);}voidprinttxt(int fd, X *p){	int i;	Ndbtuple *nt;	if(p->nt){		for(;;){			i = strlen(p->it->val);			if(strcmp(p->it->val+i-2, ".0") == 0)				p->it->val[i-2] = 0;			else				break;		}		fprint(fd, "\nNET : %s : %s\n", p->it->val, upper(p->nt->val));		return;	}	fprint(fd, "HOST : %s :", p->it->val);	i = 0;	for(nt = p->t; nt; nt = nt->entry)		if(strcmp(nt->attr, "dom") == 0){			if(i++ == 0)				fprint(fd, " %s", upper(nt->val));			else				fprint(fd, ", %s", upper(nt->val));		}	fprint(fd, "\n");}voidparse(char *file){	int i;	Ndb *db;	Ndbtuple *t, *nt, *tt, *ipnett;	char *p;	db = ndbopen(file);	if(db == 0)		exits("no database");	while(t = ndbparse(db)){		for(nt = t; nt; nt = nt->entry){			if(strcmp(nt->attr, "ip") == 0)				break;			if(strcmp(nt->attr, "flavor") == 0			&& strcmp(nt->val, "console") == 0)				return;		}		if(nt == 0){			ndbfree(t);			continue;		}		/* dump anything not on our nets */		ipnett = 0;		for(tt = t; tt; tt = tt->entry){			if(strcmp(tt->attr, "ipnet") == 0){				ipnett = tt;				break;			}			if(strcmp(tt->attr, "dom") == 0){				i = strlen(tt->val);				p = tt->val+i-domnamlen;				if(p >= tt->val && strcmp(p, domname) == 0)					break;			}		}		if(tt == 0){			ndbfree(t);			continue;		}		for(; nt; nt = nt->entry){			if(strcmp(nt->attr, "ip") != 0)				continue;			x[nx].it = nt;			x[nx].nt = ipnett;			x[nx++].t = t;		}	}}voidmain(int argc, char *argv[]){	int i, fd;	char fn[128];	if (argc>1)		domname = argv[1];	domnamlen = strlen(domname);	if(argc > 2){		for(i = 2; i < argc; i++)			parse(argv[i]);	} else {		parse("/lib/ndb/local");		parse("/lib/ndb/friends");	}	//	sprint(fn, "/lib/ndb/hosts.%-.21s", domname);//	fd = create(fn, OWRITE, 0664);//	if(fd < 0){//		fprint(2, "can't create %s: %r\n", fn);//		exits("boom");//	}//	for(i = 0; i < nx; i++)//		printentry(fd, &x[i]);//	close(fd);//	sprint(fn, "/lib/ndb/db.%-.24s", domname);	fd = create(fn, OWRITE, 0664);	if(fd < 0){		fprint(2, "can't create %s: %r\n", fn);		exits("boom");	}	fprint(fd, "; This file is generated automatically, do not edit!\n");	for(i = 0; i < nx; i++)		printArecord(fd, &x[i]);	close(fd);	sprint(fn, "/lib/ndb/equiv.%-.21s", domname);	fd = create(fn, OWRITE, 0664);	if(fd < 0){		fprint(2, "can't create %s: %r\n", fn);		exits("boom");	}	for(i = 0; i < nx; i++)		printsys(fd, &x[i]);	close(fd);	sprint(fn, "/lib/ndb/txt.%-.23s", domname);	fd = create(fn, OWRITE, 0664);	if(fd < 0){		fprint(2, "can't create %s: %r\n", fn);		exits("boom");	}	for(i = 0; i < nx; i++)		printtxt(fd, &x[i]);	close(fd);	exits(0);}

⌨️ 快捷键说明

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