Add real factotum.
This commit is contained in:
126
kern/devlfd.c
Normal file
126
kern/devlfd.c
Normal file
@ -0,0 +1,126 @@
|
||||
#include "u.h"
|
||||
#include <errno.h>
|
||||
#include "lib.h"
|
||||
#include "dat.h"
|
||||
#include "fns.h"
|
||||
#include "error.h"
|
||||
|
||||
#undef pread
|
||||
#undef pwrite
|
||||
|
||||
Chan*
|
||||
lfdchan(int fd)
|
||||
{
|
||||
Chan *c;
|
||||
|
||||
c = newchan();
|
||||
c->type = devno('L', 0);
|
||||
c->aux = (void*)fd;
|
||||
c->name = newcname("fd");
|
||||
c->mode = ORDWR;
|
||||
c->qid.type = 0;
|
||||
c->qid.path = 0;
|
||||
c->qid.vers = 0;
|
||||
c->dev = 0;
|
||||
c->offset = 0;
|
||||
return c;
|
||||
}
|
||||
|
||||
int
|
||||
lfdfd(int fd)
|
||||
{
|
||||
return newfd(lfdchan(fd));
|
||||
}
|
||||
|
||||
static Chan*
|
||||
lfdattach(char *x)
|
||||
{
|
||||
USED(x);
|
||||
|
||||
error(Egreg);
|
||||
return nil;
|
||||
}
|
||||
|
||||
static Walkqid*
|
||||
lfdwalk(Chan *c, Chan *nc, char **name, int nname)
|
||||
{
|
||||
USED(c);
|
||||
USED(nc);
|
||||
USED(name);
|
||||
USED(nname);
|
||||
|
||||
error(Egreg);
|
||||
return nil;
|
||||
}
|
||||
|
||||
static int
|
||||
lfdstat(Chan *c, uchar *dp, int n)
|
||||
{
|
||||
USED(c);
|
||||
USED(dp);
|
||||
USED(n);
|
||||
error(Egreg);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static Chan*
|
||||
lfdopen(Chan *c, int omode)
|
||||
{
|
||||
USED(c);
|
||||
USED(omode);
|
||||
|
||||
error(Egreg);
|
||||
return nil;
|
||||
}
|
||||
|
||||
static void
|
||||
lfdclose(Chan *c)
|
||||
{
|
||||
close((int)c->aux);
|
||||
}
|
||||
|
||||
static long
|
||||
lfdread(Chan *c, void *buf, long n, vlong off)
|
||||
{
|
||||
USED(off); /* can't pread on pipes */
|
||||
n = read((int)c->aux, buf, n);
|
||||
if(n < 0){
|
||||
iprint("error %d\n", errno);
|
||||
oserror();
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
static long
|
||||
lfdwrite(Chan *c, void *buf, long n, vlong off)
|
||||
{
|
||||
USED(off); /* can't pread on pipes */
|
||||
|
||||
n = write((int)c->aux, buf, n);
|
||||
if(n < 0){
|
||||
iprint("error %d\n", errno);
|
||||
oserror();
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
Dev lfddevtab = {
|
||||
'L',
|
||||
"lfd",
|
||||
|
||||
devreset,
|
||||
devinit,
|
||||
devshutdown,
|
||||
lfdattach,
|
||||
lfdwalk,
|
||||
lfdstat,
|
||||
lfdopen,
|
||||
devcreate,
|
||||
lfdclose,
|
||||
lfdread,
|
||||
devbread,
|
||||
lfdwrite,
|
||||
devbwrite,
|
||||
devremove,
|
||||
devwstat,
|
||||
};
|
Reference in New Issue
Block a user