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

📄 bootip.c

📁 著名操作系统Plan 9的第三版的部分核心源代码。现在很难找到了。Plan 9是bell实验室开发的Unix后继者。
💻 C
字号:
#include <u.h>#include <libc.h>#include <ip.h>#include "boot.h"static uchar	fsip[IPaddrlen];static uchar	auip[IPaddrlen];static char	mpoint[32];static int isvalidip(uchar*);static void netndb(char*, uchar*);voidconfigip(void){	int argc, pid, wpid;	char **argv, *p;	Waitmsg w;	char **arg;	char buf[32];		fmtinstall('I', eipconv);	fmtinstall('M', eipconv);	fmtinstall('E', eipconv);	arg = malloc((bargc+1) * sizeof(char*));	if(arg == nil)		fatal("%r");	memmove(arg, bargv, (bargc+1) * sizeof(char*));	argc = bargc;	argv = arg;	strcpy(mpoint, "/net");	ARGBEGIN {	case 'x':		p = ARGF();		if(p != nil)			snprint(mpoint, sizeof(mpoint), "/net%s", p);		break;	case 'g':	case 'b':	case 'h':	case 'm':		p = ARGF();		USED(p);		break;	} ARGEND;	/* bind in an ip interface */	bind("#I", mpoint, MAFTER);	bind("#l0", mpoint, MAFTER);	bind("#l1", mpoint, MAFTER);	/* let ipconfig configure the ip interface */	switch(pid = fork()){	case -1:		fatal("configuring ip: %r");	case 0:		exec("/ipconfig", arg);		fatal("execing /ipconfig");	default:		break;	}	/* wait for ipconfig to finish */	for(;;){		wpid = wait(&w);		if(wpid == pid){			if(w.msg[0] != 0)				fatal(w.msg);			break;		} else if(wpid < 0)			fatal("configuring ip");	}	/* if we didn't get a file and auth server, query user */	netndb("fs", fsip);	netndb("auth", auip);	if(!isvalidip(fsip)){		buf[0] = 0;		outin("filesystem IP address", buf, sizeof(buf));		parseip(fsip, buf);	}	if(!isvalidip(auip)){		buf[0] = 0;		outin("authentication server IP address", buf, sizeof(buf));		parseip(auip, buf);	}}voidconfigtcp(Method*){	sleep(100);	print("t");	sleep(100);	configip();	sleep(100);	print(".");	sleep(100);}intauthtcp(void){	return -1;}intconnecttcp(void){	char buf[2*NAMELEN];	sprint(buf, "tcp!%I!564", fsip);	return dial(buf, 0, 0, 0);}voidconfigil(Method*){	configip();}intauthil(void){	char buf[2*NAMELEN];	sprint(buf, "il!%I!566", auip);	return dial(buf, 0, 0, 0);}intconnectil(void){	char buf[2*NAMELEN];	sprint(buf, "il!%I!17008", fsip);	return dial(buf, 0, 0, 0);}static intisvalidip(uchar *ip){	if(ipcmp(ip, IPnoaddr) == 0)		return 0;	if(ipcmp(ip, v4prefix) == 0)		return 0;	return 1;}static voidnetndb(char *attr, uchar *ip){	int fd, n, c;	char buf[1024];	char *p;	ipmove(ip, IPnoaddr);	snprint(buf, sizeof(buf), "%s/ndb", mpoint);	fd = open(buf, OREAD);	if(fd < 0)		return;	n = read(fd, buf, sizeof(buf)-1);	close(fd);	if(n <= 0)		return;	buf[n] = 0;	n = strlen(attr);	for(p = buf;;){		p = strstr(p, attr);		if(p == nil)			break;		c = *(p-1);		if(*(p + n) == '=' && (p == buf || c == '\n' || c == ' ' || c == '\t')){			p += n+1;			parseip(ip, p);			break;		}		p++;	}}

⌨️ 快捷键说明

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