summaryrefslogtreecommitdiff
path: root/sys/src/cmd/srvold9p/9p1lib.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/srvold9p/9p1lib.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/srvold9p/9p1lib.c')
-rwxr-xr-xsys/src/cmd/srvold9p/9p1lib.c627
1 files changed, 627 insertions, 0 deletions
diff --git a/sys/src/cmd/srvold9p/9p1lib.c b/sys/src/cmd/srvold9p/9p1lib.c
new file mode 100755
index 000000000..df68ef5ba
--- /dev/null
+++ b/sys/src/cmd/srvold9p/9p1lib.c
@@ -0,0 +1,627 @@
+#include <u.h>
+#include <libc.h>
+#include <auth.h>
+#include "9p1.h"
+#pragma varargck type "D" Dir* /* from fcall.h */
+
+static void dumpsome(char*, char*, long);
+
+int
+fcallfmt9p1(Fmt *f1)
+{
+ Fcall9p1 *f;
+ int fid, type, tag, n;
+ char buf[512];
+ Dir d;
+
+ f = va_arg(f1->args, Fcall9p1*);
+ type = f->type;
+ fid = f->fid;
+ tag = f->tag;
+ switch(type){
+ case Tnop9p1: /* 50 */
+ sprint(buf, "old Tnop tag %ud", tag);
+ break;
+ case Rnop9p1:
+ sprint(buf, "old Rnop tag %ud", tag);
+ break;
+ case Tsession9p1: /* 52 */
+ sprint(buf, "old Tsession tag %ud", tag);
+ break;
+ case Rsession9p1:
+ sprint(buf, "old Rsession tag %ud", tag);
+ break;
+ case Rerror9p1: /* 55 */
+ sprint(buf, "old Rerror tag %ud error %.64s", tag, f->ename);
+ break;
+ case Tflush9p1: /* 56 */
+ sprint(buf, "old Tflush tag %ud oldtag %d", tag, f->oldtag);
+ break;
+ case Rflush9p1:
+ sprint(buf, "old Rflush tag %ud", tag);
+ break;
+ case Tattach9p1: /* 58 */
+ sprint(buf, "old Tattach tag %ud fid %d uname %.28s aname %.28s auth %.28s",
+ tag, f->fid, f->uname, f->aname, f->auth);
+ break;
+ case Rattach9p1:
+ sprint(buf, "old Rattach tag %ud fid %d qid 0x%lux|0x%lux",
+ tag, fid, f->qid.path, f->qid.version);
+ break;
+ case Tclone9p1: /* 60 */
+ sprint(buf, "old Tclone tag %ud fid %d newfid %d", tag, fid, f->newfid);
+ break;
+ case Rclone9p1:
+ sprint(buf, "old Rclone tag %ud fid %d", tag, fid);
+ break;
+ case Twalk9p1: /* 62 */
+ sprint(buf, "old Twalk tag %ud fid %d name %.28s", tag, fid, f->name);
+ break;
+ case Rwalk9p1:
+ sprint(buf, "old Rwalk tag %ud fid %d qid 0x%lux|0x%lux",
+ tag, fid, f->qid.path, f->qid.version);
+ break;
+ case Topen9p1: /* 64 */
+ sprint(buf, "old Topen tag %ud fid %d mode %d", tag, fid, f->mode);
+ break;
+ case Ropen9p1:
+ sprint(buf, "old Ropen tag %ud fid %d qid 0x%lux|0x%lux",
+ tag, fid, f->qid.path, f->qid.version);
+ break;
+ case Tcreate9p1: /* 66 */
+ sprint(buf, "old Tcreate tag %ud fid %d name %.28s perm 0x%lux mode %d",
+ tag, fid, f->name, f->perm, f->mode);
+ break;
+ case Rcreate9p1:
+ sprint(buf, "old Rcreate tag %ud fid %d qid 0x%lux|0x%lux",
+ tag, fid, f->qid.path, f->qid.version);
+ break;
+ case Tread9p1: /* 68 */
+ sprint(buf, "old Tread tag %ud fid %d offset %ld count %ld",
+ tag, fid, f->offset, f->count);
+ break;
+ case Rread9p1:
+ n = sprint(buf, "old Rread tag %ud fid %d count %ld ", tag, fid, f->count);
+ dumpsome(buf+n, f->data, f->count);
+ break;
+ case Twrite9p1: /* 70 */
+ n = sprint(buf, "old Twrite tag %ud fid %d offset %ld count %ld ",
+ tag, fid, f->offset, f->count);
+ dumpsome(buf+n, f->data, f->count);
+ break;
+ case Rwrite9p1:
+ sprint(buf, "old Rwrite tag %ud fid %d count %ld", tag, fid, f->count);
+ break;
+ case Tclunk9p1: /* 72 */
+ sprint(buf, "old Tclunk tag %ud fid %d", tag, fid);
+ break;
+ case Rclunk9p1:
+ sprint(buf, "old Rclunk tag %ud fid %d", tag, fid);
+ break;
+ case Tremove9p1: /* 74 */
+ sprint(buf, "old Tremove tag %ud fid %d", tag, fid);
+ break;
+ case Rremove9p1:
+ sprint(buf, "old Rremove tag %ud fid %d", tag, fid);
+ break;
+ case Tstat9p1: /* 76 */
+ sprint(buf, "old Tstat tag %ud fid %d", tag, fid);
+ break;
+ case Rstat9p1:
+ convM2D9p1(f->stat, &d);
+ sprint(buf, "old Rstat tag %ud fid %d stat %D", tag, fid, &d);
+ break;
+ case Twstat9p1: /* 78 */
+ convM2D9p1(f->stat, &d);
+ sprint(buf, "old Twstat tag %ud fid %d stat %D", tag, fid, &d);
+ break;
+ case Rwstat9p1:
+ sprint(buf, "old Rwstat tag %ud fid %d", tag, fid);
+ break;
+ case Tclwalk9p1: /* 81 */
+ sprint(buf, "old Tclwalk tag %ud fid %d newfid %d name %.28s",
+ tag, fid, f->newfid, f->name);
+ break;
+ case Rclwalk9p1:
+ sprint(buf, "old Rclwalk tag %ud fid %d qid 0x%lux|0x%lux",
+ tag, fid, f->qid.path, f->qid.version);
+ break;
+ default:
+ sprint(buf, "unknown type %d", type);
+ }
+ return fmtstrcpy(f1, buf);
+}
+
+/*
+ * dump out count (or DUMPL, if count is bigger) bytes from
+ * buf to ans, as a string if they are all printable,
+ * else as a series of hex bytes
+ */
+#define DUMPL 64
+
+static void
+dumpsome(char *ans, char *buf, long count)
+{
+ int i, printable;
+ char *p;
+
+ printable = 1;
+ if(count > DUMPL)
+ count = DUMPL;
+ for(i=0; i<count && printable; i++)
+ if((buf[i]<32 && buf[i] !='\n' && buf[i] !='\t') || (uchar)buf[i]>127)
+ printable = 0;
+ p = ans;
+ *p++ = '\'';
+ if(printable){
+ memmove(p, buf, count);
+ p += count;
+ }else{
+ for(i=0; i<count; i++){
+ if(i>0 && i%4==0)
+ *p++ = ' ';
+ sprint(p, "%2.2ux", buf[i]);
+ p += 2;
+ }
+ }
+ *p++ = '\'';
+ *p = 0;
+}
+
+#define CHAR(x) *p++ = f->x
+#define SHORT(x) { ulong vvv = f->x; p[0] = vvv; p[1] = vvv>>8; p += 2; }
+#define VLONG(q) p[0] = (q); p[1] = (q)>>8; p[2] = (q)>>16; p[3] = (q)>>24; p += 4
+#define LONG(x) { ulong vvv = f->x; VLONG(vvv); }
+#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(Fcall9p1 *f, char *ap)
+{
+ uchar *p;
+ int t;
+
+ p = (uchar*)ap;
+ CHAR(type);
+ t = f->type;
+ SHORT(tag);
+ switch(t)
+ {
+ default:
+ fprint(2, "convS2M9p1: bad type: %d\n", t);
+ return 0;
+
+ case Tnop9p1:
+ case Tosession9p1:
+ break;
+
+ case Tsession9p1:
+ BYTES(chal, sizeof(f->chal));
+ break;
+
+ case Tflush9p1:
+ SHORT(oldtag);
+ break;
+
+ case Tattach9p1:
+ SHORT(fid);
+ STRING(uname, sizeof(f->uname));
+ STRING(aname, sizeof(f->aname));
+ BYTES(ticket, sizeof(f->ticket));
+ BYTES(auth, sizeof(f->auth));
+ break;
+
+ case Toattach9p1:
+ SHORT(fid);
+ STRING(uname, sizeof(f->uname));
+ STRING(aname, sizeof(f->aname));
+ BYTES(ticket, NAMEREC);
+ break;
+
+ case Tclone9p1:
+ SHORT(fid);
+ SHORT(newfid);
+ break;
+
+ case Twalk9p1:
+ SHORT(fid);
+ STRING(name, sizeof(f->name));
+ break;
+
+ case Tclwalk9p1:
+ SHORT(fid);
+ SHORT(newfid);
+ STRING(name, sizeof(f->name));
+ break;
+
+ case Topen9p1:
+ SHORT(fid);
+ CHAR(mode);
+ break;
+
+ case Tcreate9p1:
+ SHORT(fid);
+ STRING(name, sizeof(f->name));
+ LONG(perm);
+ CHAR(mode);
+ break;
+
+ case Tread9p1:
+ SHORT(fid);
+ LONG(offset); VLONG(0);
+ SHORT(count);
+ break;
+
+ case Twrite9p1:
+ SHORT(fid);
+ LONG(offset); VLONG(0);
+ SHORT(count);
+ p++;
+ if((uchar*)p == (uchar*)f->data) {
+ p += f->count;
+ break;
+ }
+ BYTES(data, f->count);
+ break;
+
+ case Tclunk9p1:
+ case Tremove9p1:
+ case Tstat9p1:
+ SHORT(fid);
+ break;
+
+ case Twstat9p1:
+ SHORT(fid);
+ BYTES(stat, sizeof(f->stat));
+ break;
+/*
+ */
+ case Rnop9p1:
+ case Rosession9p1:
+ case Rflush9p1:
+ break;
+
+ case Rsession9p1:
+ BYTES(chal, sizeof(f->chal));
+ BYTES(authid, sizeof(f->authid));
+ BYTES(authdom, sizeof(f->authdom));
+ break;
+
+ case Rerror9p1:
+ STRING(ename, sizeof(f->ename));
+ break;
+
+ case Rclone9p1:
+ case Rclunk9p1:
+ case Rremove9p1:
+ case Rwstat9p1:
+ SHORT(fid);
+ break;
+
+ case Rwalk9p1:
+ case Ropen9p1:
+ case Rcreate9p1:
+ case Rclwalk9p1:
+ SHORT(fid);
+ LONG(qid.path);
+ LONG(qid.version);
+ break;
+
+ case Rattach9p1:
+ SHORT(fid);
+ LONG(qid.path);
+ LONG(qid.version);
+ BYTES(rauth, sizeof(f->rauth));
+ break;
+
+ case Roattach9p1:
+ SHORT(fid);
+ LONG(qid.path);
+ LONG(qid.version);
+ break;
+
+ case Rread9p1:
+ SHORT(fid);
+ SHORT(count);
+ p++;
+ if((uchar*)p == (uchar*)f->data) {
+ p += f->count;
+ break;
+ }
+ BYTES(data, f->count);
+ break;
+
+ case Rwrite9p1:
+ SHORT(fid);
+ SHORT(count);
+ break;
+
+ case Rstat9p1:
+ SHORT(fid);
+ BYTES(stat, sizeof(f->stat));
+ break;
+ }
+ return p - (uchar*)ap;
+}
+
+int
+convD2M9p1(Dir *f, char *ap)
+{
+ uchar *p;
+ ulong q;
+
+ p = (uchar*)ap;
+ STRING(name, NAMEREC);
+ STRING(uid, NAMEREC);
+ STRING(gid, NAMEREC);
+
+ q = f->qid.path & ~0x80000000;
+ if(f->qid.type & QTDIR)
+ q |= 0x80000000;
+ VLONG(q);
+ LONG(qid.vers);
+ LONG(mode);
+ LONG(atime);
+ LONG(mtime);
+ LONG(length); VLONG(0);
+ VLONG(0);
+ return p - (uchar*)ap;
+}
+
+int
+convA2M9p1(Authenticator *f, char *ap, char *key)
+{
+ int n;
+ uchar *p;
+
+ p = (uchar*)ap;
+ CHAR(num);
+ STRING(chal, CHALLEN);
+ LONG(id);
+ n = p - (uchar*)ap;
+ if(key)
+ encrypt(key, ap, n);
+ return n;
+}
+
+#undef CHAR
+#undef SHORT
+#undef LONG
+#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 VLONG(q) q = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)); p += 4
+#define LONG(x) VLONG(f->x)
+#define BYTES(x,n) memmove(f->x, p, n); p += n
+#define STRING(x,n) memmove(f->x, p, n); p += n
+
+int
+convM2S9p1(char *ap, Fcall9p1 *f, int n)
+{
+ uchar *p;
+ int t;
+
+ p = (uchar*)ap;
+ CHAR(type);
+ t = f->type;
+ SHORT(tag);
+ switch(t)
+ {
+ default:
+ fprint(2, "convM2S9p1: bad type: %d\n", f->type);
+ return 0;
+
+ case Tnop9p1:
+ case Tosession9p1:
+ break;
+
+ case Tsession9p1:
+ BYTES(chal, sizeof(f->chal));
+ break;
+
+ case Tflush9p1:
+ SHORT(oldtag);
+ break;
+
+ case Tattach9p1:
+ SHORT(fid);
+ BYTES(uname, sizeof(f->uname));
+ BYTES(aname, sizeof(f->aname));
+ BYTES(ticket, sizeof(f->ticket));
+ BYTES(auth, sizeof(f->auth));
+ break;
+
+ case Toattach9p1:
+ SHORT(fid);
+ BYTES(uname, sizeof(f->uname));
+ BYTES(aname, sizeof(f->aname));
+ BYTES(ticket, NAMEREC);
+ break;
+
+ case Tclone9p1:
+ SHORT(fid);
+ SHORT(newfid);
+ break;
+
+ case Twalk9p1:
+ SHORT(fid);
+ BYTES(name, sizeof(f->name));
+ break;
+
+ case Tclwalk9p1:
+ SHORT(fid);
+ SHORT(newfid);
+ BYTES(name, sizeof(f->name));
+ break;
+
+ case Tremove9p1:
+ SHORT(fid);
+ break;
+
+ case Topen9p1:
+ SHORT(fid);
+ CHAR(mode);
+ break;
+
+ case Tcreate9p1:
+ SHORT(fid);
+ BYTES(name, sizeof(f->name));
+ LONG(perm);
+ CHAR(mode);
+ break;
+
+ case Tread9p1:
+ SHORT(fid);
+ LONG(offset); p += 4;
+ SHORT(count);
+ break;
+
+ case Twrite9p1:
+ SHORT(fid);
+ LONG(offset); p += 4;
+ SHORT(count);
+ p++;
+ f->data = (char*)p; p += f->count;
+ break;
+
+ case Tclunk9p1:
+ case Tstat9p1:
+ SHORT(fid);
+ break;
+
+ case Twstat9p1:
+ SHORT(fid);
+ BYTES(stat, sizeof(f->stat));
+ break;
+
+/*
+ */
+ case Rnop9p1:
+ case Rosession9p1:
+ break;
+
+ case Rsession9p1:
+ BYTES(chal, sizeof(f->chal));
+ BYTES(authid, sizeof(f->authid));
+ BYTES(authdom, sizeof(f->authdom));
+ break;
+
+ case Rerror9p1:
+ BYTES(ename, sizeof(f->ename));
+ break;
+
+ case Rflush9p1:
+ break;
+
+ case Rclone9p1:
+ case Rclunk9p1:
+ case Rremove9p1:
+ case Rwstat9p1:
+ SHORT(fid);
+ break;
+
+ case Rwalk9p1:
+ case Rclwalk9p1:
+ case Ropen9p1:
+ case Rcreate9p1:
+ SHORT(fid);
+ LONG(qid.path);
+ LONG(qid.version);
+ break;
+
+ case Rattach9p1:
+ SHORT(fid);
+ LONG(qid.path);
+ LONG(qid.version);
+ BYTES(rauth, sizeof(f->rauth));
+ break;
+
+ case Roattach9p1:
+ SHORT(fid);
+ LONG(qid.path);
+ LONG(qid.version);
+ break;
+
+ case Rread9p1:
+ SHORT(fid);
+ SHORT(count);
+ p++;
+ f->data = (char*)p; p += f->count;
+ break;
+
+ case Rwrite9p1:
+ SHORT(fid);
+ SHORT(count);
+ break;
+
+ case Rstat9p1:
+ SHORT(fid);
+ BYTES(stat, sizeof(f->stat));
+ break;
+ }
+ if((uchar*)ap+n == p)
+ return n;
+ return 0;
+}
+
+int
+convM2D9p1(char *ap, Dir *f)
+{
+ uchar *p;
+
+ p = (uchar*)ap;
+ f->name = (char*)p;
+ p += NAMEREC;
+ f->uid = (char*)p;
+ f->muid = (char*)p;
+ p += NAMEREC;
+ f->gid = (char*)p;
+ p += NAMEREC;
+
+ LONG(qid.path);
+ f->qid.path &= ~0x80000000;
+
+ LONG(qid.vers);
+ LONG(mode);
+ f->qid.type = f->mode >> 24;
+ LONG(atime);
+ LONG(mtime);
+ LONG(length); p += 4;
+ 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);
+ STRING(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);
+ STRING(chal, CHALLEN);
+ STRING(cuid, NAMEREC);
+ f->cuid[NAMEREC-1] = 0;
+ STRING(suid, NAMEREC);
+ f->suid[NAMEREC-1] = 0;
+ STRING(key, DESKEYLEN);
+ USED(p);
+};