Add real factotum.

This commit is contained in:
Russ Cox
2005-11-04 15:36:40 +00:00
parent 06b60293ad
commit ab73f2bbf5
26 changed files with 1361 additions and 58 deletions

View File

@ -13,6 +13,7 @@ OFILES=\
devfs-$(OS).$O\
devip.$O\
devip-$(OS).$O\
devlfd.$O\
devmnt.$O\
devmouse.$O\
devpipe.$O\

View File

@ -175,25 +175,6 @@ print(char *fmt, ...)
return n;
}
int
iprint(char *fmt, ...)
{
int n, s;
va_list arg;
char buf[PRINTSIZE];
s = splhi();
va_start(arg, fmt);
n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf;
va_end(arg);
if(screenputs != nil && iprintscreenputs)
screenputs(buf, n);
uartputs(buf, n);
splx(s);
return n;
}
void
panic(char *fmt, ...)
{
@ -1208,3 +1189,23 @@ writebintime(char *buf, int n)
}
int
iprint(char *fmt, ...)
{
int n, s;
va_list arg;
char buf[PRINTSIZE];
s = splhi();
va_start(arg, fmt);
n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf;
va_end(arg);
if(screenputs != nil && iprintscreenputs)
screenputs(buf, n);
#undef write
write(2, buf, n);
splx(s);
return n;
}

126
kern/devlfd.c Normal file
View 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,
};

View File

@ -8,9 +8,12 @@ enum
{
Qdir = 0,
Qboot = 0x1000,
Qmnt = 0x2000,
Qfactotum,
Nrootfiles = 32,
Nbootfiles = 32,
Nmntfiles = 2,
};
typedef struct Dirlist Dirlist;
@ -26,6 +29,7 @@ struct Dirlist
static Dirtab rootdir[Nrootfiles] = {
"#/", {Qdir, 0, QTDIR}, 0, DMDIR|0555,
"boot", {Qboot, 0, QTDIR}, 0, DMDIR|0555,
"mnt", {Qmnt, 0, QTDIR}, 0, DMDIR|0555,
};
static uchar *rootdata[Nrootfiles];
static Dirlist rootlist =
@ -33,7 +37,7 @@ static Dirlist rootlist =
0,
rootdir,
rootdata,
2,
3,
Nrootfiles
};
@ -50,6 +54,19 @@ static Dirlist bootlist =
Nbootfiles
};
static Dirtab mntdir[Nmntfiles] = {
"mnt", {Qmnt, 0, QTDIR}, 0, DMDIR|0555,
"factotum", {Qfactotum, 0, QTDIR}, 0, DMDIR|0555,
};
static Dirlist mntlist =
{
Qmnt,
mntdir,
nil,
2,
Nmntfiles
};
/*
* add a file to the list
*/
@ -97,7 +114,6 @@ rootreset(void)
addrootdir("dev");
addrootdir("env");
addrootdir("fd");
addrootdir("mnt");
addrootdir("net");
addrootdir("net.alt");
addrootdir("proc");
@ -129,6 +145,13 @@ rootgen(Chan *c, char *name, Dirtab *dirt, int ndirt, int s, Dir *dp)
return 1;
}
return devgen(c, name, rootlist.dir, rootlist.ndir, s, dp);
case Qmnt:
if(s == DEVDOTDOT){
Qid tqiddir = {Qdir, 0, QTDIR};
devdir(c, tqiddir, "#/", 0, eve, 0555, dp);
return 1;
}
return devgen(c, name, mntlist.dir, mntlist.ndir, s, dp);
case Qboot:
if(s == DEVDOTDOT){
Qid tqiddir = {Qdir, 0, QTDIR};
@ -139,22 +162,25 @@ rootgen(Chan *c, char *name, Dirtab *dirt, int ndirt, int s, Dir *dp)
default:
if(s == DEVDOTDOT){
Qid tqiddir = {Qdir, 0, QTDIR};
if((int)c->qid.path < Qboot)
devdir(c, tqiddir, "#/", 0, eve, 0555, dp);
else {
tqiddir.path = Qboot;
devdir(c, tqiddir, "#/", 0, eve, 0555, dp);
}
tqiddir.path = c->qid.path&0xF000;
devdir(c, tqiddir, "#/", 0, eve, 0555, dp);
return 1;
}
if(s != 0)
return -1;
if((int)c->qid.path < Qboot){
switch((int)c->qid.path & 0xF000){
case Qdir:
t = c->qid.path-1;
l = &rootlist;
}else{
break;
case Qboot:
t = c->qid.path - Qboot - 1;
l = &bootlist;
break;
case Qmnt:
t = c->qid.path - Qmnt - 1;
l = &mntlist;
break;
}
if(t >= l->ndir)
return -1;
@ -209,17 +235,19 @@ rootread(Chan *c, void *buf, long n, vlong off)
switch(t){
case Qdir:
case Qboot:
case Qmnt:
return devdirread(c, buf, n, nil, 0, rootgen);
}
if(t<Qboot)
l = &rootlist;
else{
t -= Qboot;
if(t&Qboot)
l = &bootlist;
}
else if(t&Qmnt)
l = &mntlist;
else
l = &bootlist;
t &= 0xFFF;
t--;
if(t >= l->ndir)
error(Egreg);

View File

@ -765,6 +765,7 @@ sslput(Dstate *s, Block * volatile b)
int offset;
if(waserror()){
iprint("error: %s\n", up->errstr);
if(b != nil)
free(b);
nexterror();
@ -1071,8 +1072,9 @@ sslwrite(Chan *c, void *a, long n, vlong o)
nexterror();
}
qlock(&s->out.q);
p = a;
if(0) iprint("write %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n",
n, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
e = p + n;
do {
m = e - p;
@ -1092,7 +1094,9 @@ sslwrite(Chan *c, void *a, long n, vlong o)
p += m;
} while(p < e);
p = a;
if(0) iprint("wrote %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n",
n, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
poperror();
qunlock(&s->out.q);
return n;

View File

@ -12,6 +12,8 @@ extern Dev mousedevtab;
extern Dev drawdevtab;
extern Dev ipdevtab;
extern Dev fsdevtab;
extern Dev mntdevtab;
extern Dev lfddevtab;
Dev *devtab[] = {
&rootdevtab,
@ -22,6 +24,8 @@ Dev *devtab[] = {
&drawdevtab,
&ipdevtab,
&fsdevtab,
&mntdevtab,
&lfddevtab,
0
};