Add real factotum.
This commit is contained in:
@ -13,6 +13,7 @@ OFILES=\
|
||||
devfs-$(OS).$O\
|
||||
devip.$O\
|
||||
devip-$(OS).$O\
|
||||
devlfd.$O\
|
||||
devmnt.$O\
|
||||
devmouse.$O\
|
||||
devpipe.$O\
|
||||
|
@ -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
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,
|
||||
};
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user