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

📄 con.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
voidcmd_create(int argc, char *argv[]){	int uid, gid;	long perm;	char elem[NAMELEN], *p;	if(argc < 5) {		print("usage: create path uid gid mode [lad]\n");		return;	}	p = utfrrune(argv[1], '/');	if(p) {		*p++ = 0;		if(walkto(argv[1])) {			print("create failed in walkto: %s\n", p);			return;		}	} else {		if(walkto("/"))			return;		p = argv[1];	}	if(strlen(p) >= NAMELEN) {		print("name too long %s\n", p);		return;	}	memset(elem, 0, sizeof(elem));	strcpy(elem, p);	uid = strtouid(argv[2]);	if(uid < -1)		uid = number(argv[2], -2, 10);	if(uid < -1) {		print("bad uid %s\n", argv[2]);		return;	}	gid = strtouid(argv[3]);	if(gid < -1)		gid = number(argv[3], -2, 10);	if(gid < -1) {		print("bad gid %s\n", argv[3]);		return;	}	perm = number(argv[4], 0777, 8) & 0777;	if(argc > 5) {		if(strchr(argv[5], 'l'))			perm |= PLOCK;		if(strchr(argv[5], 'a'))			perm |= PAPND;		if(strchr(argv[5], 'd'))			perm |= PDIR;	}	if(con_create(FID2, elem, uid, gid, perm, 0))		print("create failed: %s/%s\n", argv[1], p);}staticvoidcmd_clri(int argc, char *argv[]){	int i;	for(i=1; i<argc; i++) {		if(walkto(argv[i])) {			print("cant remove %s\n", argv[i]);			continue;		}		con_clri(FID2);	}}static voidcmd_allow(int, char**){	wstatallow = writeallow = 1;}static voidcmd_disallow(int, char**){	wstatallow = writeallow = 0;}voidckblock(Device *d, Off a, int typ, Off qpath){	Iobuf *p;	if(a) {		p = getbuf(d, a, Bread);		if(p) {			checktag(p, typ, qpath);			putbuf(p);		}	}}voiddoclean(Iobuf *p, Dentry *d, int n, Off a){	int i, mod, typ;	Off qpath;	mod = 0;	qpath = d->qid.path;	typ = Tfile;	if(d->mode & DDIR)		typ = Tdir;	for(i=0; i<NDBLOCK; i++) {		print("dblock[%d] = %lld\n", i, (Wideoff)d->dblock[i]);		ckblock(p->dev, d->dblock[i], typ, qpath);		if(i == n) {			d->dblock[i] = a;			mod = 1;			print("dblock[%d] modified %lld\n", i, (Wideoff)a);		}	}	/* add NDBLOCK so user can cite block address by index */	for (i = 0; i < NIBLOCK; i++) {		print("iblocks[%d] = %lld\n", NDBLOCK+i, (Wideoff)d->iblocks[i]);		ckblock(p->dev, d->iblocks[i], Tind1+i, qpath);		if(NDBLOCK+i == n) {			d->iblocks[i] = a;			mod = 1;			print("iblocks[%d] modified %lld\n", NDBLOCK+i, (Wideoff)a);		}	}	if(mod)		p->flags |= Bmod|Bimm;}staticvoidcmd_clean(int argc, char *argv[]){	int n;	Off a;	Iobuf *p;	Dentry *d;	File *f;	p = 0;	f = 0;	while(argc > 1) {		n = -1;		if(argc > 2)			n = number(argv[2], -1, 10);		a = 0;		if(argc > 3)			a = number(argv[3], 0, 10);		if(walkto(argv[1])) {			print("cant remove %s\n", argv[1]);			break;		}		f = filep(cons.chan, FID2, 0);		if(!f)			break;		if(n >= 0 && f->fs->dev->type == Devro) {			print("readonly %s\n", argv[1]);			break;		}		p = getbuf(f->fs->dev, f->addr, Bread);		d = getdir(p, f->slot);		if(!d || !(d->mode & DALLOC)) {			print("not alloc %s\n", argv[1]);			break;		}		doclean(p, d, n, a);		break;	}	if(f)		qunlock(f);	if(p)		putbuf(p);}staticvoidcmd_remove(int argc, char *argv[]){	int i;	for(i=1; i<argc; i++) {		if(walkto(argv[i])) {			print("cant remove %s\n", argv[i]);			continue;		}		con_remove(FID2);	}}staticvoidcmd_version(int, char *[]){	print("%d-bit %s as of %T\n", sizeof(Off)*8 - 1, service, mktime);	print("\tlast boot %T\n", boottime);}staticvoidcmd_cfs(int argc, char *argv[]){	Filsys *fs;	char *name;	name = "main";	if(argc > 1)		name = argv[1];	fs = fsstr(name);	if(fs == 0) {		print("%s: unknown file system\n", name);		if(cons.curfs)			return;		fs = &filsys[0];	}	if(con_attach(FID1, "adm", fs->name))		panic("FID1 attach to root");	cons.curfs = fs;	print("current fs is \"%s\"\n", cons.curfs->name);}staticvoidcmd_prof(int argc, char *argv[]){	int n;	long m, o;	char *p;	if(cons.profbuf == 0) {		print("no buffer\n");		return;	}	n = !cons.profile;	if(argc > 1)		n = number(argv[1], n, 10);	if(n && !cons.profile) {		print("clr and start\n");		memset(cons.profbuf, 0, cons.nprofbuf*sizeof(cons.profbuf[0]));		cons.profile = 1;		return;	}	if(!n && cons.profile) {		cons.profile = 0;		print("stop and write\n");		if(walkto("/adm/kprofdata"))			goto bad;		if(con_open(FID2, OWRITE|OTRUNC)) {		bad:			print("cant open /adm/kprofdata\n");			return;		}		p = (char*)cons.profbuf;		for(m=0; m<cons.nprofbuf; m++) {			n = cons.profbuf[m];			p[0] = n>>24;			p[1] = n>>16;			p[2] = n>>8;			p[3] = n>>0;			p += 4;		}		m = cons.nprofbuf*sizeof(cons.profbuf[0]);		o = 0;		while(m > 0) {			n = 8192;			if(n > m)				n = m;			con_write(FID2, (char*)cons.profbuf+o, o, n);			m -= n;			o += n;		}		return;	}}staticvoidcmd_time(int argc, char *argv[]){	Timet t1, t2;	int i;	t1 = MACHP(0)->ticks;	conline[0] = 0;	for(i=1; i<argc; i++) {		strcat(conline, " ");		strcat(conline, argv[i]);	}	cmd_exec(conline);	t2 = MACHP(0)->ticks;	print("time = %ld ms\n", TK2MS(t2-t1));}voidcmd_noattach(int, char *[]){	noattach = !noattach;	if(noattach)		print("attaches are DISABLED\n");}voidcmd_files(int, char *[]){	long i, n;	Chan *cp;	for(cp = chans; cp; cp = cp->next)		cp->nfile = 0;	lock(&flock);	n = 0;	for(i=0; i<conf.nfile; i++)		if(files[i].cp) {			n++;			files[i].cp->nfile++;		}	print("%ld out of %ld files used\n", n, conf.nfile);	unlock(&flock);	n = 0;	for(cp = chans; cp; cp = cp->next) {		if(cp->nfile) {			print("%3d: %5d\n",				cp->chan,				cp->nfile);			prflush();			n += cp->nfile;		}	}	print("%ld out of %ld files used\n", n, conf.nfile);}staticvoidinstallcmds(void){	cmd_install("allow", "-- disable permission checking", cmd_allow);	cmd_install("cfs", "[file] -- set current filesystem", cmd_cfs);	cmd_install("clean", "file [bno [addr]] -- block print/fix", cmd_clean);	cmd_install("check", "[options]", cmd_check);	cmd_install("clri", "[file ...] -- purge files/dirs", cmd_clri);	cmd_install("create", "path uid gid perm [lad] -- make a file/dir", cmd_create);	cmd_install("date", "[[+-]seconds] -- print/set date", cmd_date);	cmd_install("disallow", "-- enable permission checking", cmd_disallow);	cmd_install("duallow", "uid -- duallow", cmd_duallow);	cmd_install("flag", "-- print set flags", cmd_flag);	cmd_install("fstat", "path -- print info on a file/dir", cmd_fstat);	cmd_install("halt", "-- return to boot rom", cmd_halt);	cmd_install("help", "", cmd_help);	cmd_install("newuser", "username -- add user to /adm/users", cmd_newuser);	cmd_install("profile", "[01] -- kernel profile", cmd_prof);	cmd_install("remove", "[file ...] -- remove files/dirs", cmd_remove);	cmd_install("stata", "-- overall stats", cmd_stata);	cmd_install("stats", "[[-]flags ...] -- various stats", cmd_stats);	cmd_install("sync", "", cmd_sync);	cmd_install("time", "command -- time another command", cmd_time);	cmd_install("users", "[file] -- read /adm/users", cmd_users);	cmd_install("version", "-- print time of mk and boot", cmd_version);	cmd_install("who", "[user ...] -- print attaches", cmd_who);	cmd_install("hangup", "chan -- clunk files", cmd_hangup);	cmd_install("passwd", "passwd -- set passkey, id, and domain", cmd_passwd);	cmd_install("printconf", "-- print configuration", cmd_printconf);	cmd_install("noattach", "toggle noattach flag", cmd_noattach);	cmd_install("files", "report on files structure", cmd_files);	attachflag = flag_install("attach", "-- attach calls");	chatflag = flag_install("chat", "-- verbose");	errorflag = flag_install("error", "-- on errors");	whoflag = flag_install("allchans", "-- on who");	authdebugflag = flag_install("authdebug", "-- report authentications");	authdisableflag = flag_install("authdisable", "-- disable authentication");}intwalkto(char *name){	char elem[NAMELEN], *p;	int n;	if(con_clone(FID1, FID2))		return 1;	for(;;) {		p = utfrune(name, '/');		if(p == 0)			p = strchr(name, 0);		if(p == name) {			if(*name == 0)				return 0;			name = p+1;			continue;		}		n = p-name;		if(n > NAMELEN)			return 1;		memset(elem, 0, sizeof(elem));		memmove(elem, name, n);		if(con_walk(FID2, elem))			return 1;		name = p;	}}/* needs to parse and return vlongs to cope with new larger block numbers */vlongnumber(char *arg, int def, int base){	int c, sign, any;	vlong n;	if(arg == 0)		return def;	sign = 0;	any = 0;	n = 0;	c = *arg;	while(c == ' ') {		arg++;		c = *arg;	}	if(c == '-') {		sign = 1;		arg++;		c = *arg;	}	while((c >= '0' && c <= '9') ||	      (base == 16 && c >= 'a' && c <= 'f') ||	      (base == 16 && c >= 'A' && c <= 'F')) {		n *= base;		if(c >= 'a' && c <= 'f')			n += c - 'a' + 10;		else		if(c >= 'A' && c <= 'F')			n += c - 'A' + 10;		else			n += c - '0';		arg++;		c = *arg;		any = 1;	}	if(!any)		return def;	if(sign)		n = -n;	return n;}

⌨️ 快捷键说明

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