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

📄 devfs.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <auth.h>#include <fcall.h>#include <thread.h>#include <9p.h>#include "flashfs.h"static	char*	file;static	int	fd;static	uchar	*ones;static	int	isdev;struct {	int	dfd;	/* data */	int	cfd;	/* control */} flash;voidinitdata(char *f, int){	char err[ERRMAX];	char buf[1024], *fld[8];	int n;	Dir *d;	isdev = 1;	flash.dfd = open(f, ORDWR);	if(flash.dfd < 0){		errstr(err, sizeof err);		if((flash.dfd = create(f, ORDWR, 0666)) >= 0){			fprint(2, "warning: created plain file %s\n", buf);			goto Plain;		}		errstr(err, sizeof err);	/* restore open error */		sysfatal("opening %s: %r", f);	}	if(snprint(buf, sizeof buf, "%sctl", f) != strlen(f)+3)		sysfatal("path too long: %s", f);	flash.cfd = open(buf, ORDWR);	if(flash.cfd < 0){		fprint(2, "warning: cannot open %s (%r); assuming plain file\n", buf);	Plain:		isdev = 0;		if(sectsize == 0)			sectsize = 512;		if(nsects == 0){			if((d = dirstat(f)) == nil)				sysfatal("stat %s: %r", f);			nsects = d->length / sectsize;			free(d);		}		ones = emalloc9p(sectsize);		memset(ones, ~0, sectsize);	}else{		n = read(flash.cfd, buf, sizeof(buf)-1);		if(n <= 0)			sysfatal("reading %sctl: %r", f);		buf[n] = 0;		n = tokenize(buf, fld, nelem(fld));		if(n < 7)			sysfatal("bad flash geometry");		nsects = atoi(fld[5]);		sectsize = atoi(fld[6]);		if(nsects < 8)			sysfatal("unreasonable value for nsects: %lud", nsects);		if(sectsize < 512)			sysfatal("unreasonable value for sectsize: %lud", sectsize);	}}voidclearsect(int sect){	if(isdev==0){		if(pwrite(flash.dfd, ones, sectsize, sect*sectsize) != sectsize)			sysfatal("couldn't erase sector %d: %r", sect);	}else{		if(fprint(flash.cfd, "erase %lud", sect * sectsize) < 0)			sysfatal("couldn't erase sector %d: %r", sect);	}}voidreaddata(int sect, void *buff, ulong count, ulong off){	long n;	ulong m;	m = sect * sectsize + off;	n = pread(flash.dfd, buff, count, m);	if(n < 0)		sysfatal("error reading at %lux: %r", m);	if(n != count)		sysfatal("short read at %lux, %ld instead of %lud\n", m, n, count);}intwritedata(int err, int sect, void *buff, ulong count, ulong off){	long n;	ulong m;	m = sect*sectsize + off;	n = pwrite(flash.dfd, buff, count, m);	if(n < 0){		if(err)			return 0;		sysfatal("error writing at %lux: %r", m);	}	if(n != count){		if(err)			return 0;		sysfatal("short write at %lud, %ld instead of %lud", m, n, count);	}	return 1;}

⌨️ 快捷键说明

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