cwfs: remove 9p1 support
This commit is contained in:
parent
501774b096
commit
0ce50ebc57
15 changed files with 318 additions and 2502 deletions
|
@ -25,7 +25,6 @@ localconfinit(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
int (*fsprotocol[])(Msgbuf*) = {
|
int (*fsprotocol[])(Msgbuf*) = {
|
||||||
serve9p1,
|
|
||||||
serve9p2,
|
serve9p2,
|
||||||
nil,
|
nil,
|
||||||
};
|
};
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,116 +0,0 @@
|
||||||
#include <authsrv.h>
|
|
||||||
|
|
||||||
enum {
|
|
||||||
DIRREC = 116, /* size of a directory ascii record */
|
|
||||||
ERRREC = 64, /* size of a error record */
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct Fcall Fcall;
|
|
||||||
|
|
||||||
struct Fcall
|
|
||||||
{
|
|
||||||
char type;
|
|
||||||
ushort fid;
|
|
||||||
short err;
|
|
||||||
short tag;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
short uid; /* T-Userstr [obs.] */
|
|
||||||
short oldtag; /* T-nFlush */
|
|
||||||
Qid9p1 qid; /* R-Attach, R-Clwalk, R-Walk,
|
|
||||||
* R-Open, R-Create */
|
|
||||||
char rauth[AUTHENTLEN]; /* R-attach */
|
|
||||||
};
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
char uname[NAMELEN]; /* T-nAttach */
|
|
||||||
char aname[NAMELEN]; /* T-nAttach */
|
|
||||||
char ticket[TICKETLEN]; /* T-attach */
|
|
||||||
char auth[AUTHENTLEN]; /* T-attach */
|
|
||||||
};
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
char ename[ERRREC]; /* R-nError */
|
|
||||||
char chal[CHALLEN]; /* T-session, R-session */
|
|
||||||
char authid[NAMELEN]; /* R-session */
|
|
||||||
char authdom[DOMLEN]; /* R-session */
|
|
||||||
};
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
char name[NAMELEN]; /* T-Walk, T-Clwalk, T-Create, T-Remove */
|
|
||||||
long perm; /* T-Create */
|
|
||||||
ushort newfid; /* T-Clone, T-Clwalk */
|
|
||||||
char mode; /* T-Create, T-Open */
|
|
||||||
};
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
Off offset; /* T-Read, T-Write */
|
|
||||||
long count; /* T-Read, T-Write, R-Read */
|
|
||||||
char* data; /* T-Write, R-Read */
|
|
||||||
};
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
char stat[DIRREC]; /* T-Wstat, R-Stat */
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* P9 protocol message types
|
|
||||||
*/
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
Tnop = 50,
|
|
||||||
Rnop,
|
|
||||||
Tosession = 52,
|
|
||||||
Rosession,
|
|
||||||
Terror = 54, /* illegal */
|
|
||||||
Rerror,
|
|
||||||
Tflush = 56,
|
|
||||||
Rflush,
|
|
||||||
Toattach = 58,
|
|
||||||
Roattach,
|
|
||||||
Tclone = 60,
|
|
||||||
Rclone,
|
|
||||||
Twalk = 62,
|
|
||||||
Rwalk,
|
|
||||||
Topen = 64,
|
|
||||||
Ropen,
|
|
||||||
Tcreate = 66,
|
|
||||||
Rcreate,
|
|
||||||
Tread = 68,
|
|
||||||
Rread,
|
|
||||||
Twrite = 70,
|
|
||||||
Rwrite,
|
|
||||||
Tclunk = 72,
|
|
||||||
Rclunk,
|
|
||||||
Tremove = 74,
|
|
||||||
Rremove,
|
|
||||||
Tstat = 76,
|
|
||||||
Rstat,
|
|
||||||
Twstat = 78,
|
|
||||||
Rwstat,
|
|
||||||
Tclwalk = 80,
|
|
||||||
Rclwalk,
|
|
||||||
Tauth = 82, /* illegal */
|
|
||||||
Rauth, /* illegal */
|
|
||||||
Tsession = 84,
|
|
||||||
Rsession,
|
|
||||||
Tattach = 86,
|
|
||||||
Rattach,
|
|
||||||
|
|
||||||
MAXSYSCALL
|
|
||||||
};
|
|
||||||
|
|
||||||
int convA2M9p1(Authenticator*, char*, char*);
|
|
||||||
void convM2A9p1(char*, Authenticator*, char*);
|
|
||||||
void convM2T9p1(char*, Ticket*, char*);
|
|
||||||
int convD2M9p1(Dentry*, char*);
|
|
||||||
int convM2D9p1(char*, Dentry*);
|
|
||||||
int convM2S9p1(uchar*, Fcall*, int);
|
|
||||||
int convS2M9p1(Fcall*, uchar*);
|
|
||||||
void fcall9p1(Chan*, Fcall*, Fcall*);
|
|
||||||
|
|
||||||
void (*call9p1[MAXSYSCALL])(Chan*, Fcall*, Fcall*);
|
|
|
@ -1,523 +0,0 @@
|
||||||
#include "all.h"
|
|
||||||
|
|
||||||
/* BUG transition */
|
|
||||||
// int client9p = 2;
|
|
||||||
// int kernel9p = 2;
|
|
||||||
|
|
||||||
#include "9p1.h"
|
|
||||||
|
|
||||||
#define CHAR(x) *p++ = f->x
|
|
||||||
#define SHORT(x) { ulong vvv = f->x; *p++ = vvv; *p++ = vvv>>8; }
|
|
||||||
#define LONGINT(q) {*p++ = (q); *p++ = (q)>>8; *p++ = (q)>>16; *p++ = (q)>>24;}
|
|
||||||
#define LONG(x) { ulong vvv = f->x; LONGINT(vvv); }
|
|
||||||
#define VLONG(x) { \
|
|
||||||
uvlong q = f->x; \
|
|
||||||
*p++ = (q)>> 0; *p++ = (q)>> 8; *p++ = (q)>>16; *p++ = (q)>>24; \
|
|
||||||
*p++ = (q)>>32; *p++ = (q)>>40; *p++ = (q)>>48; *p++ = (q)>>56; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define BYTES(x,n) memmove(p, f->x, n); p += n
|
|
||||||
#define STRING(x,n) strncpy((char*)p, f->x, n); p += n
|
|
||||||
|
|
||||||
int
|
|
||||||
convS2M9p1(Fcall *f, uchar *ap)
|
|
||||||
{
|
|
||||||
uchar *p;
|
|
||||||
int t;
|
|
||||||
|
|
||||||
p = ap;
|
|
||||||
CHAR(type);
|
|
||||||
t = f->type;
|
|
||||||
SHORT(tag);
|
|
||||||
switch(t) {
|
|
||||||
default:
|
|
||||||
fprint(2, "convS2M9p1: bad type: %d\n", t);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case Tnop:
|
|
||||||
case Tosession:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tsession:
|
|
||||||
BYTES(chal, sizeof(f->chal));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tflush:
|
|
||||||
SHORT(oldtag);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tattach:
|
|
||||||
SHORT(fid);
|
|
||||||
STRING(uname, sizeof(f->uname));
|
|
||||||
STRING(aname, sizeof(f->aname));
|
|
||||||
BYTES(ticket, sizeof(f->ticket));
|
|
||||||
BYTES(auth, sizeof(f->auth));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Toattach:
|
|
||||||
SHORT(fid);
|
|
||||||
STRING(uname, sizeof(f->uname));
|
|
||||||
STRING(aname, sizeof(f->aname));
|
|
||||||
BYTES(ticket, NAMELEN);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tclone:
|
|
||||||
SHORT(fid);
|
|
||||||
SHORT(newfid);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Twalk:
|
|
||||||
SHORT(fid);
|
|
||||||
STRING(name, sizeof(f->name));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tclwalk:
|
|
||||||
SHORT(fid);
|
|
||||||
SHORT(newfid);
|
|
||||||
STRING(name, sizeof(f->name));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Topen:
|
|
||||||
SHORT(fid);
|
|
||||||
CHAR(mode);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tcreate:
|
|
||||||
SHORT(fid);
|
|
||||||
STRING(name, sizeof(f->name));
|
|
||||||
LONG(perm);
|
|
||||||
CHAR(mode);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tread:
|
|
||||||
SHORT(fid);
|
|
||||||
VLONG(offset);
|
|
||||||
SHORT(count);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Twrite:
|
|
||||||
SHORT(fid);
|
|
||||||
VLONG(offset);
|
|
||||||
SHORT(count);
|
|
||||||
p++;
|
|
||||||
if((uchar*)p == (uchar*)f->data) {
|
|
||||||
p += f->count;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
BYTES(data, f->count);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tclunk:
|
|
||||||
case Tremove:
|
|
||||||
case Tstat:
|
|
||||||
SHORT(fid);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Twstat:
|
|
||||||
SHORT(fid);
|
|
||||||
BYTES(stat, sizeof(f->stat));
|
|
||||||
break;
|
|
||||||
/*
|
|
||||||
*/
|
|
||||||
case Rnop:
|
|
||||||
case Rosession:
|
|
||||||
case Rflush:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rsession:
|
|
||||||
BYTES(chal, sizeof(f->chal));
|
|
||||||
BYTES(authid, sizeof(f->authid));
|
|
||||||
BYTES(authdom, sizeof(f->authdom));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rerror:
|
|
||||||
STRING(ename, sizeof(f->ename));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rclone:
|
|
||||||
case Rclunk:
|
|
||||||
case Rremove:
|
|
||||||
case Rwstat:
|
|
||||||
SHORT(fid);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rwalk:
|
|
||||||
case Ropen:
|
|
||||||
case Rcreate:
|
|
||||||
case Rclwalk:
|
|
||||||
SHORT(fid);
|
|
||||||
LONG(qid.path);
|
|
||||||
LONG(qid.version);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rattach:
|
|
||||||
SHORT(fid);
|
|
||||||
LONG(qid.path);
|
|
||||||
LONG(qid.version);
|
|
||||||
BYTES(rauth, sizeof(f->rauth));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Roattach:
|
|
||||||
SHORT(fid);
|
|
||||||
LONG(qid.path);
|
|
||||||
LONG(qid.version);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rread:
|
|
||||||
SHORT(fid);
|
|
||||||
SHORT(count);
|
|
||||||
p++;
|
|
||||||
if((uchar*)p == (uchar*)f->data) {
|
|
||||||
p += f->count;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
BYTES(data, f->count);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rwrite:
|
|
||||||
SHORT(fid);
|
|
||||||
SHORT(count);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rstat:
|
|
||||||
SHORT(fid);
|
|
||||||
BYTES(stat, sizeof(f->stat));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return p - (uchar*)ap;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* buggery to give false qid for
|
|
||||||
* the top 2 levels of the dump fs
|
|
||||||
*/
|
|
||||||
static ulong
|
|
||||||
fakeqid9p1(Dentry *f)
|
|
||||||
{
|
|
||||||
ulong q;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
q = f->qid.path;
|
|
||||||
if(q == (QPROOT|QPDIR)) {
|
|
||||||
c = f->name[0];
|
|
||||||
if(isascii(c) && isdigit(c)) {
|
|
||||||
q = 3|QPDIR;
|
|
||||||
c = (c-'0')*10 + (f->name[1]-'0');
|
|
||||||
if(c >= 1 && c <= 12)
|
|
||||||
q = 4|QPDIR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return q;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
convD2M9p1(Dentry *f, char *ap)
|
|
||||||
{
|
|
||||||
uchar *p;
|
|
||||||
ulong q;
|
|
||||||
|
|
||||||
p = (uchar*)ap;
|
|
||||||
STRING(name, sizeof(f->name));
|
|
||||||
|
|
||||||
memset(p, 0, 2*NAMELEN);
|
|
||||||
uidtostr((char*)p, f->uid, 1);
|
|
||||||
p += NAMELEN;
|
|
||||||
|
|
||||||
uidtostr((char*)p, f->gid, 1);
|
|
||||||
p += NAMELEN;
|
|
||||||
|
|
||||||
q = fakeqid9p1(f);
|
|
||||||
LONGINT(q);
|
|
||||||
LONG(qid.version);
|
|
||||||
|
|
||||||
q = f->mode & 0x0fff;
|
|
||||||
if(f->mode & DDIR)
|
|
||||||
q |= PDIR;
|
|
||||||
if(f->mode & DAPND)
|
|
||||||
q |= PAPND;
|
|
||||||
if(f->mode & DLOCK)
|
|
||||||
q |= PLOCK;
|
|
||||||
LONGINT(q);
|
|
||||||
|
|
||||||
LONG(atime);
|
|
||||||
LONG(mtime);
|
|
||||||
VLONG(size);
|
|
||||||
LONGINT(0);
|
|
||||||
return p - (uchar*)ap;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
convA2M9p1(Authenticator *f, char *ap, char *key)
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
uchar *p;
|
|
||||||
|
|
||||||
p = (uchar*)ap;
|
|
||||||
CHAR(num);
|
|
||||||
BYTES(chal, CHALLEN);
|
|
||||||
LONG(id);
|
|
||||||
n = p - (uchar*)ap;
|
|
||||||
if(key)
|
|
||||||
encrypt(key, ap, n);
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef CHAR
|
|
||||||
#undef SHORT
|
|
||||||
#undef LONG
|
|
||||||
#undef LONGINT
|
|
||||||
#undef VLONG
|
|
||||||
#undef BYTES
|
|
||||||
#undef STRING
|
|
||||||
|
|
||||||
#define CHAR(x) f->x = *p++
|
|
||||||
#define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2
|
|
||||||
#define LONG(x) f->x = p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24); p += 4
|
|
||||||
#define VLONG(x) { \
|
|
||||||
f->x = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)) | \
|
|
||||||
(uvlong)(p[4] | (p[5]<<8) | (p[6]<<16) | (p[7]<<24)) << 32; \
|
|
||||||
p += 8; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define BYTES(x,n) memmove(f->x, p, n); p += n
|
|
||||||
#define STRING(x,n) memmove(f->x, p, n); p += n
|
|
||||||
|
|
||||||
int
|
|
||||||
convM2S9p1(uchar *ap, Fcall *f, int n)
|
|
||||||
{
|
|
||||||
uchar *p;
|
|
||||||
int t;
|
|
||||||
|
|
||||||
p = ap;
|
|
||||||
CHAR(type);
|
|
||||||
t = f->type;
|
|
||||||
SHORT(tag);
|
|
||||||
switch(t) {
|
|
||||||
default:
|
|
||||||
/*
|
|
||||||
* only whine if it couldn't be a 9P2000 Tversion.
|
|
||||||
*/
|
|
||||||
if(t != 19 || ap[4] != 100)
|
|
||||||
fprint(2, "convM2S9p1: bad type: %d\n", f->type);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case Tnop:
|
|
||||||
case Tosession:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tsession:
|
|
||||||
BYTES(chal, sizeof(f->chal));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tflush:
|
|
||||||
SHORT(oldtag);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tattach:
|
|
||||||
SHORT(fid);
|
|
||||||
BYTES(uname, sizeof(f->uname));
|
|
||||||
BYTES(aname, sizeof(f->aname));
|
|
||||||
BYTES(ticket, sizeof(f->ticket));
|
|
||||||
BYTES(auth, sizeof(f->auth));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Toattach:
|
|
||||||
SHORT(fid);
|
|
||||||
BYTES(uname, sizeof(f->uname));
|
|
||||||
BYTES(aname, sizeof(f->aname));
|
|
||||||
BYTES(ticket, NAMELEN);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tclone:
|
|
||||||
SHORT(fid);
|
|
||||||
SHORT(newfid);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Twalk:
|
|
||||||
SHORT(fid);
|
|
||||||
BYTES(name, sizeof(f->name));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tclwalk:
|
|
||||||
SHORT(fid);
|
|
||||||
SHORT(newfid);
|
|
||||||
BYTES(name, sizeof(f->name));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tremove:
|
|
||||||
SHORT(fid);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Topen:
|
|
||||||
SHORT(fid);
|
|
||||||
CHAR(mode);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tcreate:
|
|
||||||
SHORT(fid);
|
|
||||||
BYTES(name, sizeof(f->name));
|
|
||||||
LONG(perm);
|
|
||||||
CHAR(mode);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tread:
|
|
||||||
SHORT(fid);
|
|
||||||
VLONG(offset);
|
|
||||||
SHORT(count);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Twrite:
|
|
||||||
SHORT(fid);
|
|
||||||
VLONG(offset);
|
|
||||||
SHORT(count);
|
|
||||||
p++;
|
|
||||||
f->data = (char*)p; p += f->count;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Tclunk:
|
|
||||||
case Tstat:
|
|
||||||
SHORT(fid);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Twstat:
|
|
||||||
SHORT(fid);
|
|
||||||
BYTES(stat, sizeof(f->stat));
|
|
||||||
break;
|
|
||||||
|
|
||||||
/*
|
|
||||||
*/
|
|
||||||
case Rnop:
|
|
||||||
case Rosession:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rsession:
|
|
||||||
BYTES(chal, sizeof(f->chal));
|
|
||||||
BYTES(authid, sizeof(f->authid));
|
|
||||||
BYTES(authdom, sizeof(f->authdom));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rerror:
|
|
||||||
BYTES(ename, sizeof(f->ename));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rflush:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rclone:
|
|
||||||
case Rclunk:
|
|
||||||
case Rremove:
|
|
||||||
case Rwstat:
|
|
||||||
SHORT(fid);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rwalk:
|
|
||||||
case Rclwalk:
|
|
||||||
case Ropen:
|
|
||||||
case Rcreate:
|
|
||||||
SHORT(fid);
|
|
||||||
LONG(qid.path);
|
|
||||||
LONG(qid.version);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rattach:
|
|
||||||
SHORT(fid);
|
|
||||||
LONG(qid.path);
|
|
||||||
LONG(qid.version);
|
|
||||||
BYTES(rauth, sizeof(f->rauth));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Roattach:
|
|
||||||
SHORT(fid);
|
|
||||||
LONG(qid.path);
|
|
||||||
LONG(qid.version);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rread:
|
|
||||||
SHORT(fid);
|
|
||||||
SHORT(count);
|
|
||||||
p++;
|
|
||||||
f->data = (char*)p; p += f->count;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rwrite:
|
|
||||||
SHORT(fid);
|
|
||||||
SHORT(count);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Rstat:
|
|
||||||
SHORT(fid);
|
|
||||||
BYTES(stat, sizeof(f->stat));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if((uchar*)ap+n == p)
|
|
||||||
return n;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
convM2D9p1(char *ap, Dentry *f)
|
|
||||||
{
|
|
||||||
uchar *p;
|
|
||||||
char str[NAMELEN];
|
|
||||||
|
|
||||||
p = (uchar*)ap;
|
|
||||||
BYTES(name, sizeof(f->name));
|
|
||||||
|
|
||||||
memmove(str, p, NAMELEN);
|
|
||||||
p += NAMELEN;
|
|
||||||
f->uid = strtouid(str);
|
|
||||||
|
|
||||||
memmove(str, p, NAMELEN);
|
|
||||||
p += NAMELEN;
|
|
||||||
f->gid = strtouid(str);
|
|
||||||
|
|
||||||
LONG(qid.path);
|
|
||||||
LONG(qid.version);
|
|
||||||
|
|
||||||
LONG(atime);
|
|
||||||
f->mode = (f->atime & 0x0fff) | DALLOC;
|
|
||||||
if(f->atime & PDIR)
|
|
||||||
f->mode |= DDIR;
|
|
||||||
if(f->atime & PAPND)
|
|
||||||
f->mode |= DAPND;
|
|
||||||
if(f->atime & PLOCK)
|
|
||||||
f->mode |= DLOCK;
|
|
||||||
|
|
||||||
LONG(atime);
|
|
||||||
LONG(mtime);
|
|
||||||
VLONG(size);
|
|
||||||
p += 4;
|
|
||||||
return p - (uchar*)ap;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
convM2A9p1(char *ap, Authenticator *f, char *key)
|
|
||||||
{
|
|
||||||
uchar *p;
|
|
||||||
|
|
||||||
if(key)
|
|
||||||
decrypt(key, ap, AUTHENTLEN);
|
|
||||||
p = (uchar*)ap;
|
|
||||||
CHAR(num);
|
|
||||||
BYTES(chal, CHALLEN);
|
|
||||||
LONG(id);
|
|
||||||
USED(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
convM2T9p1(char *ap, Ticket *f, char *key)
|
|
||||||
{
|
|
||||||
uchar *p;
|
|
||||||
|
|
||||||
if(key)
|
|
||||||
decrypt(key, ap, TICKETLEN);
|
|
||||||
p = (uchar*)ap;
|
|
||||||
CHAR(num);
|
|
||||||
BYTES(chal, CHALLEN);
|
|
||||||
STRING(cuid, NAMELEN);
|
|
||||||
f->cuid[NAMELEN-1] = 0;
|
|
||||||
STRING(suid, NAMELEN);
|
|
||||||
f->suid[NAMELEN-1] = 0;
|
|
||||||
BYTES(key, DESKEYLEN);
|
|
||||||
USED(p);
|
|
||||||
}
|
|
|
@ -110,7 +110,44 @@ mkdir9p2(Dir* dir, Dentry* dentry, void* strs)
|
||||||
return p-op;
|
return p-op;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
/*
|
||||||
|
* buggery to give false qid for
|
||||||
|
* the top 2 levels of the dump fs
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
mkqid(Qid* qid, Dentry *d, int buggery)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
if(buggery && d->qid.path == (QPDIR|QPROOT)){
|
||||||
|
c = d->name[0];
|
||||||
|
if(isascii(c) && isdigit(c)){
|
||||||
|
qid->path = 3;
|
||||||
|
qid->vers = d->qid.version;
|
||||||
|
qid->type = QTDIR;
|
||||||
|
|
||||||
|
c = (c-'0')*10 + (d->name[1]-'0');
|
||||||
|
if(c >= 1 && c <= 12)
|
||||||
|
qid->path = 4;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mkqid9p2(qid, &d->qid, d->mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
mkqidcmp(Qid* qid, Dentry *d)
|
||||||
|
{
|
||||||
|
Qid tmp;
|
||||||
|
|
||||||
|
mkqid(&tmp, d, 1);
|
||||||
|
if(qid->path == tmp.path && qid->type == tmp.type)
|
||||||
|
return 0;
|
||||||
|
return Eqid;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
version(Chan* chan, Fcall* f, Fcall* r)
|
version(Chan* chan, Fcall* f, Fcall* r)
|
||||||
{
|
{
|
||||||
if(chan->protocol != nil || f->msize < 256)
|
if(chan->protocol != nil || f->msize < 256)
|
||||||
|
@ -237,7 +274,7 @@ authorize(Chan* chan, Fcall* f)
|
||||||
return uid;
|
return uid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
attach(Chan* chan, Fcall* f, Fcall* r)
|
attach(Chan* chan, Fcall* f, Fcall* r)
|
||||||
{
|
{
|
||||||
char *aname;
|
char *aname;
|
||||||
|
@ -494,7 +531,7 @@ out:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
walk(Chan* chan, Fcall* f, Fcall* r)
|
walk(Chan* chan, Fcall* f, Fcall* r)
|
||||||
{
|
{
|
||||||
int error, nwname;
|
int error, nwname;
|
||||||
|
@ -599,7 +636,7 @@ walk(Chan* chan, Fcall* f, Fcall* r)
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
fs_open(Chan* chan, Fcall* f, Fcall* r)
|
fs_open(Chan* chan, Fcall* f, Fcall* r)
|
||||||
{
|
{
|
||||||
Iobuf *p;
|
Iobuf *p;
|
||||||
|
@ -748,7 +785,7 @@ out:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
fs_create(Chan* chan, Fcall* f, Fcall* r)
|
fs_create(Chan* chan, Fcall* f, Fcall* r)
|
||||||
{
|
{
|
||||||
Iobuf *p, *p1;
|
Iobuf *p, *p1;
|
||||||
|
@ -946,7 +983,7 @@ out:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
fs_read(Chan* chan, Fcall* f, Fcall* r, uchar* data)
|
fs_read(Chan* chan, Fcall* f, Fcall* r, uchar* data)
|
||||||
{
|
{
|
||||||
Iobuf *p, *p1;
|
Iobuf *p, *p1;
|
||||||
|
@ -975,6 +1012,7 @@ fs_read(Chan* chan, Fcall* f, Fcall* r, uchar* data)
|
||||||
}
|
}
|
||||||
iounit = chan->msize-IOHDRSZ;
|
iounit = chan->msize-IOHDRSZ;
|
||||||
if(count < 0 || count > iounit){
|
if(count < 0 || count > iounit){
|
||||||
|
fprint(2, "fs_read %d %d\n", count, iounit);
|
||||||
error = Ecount;
|
error = Ecount;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -1149,7 +1187,7 @@ out:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
fs_write(Chan* chan, Fcall* f, Fcall* r)
|
fs_write(Chan* chan, Fcall* f, Fcall* r)
|
||||||
{
|
{
|
||||||
Iobuf *p, *p1;
|
Iobuf *p, *p1;
|
||||||
|
@ -1263,6 +1301,90 @@ out:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
doremove(File *f)
|
||||||
|
{
|
||||||
|
Iobuf *p, *p1;
|
||||||
|
Dentry *d, *d1;
|
||||||
|
Off addr;
|
||||||
|
int slot, err;
|
||||||
|
|
||||||
|
p = 0;
|
||||||
|
p1 = 0;
|
||||||
|
if(f->fs->dev->type == Devro) {
|
||||||
|
err = Eronly;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* check on parent directory of file to be deleted
|
||||||
|
*/
|
||||||
|
if(f->wpath == 0 || f->wpath->addr == f->addr) {
|
||||||
|
err = Ephase;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
p1 = getbuf(f->fs->dev, f->wpath->addr, Brd);
|
||||||
|
d1 = getdir(p1, f->wpath->slot);
|
||||||
|
if(!d1 || checktag(p1, Tdir, QPNONE) || !(d1->mode & DALLOC)) {
|
||||||
|
err = Ephase;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if(iaccess(f, d1, DWRITE)) {
|
||||||
|
err = Eaccess;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
accessdir(p1, d1, FWRITE, f->uid);
|
||||||
|
putbuf(p1);
|
||||||
|
p1 = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check on file to be deleted
|
||||||
|
*/
|
||||||
|
p = getbuf(f->fs->dev, f->addr, Brd);
|
||||||
|
d = getdir(p, f->slot);
|
||||||
|
if(!d || checktag(p, Tdir, QPNONE) || !(d->mode & DALLOC)) {
|
||||||
|
err = Ealloc;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if(err = mkqidcmp(&f->qid, d))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if deleting a directory, make sure it is empty
|
||||||
|
*/
|
||||||
|
if((d->mode & DDIR))
|
||||||
|
for(addr=0;; addr++) {
|
||||||
|
p1 = dnodebuf(p, d, addr, 0, f->uid);
|
||||||
|
if(!p1)
|
||||||
|
break;
|
||||||
|
if(checktag(p1, Tdir, d->qid.path)) {
|
||||||
|
err = Ephase;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
for(slot=0; slot<DIRPERBUF; slot++) {
|
||||||
|
d1 = getdir(p1, slot);
|
||||||
|
if(!(d1->mode & DALLOC))
|
||||||
|
continue;
|
||||||
|
err = Eempty;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
putbuf(p1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* do it
|
||||||
|
*/
|
||||||
|
dtrunc(p, d, f->uid);
|
||||||
|
memset(d, 0, sizeof(Dentry));
|
||||||
|
settag(p, Tdir, QPNONE);
|
||||||
|
|
||||||
|
out:
|
||||||
|
if(p1)
|
||||||
|
putbuf(p1);
|
||||||
|
if(p)
|
||||||
|
putbuf(p);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_clunk(File* file, int remove)
|
_clunk(File* file, int remove)
|
||||||
{
|
{
|
||||||
|
@ -1299,7 +1421,7 @@ clunk(Chan* chan, Fcall* f, Fcall*)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
fs_remove(Chan* chan, Fcall* f, Fcall*)
|
fs_remove(Chan* chan, Fcall* f, Fcall*)
|
||||||
{
|
{
|
||||||
File *file;
|
File *file;
|
||||||
|
@ -1309,7 +1431,7 @@ fs_remove(Chan* chan, Fcall* f, Fcall*)
|
||||||
return _clunk(file, 1);
|
return _clunk(file, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int
|
||||||
fs_stat(Chan* chan, Fcall* f, Fcall* r, uchar* data)
|
fs_stat(Chan* chan, Fcall* f, Fcall* r, uchar* data)
|
||||||
{
|
{
|
||||||
Dir dir;
|
Dir dir;
|
||||||
|
|
|
@ -1,48 +1,13 @@
|
||||||
#include "all.h"
|
#include "all.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include <authsrv.h>
|
|
||||||
#include <auth.h>
|
#include <auth.h>
|
||||||
|
|
||||||
Nvrsafe nvr;
|
|
||||||
|
|
||||||
static int gotnvr; /* flag: nvr contains nvram; it could be bad */
|
|
||||||
|
|
||||||
char*
|
char*
|
||||||
nvrgetconfig(void)
|
nvrgetconfig(void)
|
||||||
{
|
{
|
||||||
return conf.confdev;
|
return conf.confdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* we shouldn't be writing nvram any more.
|
|
||||||
* the secstore/config field is now just secstore key.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
nvrcheck(void)
|
|
||||||
{
|
|
||||||
uchar csum;
|
|
||||||
|
|
||||||
if (readnvram(&nvr, NVread) < 0) {
|
|
||||||
fprint(2, "nvrcheck: can't read nvram\n");
|
|
||||||
return 1;
|
|
||||||
} else
|
|
||||||
gotnvr = 1;
|
|
||||||
|
|
||||||
if(chatty)
|
|
||||||
print("nvr read\n");
|
|
||||||
|
|
||||||
csum = nvcsum(nvr.machkey, sizeof nvr.machkey);
|
|
||||||
if(csum != nvr.machsum) {
|
|
||||||
fprint(2, "\n\n ** NVR key checksum is incorrect **\n");
|
|
||||||
fprint(2, " ** set password to allow attaches **\n\n");
|
|
||||||
memset(nvr.machkey, 0, sizeof nvr.machkey);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
nvrsetconfig(char* word)
|
nvrsetconfig(char* word)
|
||||||
{
|
{
|
||||||
|
@ -51,39 +16,6 @@ nvrsetconfig(char* word)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
conslock(void)
|
|
||||||
{
|
|
||||||
char *ln;
|
|
||||||
Authkey nkey1;
|
|
||||||
static char zeroes[DESKEYLEN];
|
|
||||||
|
|
||||||
if(memcmp(nvr.machkey, zeroes, DESKEYLEN) == 0) {
|
|
||||||
print("no password set\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(;;) {
|
|
||||||
print("%s password:", service);
|
|
||||||
/* could turn off echo here */
|
|
||||||
|
|
||||||
if ((ln = Brdline(&bin, '\n')) == nil)
|
|
||||||
return 0;
|
|
||||||
ln[Blinelen(&bin)-1] = '\0';
|
|
||||||
|
|
||||||
/* could turn on echo here */
|
|
||||||
passtokey(&nkey1, ln);
|
|
||||||
if(memcmp(nkey1.des, nvr.machkey, DESKEYLEN) == 0) {
|
|
||||||
prdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
print("Bad password\n");
|
|
||||||
delay(1000);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *keyspec = "proto=p9any role=server";
|
static char *keyspec = "proto=p9any role=server";
|
||||||
|
|
||||||
void*
|
void*
|
||||||
|
|
|
@ -25,7 +25,6 @@ localconfinit(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
int (*fsprotocol[])(Msgbuf*) = {
|
int (*fsprotocol[])(Msgbuf*) = {
|
||||||
serve9p1,
|
|
||||||
serve9p2,
|
serve9p2,
|
||||||
nil,
|
nil,
|
||||||
};
|
};
|
||||||
|
|
|
@ -965,7 +965,6 @@ arginit(void)
|
||||||
char word[Maxword+1], *cp;
|
char word[Maxword+1], *cp;
|
||||||
Filsys *fs;
|
Filsys *fs;
|
||||||
|
|
||||||
nvrcheck();
|
|
||||||
if(!setconfig(conf.confdev) && !conf.configfirst)
|
if(!setconfig(conf.confdev) && !conf.configfirst)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -1,147 +1,208 @@
|
||||||
#include "all.h"
|
#include "all.h"
|
||||||
#include "9p1.h"
|
#include <fcall.h>
|
||||||
|
|
||||||
void
|
/* 9p2 */
|
||||||
fcall9p1(Chan *cp, Fcall *in, Fcall *ou)
|
int version(Chan*, Fcall*, Fcall*);
|
||||||
{
|
int attach(Chan*, Fcall*, Fcall*);
|
||||||
int t;
|
int walk(Chan*, Fcall*, Fcall*);
|
||||||
|
int fs_open(Chan*, Fcall*, Fcall*);
|
||||||
rlock(&mainlock);
|
int fs_create(Chan*, Fcall*, Fcall*);
|
||||||
t = in->type;
|
int fs_read(Chan*, Fcall*, Fcall*, uchar*);
|
||||||
if(t < 0 || t >= MAXSYSCALL || (t&1) || !call9p1[t]) {
|
int fs_write(Chan*, Fcall*, Fcall*);
|
||||||
fprint(2, "bad message type %d\n", t);
|
int fs_remove(Chan*, Fcall*, Fcall*);
|
||||||
panic("");
|
|
||||||
}
|
|
||||||
ou->type = t+1;
|
|
||||||
ou->err = 0;
|
|
||||||
|
|
||||||
rlock(&cp->reflock);
|
|
||||||
(*call9p1[t])(cp, in, ou);
|
|
||||||
runlock(&cp->reflock);
|
|
||||||
|
|
||||||
if(ou->err && CHAT(cp))
|
|
||||||
fprint(2, "\terror: %s\n", errstr9p[ou->err]);
|
|
||||||
runlock(&mainlock);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
con_session(void)
|
con_session(void)
|
||||||
{
|
{
|
||||||
Fcall in, ou;
|
Fcall in, ou;
|
||||||
|
int err;
|
||||||
|
|
||||||
in.type = Tsession;
|
memset(&in, 0, sizeof(in));
|
||||||
fcall9p1(cons.chan, &in, &ou);
|
memset(&ou, 0, sizeof(ou));
|
||||||
return ou.err;
|
|
||||||
|
in.type = Tversion;
|
||||||
|
in.version = VERSION9P;
|
||||||
|
in.msize = MAXDAT + IOHDRSZ;
|
||||||
|
|
||||||
|
rlock(&mainlock);
|
||||||
|
err = version(cons.chan, &in, &ou);
|
||||||
|
runlock(&mainlock);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
con_attach(int fid, char *uid, char *arg)
|
con_attach(int fid, char *uid, char *arg)
|
||||||
{
|
{
|
||||||
Fcall in, ou;
|
Fcall in, ou;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
memset(&in, 0, sizeof(in));
|
||||||
|
memset(&ou, 0, sizeof(ou));
|
||||||
|
|
||||||
in.type = Tattach;
|
in.type = Tattach;
|
||||||
in.fid = fid;
|
in.fid = fid;
|
||||||
strncpy(in.uname, uid, NAMELEN);
|
in.uname = uid;
|
||||||
strncpy(in.aname, arg, NAMELEN);
|
in.aname = arg;
|
||||||
fcall9p1(cons.chan, &in, &ou);
|
|
||||||
return ou.err;
|
rlock(&mainlock);
|
||||||
|
err = attach(cons.chan, &in, &ou);
|
||||||
|
runlock(&mainlock);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
con_clone(int fid1, int fid2)
|
con_clone(int fid1, int fid2)
|
||||||
{
|
{
|
||||||
Fcall in, ou;
|
Fcall in, ou;
|
||||||
|
int err;
|
||||||
|
|
||||||
in.type = Tclone;
|
memset(&in, 0, sizeof(in));
|
||||||
|
memset(&ou, 0, sizeof(ou));
|
||||||
|
|
||||||
|
in.type = Twalk;
|
||||||
in.fid = fid1;
|
in.fid = fid1;
|
||||||
in.newfid = fid2;
|
in.newfid = fid2;
|
||||||
fcall9p1(cons.chan, &in, &ou);
|
in.nwname = 0;
|
||||||
return ou.err;
|
|
||||||
|
rlock(&mainlock);
|
||||||
|
err = walk(cons.chan, &in, &ou);
|
||||||
|
runlock(&mainlock);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
con_walk(int fid, char *name)
|
con_walk(int fid, char *name)
|
||||||
{
|
{
|
||||||
Fcall in, ou;
|
Fcall in, ou;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
memset(&in, 0, sizeof(in));
|
||||||
|
memset(&ou, 0, sizeof(ou));
|
||||||
|
|
||||||
in.type = Twalk;
|
in.type = Twalk;
|
||||||
in.fid = fid;
|
in.fid = fid;
|
||||||
strncpy(in.name, name, NAMELEN);
|
in.newfid = fid;
|
||||||
fcall9p1(cons.chan, &in, &ou);
|
in.wname[0] = name;
|
||||||
return ou.err;
|
in.nwname = 1;
|
||||||
|
|
||||||
|
rlock(&mainlock);
|
||||||
|
err = walk(cons.chan, &in, &ou);
|
||||||
|
runlock(&mainlock);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
con_open(int fid, int mode)
|
con_open(int fid, int mode)
|
||||||
{
|
{
|
||||||
Fcall in, ou;
|
Fcall in, ou;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
memset(&in, 0, sizeof(in));
|
||||||
|
memset(&ou, 0, sizeof(ou));
|
||||||
|
|
||||||
in.type = Topen;
|
in.type = Topen;
|
||||||
in.fid = fid;
|
in.fid = fid;
|
||||||
in.mode = mode;
|
in.mode = mode;
|
||||||
fcall9p1(cons.chan, &in, &ou);
|
|
||||||
return ou.err;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
rlock(&mainlock);
|
||||||
con_read(int fid, char *data, Off offset, int count)
|
err = fs_open(cons.chan, &in, &ou);
|
||||||
{
|
runlock(&mainlock);
|
||||||
Fcall in, ou;
|
|
||||||
|
|
||||||
in.type = Tread;
|
return err;
|
||||||
in.fid = fid;
|
|
||||||
in.offset = offset;
|
|
||||||
in.count = count;
|
|
||||||
ou.data = data;
|
|
||||||
fcall9p1(cons.chan, &in, &ou);
|
|
||||||
if(ou.err)
|
|
||||||
return 0;
|
|
||||||
return ou.count;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
con_write(int fid, char *data, Off offset, int count)
|
|
||||||
{
|
|
||||||
Fcall in, ou;
|
|
||||||
|
|
||||||
in.type = Twrite;
|
|
||||||
in.fid = fid;
|
|
||||||
in.data = data;
|
|
||||||
in.offset = offset;
|
|
||||||
in.count = count;
|
|
||||||
fcall9p1(cons.chan, &in, &ou);
|
|
||||||
if(ou.err)
|
|
||||||
return 0;
|
|
||||||
return ou.count;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
con_remove(int fid)
|
|
||||||
{
|
|
||||||
Fcall in, ou;
|
|
||||||
|
|
||||||
in.type = Tremove;
|
|
||||||
in.fid = fid;
|
|
||||||
fcall9p1(cons.chan, &in, &ou);
|
|
||||||
return ou.err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
con_create(int fid, char *name, int uid, int gid, long perm, int mode)
|
con_create(int fid, char *name, int uid, int gid, long perm, int mode)
|
||||||
{
|
{
|
||||||
Fcall in, ou;
|
Fcall in, ou;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
cons.uid = uid; /* beyond ugly */
|
||||||
|
cons.gid = gid;
|
||||||
|
|
||||||
|
memset(&in, 0, sizeof(in));
|
||||||
|
memset(&ou, 0, sizeof(ou));
|
||||||
|
|
||||||
in.type = Tcreate;
|
in.type = Tcreate;
|
||||||
in.fid = fid;
|
in.fid = fid;
|
||||||
strncpy(in.name, name, NAMELEN);
|
|
||||||
in.perm = perm;
|
|
||||||
in.mode = mode;
|
in.mode = mode;
|
||||||
cons.uid = uid; /* beyond ugly */
|
in.perm = perm;
|
||||||
cons.gid = gid;
|
in.name = name;
|
||||||
fcall9p1(cons.chan, &in, &ou);
|
|
||||||
return ou.err;
|
rlock(&mainlock);
|
||||||
|
err = fs_create(cons.chan, &in, &ou);
|
||||||
|
runlock(&mainlock);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
con_read(int fid, char *data, Off offset, int count)
|
||||||
|
{
|
||||||
|
Fcall in, ou;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
memset(&in, 0, sizeof(in));
|
||||||
|
memset(&ou, 0, sizeof(ou));
|
||||||
|
|
||||||
|
in.type = Tread;
|
||||||
|
in.fid = fid;
|
||||||
|
in.offset = offset;
|
||||||
|
in.count = count;
|
||||||
|
|
||||||
|
rlock(&mainlock);
|
||||||
|
err = fs_read(cons.chan, &in, &ou, (uchar*)data);
|
||||||
|
runlock(&mainlock);
|
||||||
|
|
||||||
|
return err ? 0 : ou.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
con_write(int fid, char *data, Off offset, int count)
|
||||||
|
{
|
||||||
|
Fcall in, ou;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
memset(&in, 0, sizeof(in));
|
||||||
|
memset(&ou, 0, sizeof(ou));
|
||||||
|
|
||||||
|
in.type = Twrite;
|
||||||
|
in.fid = fid;
|
||||||
|
in.offset = offset;
|
||||||
|
in.count = count;
|
||||||
|
in.data = data;
|
||||||
|
|
||||||
|
rlock(&mainlock);
|
||||||
|
err = fs_write(cons.chan, &in, &ou);
|
||||||
|
runlock(&mainlock);
|
||||||
|
|
||||||
|
return err ? 0 : ou.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
con_remove(int fid)
|
||||||
|
{
|
||||||
|
Fcall in, ou;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
memset(&in, 0, sizeof(in));
|
||||||
|
memset(&ou, 0, sizeof(ou));
|
||||||
|
|
||||||
|
in.type = Tremove;
|
||||||
|
in.fid = fid;
|
||||||
|
|
||||||
|
rlock(&mainlock);
|
||||||
|
err = fs_remove(cons.chan, &in, &ou);
|
||||||
|
runlock(&mainlock);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
doclri(File *f)
|
doclri(File *f)
|
||||||
{
|
{
|
||||||
|
@ -196,14 +257,15 @@ out:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static int
|
||||||
f_fstat(Chan *cp, Fcall *in, Fcall *ou)
|
f_fstat(Chan *cp, Fcall *in, Fcall *ou)
|
||||||
{
|
{
|
||||||
File *f;
|
File *f;
|
||||||
Iobuf *p;
|
Iobuf *p;
|
||||||
Dentry *d;
|
Dentry *d;
|
||||||
int i;
|
int i, err;
|
||||||
|
|
||||||
|
err = 0;
|
||||||
if(CHAT(cp)) {
|
if(CHAT(cp)) {
|
||||||
fprint(2, "c_fstat %d\n", cp->chan);
|
fprint(2, "c_fstat %d\n", cp->chan);
|
||||||
fprint(2, "\tfid = %d\n", in->fid);
|
fprint(2, "\tfid = %d\n", in->fid);
|
||||||
|
@ -212,7 +274,7 @@ f_fstat(Chan *cp, Fcall *in, Fcall *ou)
|
||||||
p = 0;
|
p = 0;
|
||||||
f = filep(cp, in->fid, 0);
|
f = filep(cp, in->fid, 0);
|
||||||
if(!f) {
|
if(!f) {
|
||||||
ou->err = Efid;
|
err = Efid;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
p = getbuf(f->fs->dev, f->addr, Brd);
|
p = getbuf(f->fs->dev, f->addr, Brd);
|
||||||
|
@ -238,12 +300,33 @@ out:
|
||||||
ou->fid = in->fid;
|
ou->fid = in->fid;
|
||||||
if(f)
|
if(f)
|
||||||
qunlock(f);
|
qunlock(f);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
int
|
||||||
|
con_fstat(int fid)
|
||||||
|
{
|
||||||
|
Fcall in, ou;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
memset(&in, 0, sizeof(in));
|
||||||
|
memset(&ou, 0, sizeof(ou));
|
||||||
|
|
||||||
|
in.type = Tstat;
|
||||||
|
in.fid = fid;
|
||||||
|
|
||||||
|
rlock(&mainlock);
|
||||||
|
err = f_fstat(cons.chan, &in, &ou);
|
||||||
|
runlock(&mainlock);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
f_clri(Chan *cp, Fcall *in, Fcall *ou)
|
f_clri(Chan *cp, Fcall *in, Fcall *ou)
|
||||||
{
|
{
|
||||||
File *f;
|
File *f;
|
||||||
|
int err;
|
||||||
|
|
||||||
if(CHAT(cp)) {
|
if(CHAT(cp)) {
|
||||||
fprint(2, "c_clri %d\n", cp->chan);
|
fprint(2, "c_clri %d\n", cp->chan);
|
||||||
|
@ -252,57 +335,33 @@ f_clri(Chan *cp, Fcall *in, Fcall *ou)
|
||||||
|
|
||||||
f = filep(cp, in->fid, 0);
|
f = filep(cp, in->fid, 0);
|
||||||
if(!f) {
|
if(!f) {
|
||||||
ou->err = Efid;
|
err = Efid;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
ou->err = doclri(f);
|
err = doclri(f);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
ou->fid = in->fid;
|
ou->fid = in->fid;
|
||||||
if(f)
|
if(f)
|
||||||
qunlock(f);
|
qunlock(f);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
con_clri(int fid)
|
con_clri(int fid)
|
||||||
{
|
{
|
||||||
Fcall in, ou;
|
Fcall in, ou;
|
||||||
Chan *cp;
|
int err;
|
||||||
|
|
||||||
|
memset(&in, 0, sizeof(in));
|
||||||
|
memset(&ou, 0, sizeof(ou));
|
||||||
|
|
||||||
in.type = Tremove;
|
in.type = Tremove;
|
||||||
in.fid = fid;
|
in.fid = fid;
|
||||||
cp = cons.chan;
|
|
||||||
|
|
||||||
rlock(&mainlock);
|
rlock(&mainlock);
|
||||||
ou.type = Tremove+1;
|
err = f_clri(cons.chan, &in, &ou);
|
||||||
ou.err = 0;
|
|
||||||
|
|
||||||
rlock(&cp->reflock);
|
|
||||||
f_clri(cp, &in, &ou);
|
|
||||||
runlock(&cp->reflock);
|
|
||||||
|
|
||||||
runlock(&mainlock);
|
runlock(&mainlock);
|
||||||
return ou.err;
|
|
||||||
}
|
return err;
|
||||||
|
|
||||||
int
|
|
||||||
con_fstat(int fid)
|
|
||||||
{
|
|
||||||
Fcall in, ou;
|
|
||||||
Chan *cp;
|
|
||||||
|
|
||||||
in.type = Tstat;
|
|
||||||
in.fid = fid;
|
|
||||||
cp = cons.chan;
|
|
||||||
|
|
||||||
rlock(&mainlock);
|
|
||||||
ou.type = Tstat+1;
|
|
||||||
ou.err = 0;
|
|
||||||
|
|
||||||
rlock(&cp->reflock);
|
|
||||||
f_fstat(cp, &in, &ou);
|
|
||||||
runlock(&cp->reflock);
|
|
||||||
|
|
||||||
runlock(&mainlock);
|
|
||||||
return ou.err;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ localconfinit(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
int (*fsprotocol[])(Msgbuf*) = {
|
int (*fsprotocol[])(Msgbuf*) = {
|
||||||
serve9p1,
|
|
||||||
serve9p2,
|
serve9p2,
|
||||||
nil,
|
nil,
|
||||||
};
|
};
|
||||||
|
|
|
@ -27,7 +27,6 @@ localconfinit(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
int (*fsprotocol[])(Msgbuf*) = {
|
int (*fsprotocol[])(Msgbuf*) = {
|
||||||
serve9p1,
|
|
||||||
serve9p2,
|
serve9p2,
|
||||||
nil,
|
nil,
|
||||||
};
|
};
|
||||||
|
|
|
@ -26,7 +26,6 @@ localconfinit(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
int (*fsprotocol[])(Msgbuf*) = {
|
int (*fsprotocol[])(Msgbuf*) = {
|
||||||
serve9p1,
|
|
||||||
serve9p2,
|
serve9p2,
|
||||||
nil,
|
nil,
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
/* cached-worm file server */
|
/* cached-worm file server */
|
||||||
#include "all.h"
|
#include "all.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "9p1.h"
|
|
||||||
|
|
||||||
Map *devmap;
|
Map *devmap;
|
||||||
|
|
||||||
|
@ -466,10 +465,11 @@ serve(void *)
|
||||||
|
|
||||||
if (mb->data == nil)
|
if (mb->data == nil)
|
||||||
panic("serve: nil mb->data");
|
panic("serve: nil mb->data");
|
||||||
/* better sniffing code in /sys/src/cmd/disk/kfs/9p12.c */
|
if(cp->protocol != nil){
|
||||||
if(cp->protocol == nil){
|
/* process the request, generate an answer and reply */
|
||||||
|
cp->protocol(mb);
|
||||||
|
} else {
|
||||||
/* do we recognise the protocol in this packet? */
|
/* do we recognise the protocol in this packet? */
|
||||||
/* better sniffing code: /sys/src/cmd/disk/kfs/9p12.c */
|
|
||||||
for(i = 0; fsprotocol[i] != nil; i++)
|
for(i = 0; fsprotocol[i] != nil; i++)
|
||||||
if(fsprotocol[i](mb) != 0) {
|
if(fsprotocol[i](mb) != 0) {
|
||||||
cp->protocol = fsprotocol[i];
|
cp->protocol = fsprotocol[i];
|
||||||
|
@ -479,9 +479,7 @@ serve(void *)
|
||||||
fprint(2, "no protocol for message\n");
|
fprint(2, "no protocol for message\n");
|
||||||
hexdump(mb->data, 12);
|
hexdump(mb->data, 12);
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
/* process the request, generate an answer and reply */
|
|
||||||
cp->protocol(mb);
|
|
||||||
|
|
||||||
mbfree(mb);
|
mbfree(mb);
|
||||||
runlock(&mainlock);
|
runlock(&mainlock);
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
void accessdir(Iobuf*, Dentry*, int, int);
|
void accessdir(Iobuf*, Dentry*, int, int);
|
||||||
void addfree(Device*, Off, Superb*);
|
void addfree(Device*, Off, Superb*);
|
||||||
void arpstart(void);
|
|
||||||
void arginit(void);
|
void arginit(void);
|
||||||
void* authnew(void);
|
void* authnew(void);
|
||||||
void authfree(void*);
|
void authfree(void*);
|
||||||
|
@ -12,25 +11,17 @@ Device* config(void);
|
||||||
Off bufalloc(Device*, int, long, int);
|
Off bufalloc(Device*, int, long, int);
|
||||||
void buffree(Device*, Off, int, Truncstate *);
|
void buffree(Device*, Off, int, Truncstate *);
|
||||||
int byuid(void*, void*);
|
int byuid(void*, void*);
|
||||||
int canlock(Lock*);
|
|
||||||
int canqlock(QLock*);
|
|
||||||
void cfsdump(Filsys*);
|
void cfsdump(Filsys*);
|
||||||
void chanhangup(Chan *cp, char *msg);
|
void chanhangup(Chan *cp, char *msg);
|
||||||
Chan* fs_chaninit(int, int);
|
Chan* fs_chaninit(int, int);
|
||||||
void cmd_check(int, char*[]);
|
void cmd_check(int, char*[]);
|
||||||
void cmd_users(int, char*[]);
|
void cmd_users(int, char*[]);
|
||||||
void cmd_newuser(int, char*[]);
|
void cmd_newuser(int, char*[]);
|
||||||
void cmd_netdb(int, char*[]);
|
|
||||||
void cmd_printconf(int, char*[]);
|
void cmd_printconf(int, char*[]);
|
||||||
void cmd_wormreset(int, char *[]);
|
void cmd_wormreset(int, char *[]);
|
||||||
int checkname(char*);
|
int checkname(char*);
|
||||||
int checktag(Iobuf*, int, Off);
|
int checktag(Iobuf*, int, Off);
|
||||||
int cksum(void*, int, int);
|
|
||||||
int cksum0(int, int);
|
|
||||||
void cyclstart(void);
|
|
||||||
void dotrace(int);
|
|
||||||
void consserve(void);
|
void consserve(void);
|
||||||
int conslock(void);
|
|
||||||
int con_attach(int, char*, char*);
|
int con_attach(int, char*, char*);
|
||||||
int con_clone(int, int);
|
int con_clone(int, int);
|
||||||
int con_create(int, char*, int, int, long, int);
|
int con_create(int, char*, int, int, long, int);
|
||||||
|
@ -75,11 +66,7 @@ void netstart(void);
|
||||||
void exit(void);
|
void exit(void);
|
||||||
void fileinit(Chan*);
|
void fileinit(Chan*);
|
||||||
File* filep(Chan*, ulong, int);
|
File* filep(Chan*, ulong, int);
|
||||||
void firmware(void);
|
|
||||||
int fname(char*);
|
|
||||||
int fpair(char*, char*);
|
|
||||||
void formatinit(void);
|
void formatinit(void);
|
||||||
int fread(void*, int);
|
|
||||||
void freefp(File*);
|
void freefp(File*);
|
||||||
void freewp(Wpath*);
|
void freewp(Wpath*);
|
||||||
Filsys* fsstr(char*);
|
Filsys* fsstr(char*);
|
||||||
|
@ -91,7 +78,6 @@ int fwormwrite(Device*, Off, void*);
|
||||||
Iobuf* getbuf(Device*, Off, int);
|
Iobuf* getbuf(Device*, Off, int);
|
||||||
char* getwrd(char*, char*);
|
char* getwrd(char*, char*);
|
||||||
Dentry* getdir(Iobuf*, int);
|
Dentry* getdir(Iobuf*, int);
|
||||||
Chan* getlcp(uchar*, long);
|
|
||||||
Off getraddr(Device*);
|
Off getraddr(Device*);
|
||||||
void hexdump(void*, int);
|
void hexdump(void*, int);
|
||||||
int iaccess(File*, Dentry*, int);
|
int iaccess(File*, Dentry*, int);
|
||||||
|
@ -101,7 +87,6 @@ Off ibbpowsum(int);
|
||||||
Device* iconfig(char *);
|
Device* iconfig(char *);
|
||||||
Off indfetch(Device*, Off, Off, Off , int, int, int);
|
Off indfetch(Device*, Off, Off, Off , int, int, int);
|
||||||
int ingroup(int, int);
|
int ingroup(int, int);
|
||||||
int inh(int, uchar*);
|
|
||||||
Devsize inqsize(char *file);
|
Devsize inqsize(char *file);
|
||||||
void iobufinit(void);
|
void iobufinit(void);
|
||||||
void* iobufmap(Iobuf*);
|
void* iobufmap(Iobuf*);
|
||||||
|
@ -115,13 +100,8 @@ void jukeream(Device*);
|
||||||
void jukerecover(Device*);
|
void jukerecover(Device*);
|
||||||
Off jukesaddr(Device*);
|
Off jukesaddr(Device*);
|
||||||
Devsize jukesize(Device*);
|
Devsize jukesize(Device*);
|
||||||
void kbdchar(int);
|
|
||||||
void lights(int, int);
|
|
||||||
void launchinit(void);
|
|
||||||
void localconfinit(void);
|
void localconfinit(void);
|
||||||
int leadgroup(int, int);
|
int leadgroup(int, int);
|
||||||
void lock(Lock*);
|
|
||||||
void lockinit(void);
|
|
||||||
void machinit(void);
|
void machinit(void);
|
||||||
Msgbuf* mballoc(int, Chan*, int);
|
Msgbuf* mballoc(int, Chan*, int);
|
||||||
void mbinit(void);
|
void mbinit(void);
|
||||||
|
@ -143,13 +123,11 @@ void mlevinit(Device*);
|
||||||
int mlevread(Device*, Off, void*);
|
int mlevread(Device*, Off, void*);
|
||||||
Devsize mlevsize(Device*);
|
Devsize mlevsize(Device*);
|
||||||
int mlevwrite(Device*, Off, void*);
|
int mlevwrite(Device*, Off, void*);
|
||||||
int nametokey(char*, char*);
|
|
||||||
File* newfp(void);
|
File* newfp(void);
|
||||||
void newscsi(Device *d, Scsi *sc);
|
void newscsi(Device *d, Scsi *sc);
|
||||||
Queue* newqueue(int, char*);
|
Queue* newqueue(int, char*);
|
||||||
void newstart(void);
|
void newstart(void);
|
||||||
Wpath* newwp(void);
|
Wpath* newwp(void);
|
||||||
int nvrcheck(void);
|
|
||||||
char* nvrgetconfig(void);
|
char* nvrgetconfig(void);
|
||||||
int nvrsetconfig(char*);
|
int nvrsetconfig(char*);
|
||||||
int walkto(char*);
|
int walkto(char*);
|
||||||
|
@ -164,23 +142,15 @@ int partwrite(Device*, Off, void*);
|
||||||
void prdate(void);
|
void prdate(void);
|
||||||
void preread(Device*, Off);
|
void preread(Device*, Off);
|
||||||
int prime(vlong);
|
int prime(vlong);
|
||||||
void printinit(void);
|
|
||||||
void procinit(void);
|
|
||||||
void procsetname(char *fmt, ...);
|
void procsetname(char *fmt, ...);
|
||||||
void putbuf(Iobuf*);
|
void putbuf(Iobuf*);
|
||||||
Off qidpathgen(Device*);
|
Off qidpathgen(Device*);
|
||||||
void qlock(QLock*);
|
|
||||||
void* querychanger(Device *);
|
void* querychanger(Device *);
|
||||||
void qunlock(QLock*);
|
|
||||||
void rahead(void *);
|
void rahead(void *);
|
||||||
void ream(Filsys*);
|
void ream(Filsys*);
|
||||||
void* fs_recv(Queue*, int);
|
void* fs_recv(Queue*, int);
|
||||||
void rootream(Device*, Off);
|
void rootream(Device*, Off);
|
||||||
int roread(Device*, Off, void*);
|
int roread(Device*, Off, void*);
|
||||||
void rstate(Chan*, int);
|
|
||||||
Timet rtc2sec(Rtc *);
|
|
||||||
void sched(void);
|
|
||||||
void schedinit(void);
|
|
||||||
int scsiio(Device*, int, uchar*, int, void*, int);
|
int scsiio(Device*, int, uchar*, int, void*, int);
|
||||||
void scsiinit(void);
|
void scsiinit(void);
|
||||||
Off scsiread(int, void*, long);
|
Off scsiread(int, void*, long);
|
||||||
|
@ -190,10 +160,8 @@ char* sdof(Device*);
|
||||||
void sec2rtc(Timet, Rtc *);
|
void sec2rtc(Timet, Rtc *);
|
||||||
void fs_send(Queue*, void*);
|
void fs_send(Queue*, void*);
|
||||||
void serve(void *);
|
void serve(void *);
|
||||||
int serve9p1(Msgbuf*);
|
|
||||||
int serve9p2(Msgbuf*);
|
int serve9p2(Msgbuf*);
|
||||||
void settag(Iobuf*, int, long);
|
void settag(Iobuf*, int, long);
|
||||||
void settime(Timet);
|
|
||||||
int strtouid(char*);
|
int strtouid(char*);
|
||||||
Off superaddr(Device*);
|
Off superaddr(Device*);
|
||||||
void superream(Device*, Off);
|
void superream(Device*, Off);
|
||||||
|
@ -208,11 +176,8 @@ int Tfmt(Fmt*);
|
||||||
Timet nextime(Timet, int, int);
|
Timet nextime(Timet, int, int);
|
||||||
Tlock* tlocked(Iobuf*, Dentry*);
|
Tlock* tlocked(Iobuf*, Dentry*);
|
||||||
Timet toytime(void);
|
Timet toytime(void);
|
||||||
Timet rtctime(void);
|
|
||||||
void setrtc(Timet);
|
|
||||||
void uidtostr(char*, int, int);
|
void uidtostr(char*, int, int);
|
||||||
Uid* uidpstr(char*);
|
Uid* uidpstr(char*);
|
||||||
void unlock(Lock*);
|
|
||||||
void newproc(void(*)(void *), void*, char*);
|
void newproc(void(*)(void *), void*, char*);
|
||||||
void wormcopy(void *);
|
void wormcopy(void *);
|
||||||
void wormprobe(void);
|
void wormprobe(void);
|
||||||
|
@ -232,4 +197,3 @@ void cmd_install(char*, char*, void (*)(int, char*[]));
|
||||||
ulong flag_install(char*, char*);
|
ulong flag_install(char*, char*);
|
||||||
void srvinit(void);
|
void srvinit(void);
|
||||||
Chan *srvchan(int, char *);
|
Chan *srvchan(int, char *);
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
BIN=/$objtype/bin
|
BIN=/$objtype/bin
|
||||||
TARG=cwfs$FS
|
TARG=cwfs$FS
|
||||||
OFILES=\
|
OFILES=\
|
||||||
9p1.$O\
|
|
||||||
9p1lib.$O\
|
|
||||||
9p2.$O\
|
9p2.$O\
|
||||||
auth.$O\
|
auth.$O\
|
||||||
chk.$O\
|
chk.$O\
|
||||||
|
@ -33,7 +31,6 @@ HFILES=\
|
||||||
../32bit.h\
|
../32bit.h\
|
||||||
../64bit.h\
|
../64bit.h\
|
||||||
../64xbit.h\
|
../64xbit.h\
|
||||||
../9p1.h\
|
|
||||||
../all.h\
|
../all.h\
|
||||||
dat.h\
|
dat.h\
|
||||||
../io.h\
|
../io.h\
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue