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

📄 rebootcmd.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include	"u.h"#include	"../port/lib.h"#include	"mem.h"#include	"dat.h"#include	"fns.h"#include	"../port/error.h"#include	"a.out.h"static ulongl2be(long l){	uchar *cp;	cp = (uchar*)&l;	return (cp[0]<<24) | (cp[1]<<16) | (cp[2]<<8) | cp[3];}static voidreadn(Chan *c, void *vp, long n){	char *p = vp;	long nn;	while(n > 0) {		nn = devtab[c->type]->read(c, p, n, c->offset);		if(nn == 0)			error(Eshort);		c->offset += nn;		p += nn;		n -= nn;	}}static voidsetbootcmd(int argc, char *argv[]){	char *buf, *p, *ep;	int i;	buf = malloc(1024);	if(buf == nil)		error(Enomem);	p = buf;	ep = buf + 1024;	for(i=0; i<argc; i++)		p = seprint(p, ep, "%q ", argv[i]);	*p = 0;	ksetenv("bootcmd", buf, 1);	free(buf);}voidrebootcmd(int argc, char *argv[]){	Chan *c;	Exec exec;	ulong magic, text, rtext, entry, data, size;	uchar *p;	if(argc == 0)		exit(0);	c = namec(argv[0], Aopen, OEXEC, 0);	if(waserror()){		cclose(c);		nexterror();	}	readn(c, &exec, sizeof(Exec));	magic = l2be(exec.magic);	entry = l2be(exec.entry);	text = l2be(exec.text);	data = l2be(exec.data);	if(magic != AOUT_MAGIC)		error(Ebadexec);	/* round text out to page boundary */	rtext = PGROUND(entry+text)-entry;	size = rtext + data;	p = malloc(size);	if(p == nil)		error(Enomem);	if(waserror()){		free(p);		nexterror();	}	memset(p, 0, size);	readn(c, p, text);	readn(c, p + rtext, data);	ksetenv("bootfile", argv[0], 1);	setbootcmd(argc-1, argv+1);	reboot((void*)entry, p, size);	panic("return from reboot!");}

⌨️ 快捷键说明

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