plan 9 kernel history: overview | file list | diff list

1996/0116/port/devtinyfs.c (diff list | history)

port/devtinyfs.c on 1996/0116
1996/0116    
/* 
 *  template for making a new device 
 */ 
 
#include	"u.h" 
#include	"../port/lib.h" 
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
#include	"../port/error.h" 
 
#include	"devtab.h" 
 
enum{ 
	Qdir, 
	Qmedium, 
 
	Nfile=	32, 
}; 
 
 
struct { 
	QLock; 
	Chan	*c; 
	Dirtab	file[Nfile]; 
	int	nfile; 
} tinyfs; 
 
void 
tinyfsreset(void) 
{ 
	Dirtab *d; 
 
	d = tinyfs.file; 
	memmove(d->name, "medium"); 
	d->qid.vers = 0; 
	d->qid.path = Qdata; 
	d->perm = 0666; 
} 
 
void 
tinyfsinit(void) 
{ 
} 
 
Chan * 
tinyfsattach(char *spec) 
{ 
	return devattach('E', spec); 
} 
 
Chan * 
tinyfsclone(Chan *c, Chan *nc) 
{ 
	return devclone(c, nc); 
} 
 
int 
tinyfswalk(Chan *c, char *name) 
{ 
	return devwalk(c, name, tinyfs.file, tinyfs.nfile, devgen); 
} 
 
void 
tinyfsstat(Chan *c, char *db) 
{ 
	devstat(c, db, tinyfs.file, tinyfs.nfile, devgen); 
} 
 
Chan * 
tinyfsopen(Chan *c, int omode) 
{ 
	return devopen(c, omode, tinyfs.file, tinyfs.nfile, devgen); 
} 
 
void 
tinyfscreate(Chan *c, char *name, int omode, ulong perm) 
{ 
	Dirtab	*d; 
 
	if(perm & CHDIR) 
		error("directory creation illegal"); 
 
	if(waserror()){ 
		qunlock(&tinyfs); 
		nexterror(); 
	} 
	qlock(&tinyfs); 
 
	if(tinyfs.nfile == Nfile) 
		error("out of space"); 
	for(d = tinyfs.file; d < tinyfs.file[tinyfs.nfile]; d++) 
		if(strcmp(name, d->name) == 0) 
			error("create race"); 
	strncpy(d->name, name, sizeof(d->name)-1); 
	d->perm = perm; 
	d->qid.vers = 0; 
	d->qid.path = tinyfs.high++; 
	tinyfs.nfile++; 
			 
	qunlock(&tinyfs); 
 
	c->mode = openmode(omode); 
	c->flag |= COPEN; 
	c->qid = d->qid; 
} 
 
void 
tinyfsremove(Chan *c) 
{ 
	USED(c); 
	error(Eperm); 
} 
 
void 
tinyfswstat(Chan *c, char *dp) 
{ 
	USED(c, dp); 
	error(Eperm); 
} 
 
void 
tinyfsclose(Chan *c) 
{ 
} 
 
long 
tinyfsread(Chan *c, void *a, long n, ulong offset) 
{ 
	switch(c->qid.path & ~CHDIR){ 
	case Qdir: 
		return devdirread(c, a, n, tinyfstab, Ntinyfstab, devgen); 
	case Qdata: 
		break; 
	default: 
		n=0; 
		break; 
	} 
	return n; 
} 
 
Block* 
tinyfsbread(Chan *c, long n, ulong offset) 
{ 
	return devbread(c, n, offset); 
} 
 
long 
tinyfswrite(Chan *c, char *a, long n, ulong offset) 
{ 
	if(waserror()){ 
		qunlock(&tinyfs); 
		nexterror(); 
	} 
	qlock(&tinyfs); 
	qunlock(&tinyfs); 
 
	switch(c->qid.path & ~CHDIR){ 
	case Qdata: 
		break; 
	default: 
		error(Ebadusefd); 
	} 
	return n; 
} 
 
long 
tinyfsbwrite(Chan *c, Block *bp, ulong offset) 
{ 
	return devbwrite(c, bp, offset); 
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)