1*28942eadSforsyth #include "logfsos.h"
237da2899SCharles.Forsyth #include "logfs.h"
337da2899SCharles.Forsyth #include "local.h"
437da2899SCharles.Forsyth #include "fcall.h"
537da2899SCharles.Forsyth
637da2899SCharles.Forsyth static void
pn(uchar ** pp,char * v)737da2899SCharles.Forsyth pn(uchar **pp, char *v)
837da2899SCharles.Forsyth {
937da2899SCharles.Forsyth uchar *p = *pp;
1037da2899SCharles.Forsyth int l;
1137da2899SCharles.Forsyth l = v ? strlen(v) : 0;
1237da2899SCharles.Forsyth PBIT16(p, l); p += BIT16SZ;
1337da2899SCharles.Forsyth memmove(p, v, l);
1437da2899SCharles.Forsyth p += l;
1537da2899SCharles.Forsyth *pp = p;
1637da2899SCharles.Forsyth }
1737da2899SCharles.Forsyth
1837da2899SCharles.Forsyth static uint
sn(char * p)1937da2899SCharles.Forsyth sn(char *p)
2037da2899SCharles.Forsyth {
2137da2899SCharles.Forsyth if(p == nil)
2237da2899SCharles.Forsyth return BIT16SZ;
2337da2899SCharles.Forsyth return strlen(p) + BIT16SZ;
2437da2899SCharles.Forsyth }
2537da2899SCharles.Forsyth
2637da2899SCharles.Forsyth uint
logfsconvM2S(uchar * ap,uint nap,LogMessage * f)2737da2899SCharles.Forsyth logfsconvM2S(uchar *ap, uint nap, LogMessage *f)
2837da2899SCharles.Forsyth {
2937da2899SCharles.Forsyth uchar *p = ap;
3037da2899SCharles.Forsyth uchar *ep = p + nap;
3137da2899SCharles.Forsyth uchar *mep;
3237da2899SCharles.Forsyth uint size;
3337da2899SCharles.Forsyth //print("conv(%d)\n", nap);
3437da2899SCharles.Forsyth if(p + 1 > ep)
3537da2899SCharles.Forsyth return 0;
3637da2899SCharles.Forsyth f->type = *p++;
3737da2899SCharles.Forsyth //print("type %c\n", f->type);
3837da2899SCharles.Forsyth switch(f->type) {
3937da2899SCharles.Forsyth case LogfsLogTstart:
4037da2899SCharles.Forsyth case LogfsLogTcreate:
4137da2899SCharles.Forsyth case LogfsLogTtrunc:
4237da2899SCharles.Forsyth case LogfsLogTremove:
4337da2899SCharles.Forsyth case LogfsLogTwrite:
4437da2899SCharles.Forsyth case LogfsLogTwstat:
4537da2899SCharles.Forsyth break;
4637da2899SCharles.Forsyth case LogfsLogTend:
4737da2899SCharles.Forsyth return 1;
4837da2899SCharles.Forsyth default:
4937da2899SCharles.Forsyth return 0;
5037da2899SCharles.Forsyth }
5137da2899SCharles.Forsyth if(p + BIT16SZ > ep)
5237da2899SCharles.Forsyth return 0;
5337da2899SCharles.Forsyth size = GBIT16(p); p += BIT16SZ;
5437da2899SCharles.Forsyth //print("size %ud\n", size);
5537da2899SCharles.Forsyth if(p + size > ep)
5637da2899SCharles.Forsyth return 0;
5737da2899SCharles.Forsyth mep = p + size;
5837da2899SCharles.Forsyth if(p + BIT32SZ > mep)
5937da2899SCharles.Forsyth return 0;
6037da2899SCharles.Forsyth f->path = GBIT32(p); p += BIT32SZ;
6137da2899SCharles.Forsyth switch(f->type) {
6237da2899SCharles.Forsyth case LogfsLogTstart:
6337da2899SCharles.Forsyth /* 's' size[2] path[4] nerase[4] */
6437da2899SCharles.Forsyth if(p + BIT32SZ > ep)
6537da2899SCharles.Forsyth return 0;
6637da2899SCharles.Forsyth f->u.start.nerase = GBIT32(p); p += BIT32SZ;
6737da2899SCharles.Forsyth break;
6837da2899SCharles.Forsyth case LogfsLogTcreate:
6937da2899SCharles.Forsyth /* 'c' size[2] path[4] perm[4] newpath[4] mtime[4] cvers[4] name[s] uid[s] gid[s] */
7037da2899SCharles.Forsyth if(p + 4 * BIT32SZ > mep)
7137da2899SCharles.Forsyth return 0;
7237da2899SCharles.Forsyth f->u.create.perm = GBIT32(p); p+= BIT32SZ;
7337da2899SCharles.Forsyth f->u.create.newpath = GBIT32(p); p+= BIT32SZ;
7437da2899SCharles.Forsyth f->u.create.mtime = GBIT32(p); p+= BIT32SZ;
7537da2899SCharles.Forsyth f->u.create.cvers = GBIT32(p); p+= BIT32SZ;
7637da2899SCharles.Forsyth if(!logfsgn(&p, mep, &f->u.create.name)
7737da2899SCharles.Forsyth || !logfsgn(&p, mep, &f->u.create.uid)
7837da2899SCharles.Forsyth || !logfsgn(&p, mep, &f->u.create.gid))
7937da2899SCharles.Forsyth return 0;
8037da2899SCharles.Forsyth break;
8137da2899SCharles.Forsyth case LogfsLogTremove:
8237da2899SCharles.Forsyth /* 'r' size[2] path[4] mtime[4] muid[s] */
8337da2899SCharles.Forsyth if(p + BIT32SZ > mep)
8437da2899SCharles.Forsyth return 0;
8537da2899SCharles.Forsyth f->u.remove.mtime = GBIT32(p); p += BIT32SZ;
8637da2899SCharles.Forsyth if(!logfsgn(&p, mep, &f->u.remove.muid))
8737da2899SCharles.Forsyth return 0;
8837da2899SCharles.Forsyth break;
8937da2899SCharles.Forsyth case LogfsLogTtrunc:
9037da2899SCharles.Forsyth /* 't' size[2] path[4] mtime[4] cvers[4] muid[s] */
9137da2899SCharles.Forsyth if(p + 2 * BIT32SZ > mep)
9237da2899SCharles.Forsyth return 0;
9337da2899SCharles.Forsyth f->u.trunc.mtime = GBIT32(p); p += BIT32SZ;
9437da2899SCharles.Forsyth f->u.trunc.cvers = GBIT32(p); p += BIT32SZ;
9537da2899SCharles.Forsyth if(!logfsgn(&p, mep, &f->u.trunc.muid))
9637da2899SCharles.Forsyth return 0;
9737da2899SCharles.Forsyth break;
9837da2899SCharles.Forsyth case LogfsLogTwrite:
9937da2899SCharles.Forsyth /* 'w' size[2] path[4] offset[4] count[2] mtime[4] cvers[4] muid[s] flashaddr[4] [data[n]] */
10037da2899SCharles.Forsyth if(p + BIT32SZ + BIT16SZ + 2 * BIT32SZ > mep)
10137da2899SCharles.Forsyth return 0;
10237da2899SCharles.Forsyth f->u.write.offset = GBIT32(p); p += BIT32SZ;
10337da2899SCharles.Forsyth f->u.write.count = GBIT16(p); p += BIT16SZ;
10437da2899SCharles.Forsyth f->u.write.mtime = GBIT32(p); p += BIT32SZ;
10537da2899SCharles.Forsyth f->u.write.cvers = GBIT32(p); p += BIT32SZ;
10637da2899SCharles.Forsyth if(!logfsgn(&p, mep, &f->u.write.muid))
10737da2899SCharles.Forsyth return 0;
10837da2899SCharles.Forsyth if(p + BIT32SZ > mep)
10937da2899SCharles.Forsyth return 0;
11037da2899SCharles.Forsyth f->u.write.flashaddr = GBIT32(p); p += BIT32SZ;
11137da2899SCharles.Forsyth if(f->u.write.flashaddr & LogAddr) {
11237da2899SCharles.Forsyth if(p + f->u.write.count > mep)
11337da2899SCharles.Forsyth return 0;
11437da2899SCharles.Forsyth f->u.write.data = p;
11537da2899SCharles.Forsyth p += f->u.write.count;
11637da2899SCharles.Forsyth }
11737da2899SCharles.Forsyth else
11837da2899SCharles.Forsyth f->u.write.data = nil;
11937da2899SCharles.Forsyth break;
12037da2899SCharles.Forsyth case LogfsLogTwstat:
12137da2899SCharles.Forsyth /* 'W' size[2] path[4] name[s] perm[4] uid[s] gid[s] mtime[4] muid[s] or */
12237da2899SCharles.Forsyth /* 'W' size[2] path[4] name[s] perm[4] gid[s] mtime[4] muid[s] */
12337da2899SCharles.Forsyth if(!logfsgn(&p, mep, &f->u.wstat.name))
12437da2899SCharles.Forsyth return 0;
12537da2899SCharles.Forsyth if(p + BIT32SZ > mep)
12637da2899SCharles.Forsyth return 0;
12737da2899SCharles.Forsyth f->u.wstat.perm = GBIT32(p); p += BIT32SZ;
12837da2899SCharles.Forsyth if(!logfsgn(&p, mep, &f->u.wstat.uid))
12937da2899SCharles.Forsyth return 0;
13037da2899SCharles.Forsyth if(!logfsgn(&p, mep, &f->u.wstat.gid))
13137da2899SCharles.Forsyth return 0;
13237da2899SCharles.Forsyth if(p + BIT32SZ > mep)
13337da2899SCharles.Forsyth return 0;
13437da2899SCharles.Forsyth f->u.wstat.mtime = GBIT32(p); p += BIT32SZ;
13537da2899SCharles.Forsyth if(!logfsgn(&p, mep, &f->u.wstat.muid))
13637da2899SCharles.Forsyth return 0;
13737da2899SCharles.Forsyth break;
13837da2899SCharles.Forsyth default:
13937da2899SCharles.Forsyth return 0;
14037da2899SCharles.Forsyth }
14137da2899SCharles.Forsyth if(p != mep)
14237da2899SCharles.Forsyth return 0;
14337da2899SCharles.Forsyth return p - ap;
14437da2899SCharles.Forsyth }
14537da2899SCharles.Forsyth
14637da2899SCharles.Forsyth uint
logfssizeS2M(LogMessage * m)14737da2899SCharles.Forsyth logfssizeS2M(LogMessage *m)
14837da2899SCharles.Forsyth {
14937da2899SCharles.Forsyth switch(m->type) {
15037da2899SCharles.Forsyth case LogfsLogTend:
15137da2899SCharles.Forsyth return 1;
15237da2899SCharles.Forsyth case LogfsLogTstart:
15337da2899SCharles.Forsyth return 11;
15437da2899SCharles.Forsyth case LogfsLogTcreate:
15537da2899SCharles.Forsyth /* 'c' size[2] path[4] perm[4] newpath[4] mtime[4] cvers[4] name[s] uid[s] gid[s] */
15637da2899SCharles.Forsyth return 1 + BIT16SZ + 5 * BIT32SZ
15737da2899SCharles.Forsyth + sn(m->u.create.name) + sn(m->u.create.uid) + sn(m->u.create.gid);
15837da2899SCharles.Forsyth case LogfsLogTremove:
15937da2899SCharles.Forsyth /* 'r' size[2] path[4] mtime[4] muid[s] */
16037da2899SCharles.Forsyth return 1 + BIT16SZ + 2 * BIT32SZ + sn(m->u.remove.muid);
16137da2899SCharles.Forsyth case LogfsLogTtrunc:
16237da2899SCharles.Forsyth /* 't' size[2] path[4] mtime[4] cvers[4] muid[s] */
16337da2899SCharles.Forsyth return 1 + BIT16SZ + 3 * BIT32SZ + sn(m->u.trunc.muid);
16437da2899SCharles.Forsyth case LogfsLogTwrite:
16537da2899SCharles.Forsyth /* 'w' size[2] path[4] offset[4] count[2] mtime[4] cvers[4] muid[s] flashaddr[4] [data[n]] */
16637da2899SCharles.Forsyth return 1 + BIT16SZ + 2 * BIT32SZ + BIT16SZ + 2 * BIT32SZ + sn(m->u.write.muid)
16737da2899SCharles.Forsyth + BIT32SZ + (m->u.write.data ? m->u.write.count : 0);
16837da2899SCharles.Forsyth case LogfsLogTwstat:
16937da2899SCharles.Forsyth /* 'W' size[2] path[4] name[s] perm[4] uid[s] gid[s] mtime[4] muid[s] */
17037da2899SCharles.Forsyth /* 'W' size[2] path[4] name[s] perm[4] gid[s] mtime[4] muid[s] */
17137da2899SCharles.Forsyth return 1 + BIT16SZ + BIT32SZ + sn(m->u.wstat.name) + BIT32SZ
17237da2899SCharles.Forsyth + sn(m->u.wstat.uid)
17337da2899SCharles.Forsyth + sn(m->u.wstat.gid) + BIT32SZ + sn(m->u.wstat.muid);
17437da2899SCharles.Forsyth default:
17537da2899SCharles.Forsyth return 0;
17637da2899SCharles.Forsyth }
17737da2899SCharles.Forsyth }
17837da2899SCharles.Forsyth
17937da2899SCharles.Forsyth uint
logfsconvS2M(LogMessage * s,uchar * ap,uint nap)18037da2899SCharles.Forsyth logfsconvS2M(LogMessage *s, uchar *ap, uint nap)
18137da2899SCharles.Forsyth {
18237da2899SCharles.Forsyth uint size;
18337da2899SCharles.Forsyth uchar *p;
18437da2899SCharles.Forsyth size = logfssizeS2M(s);
18537da2899SCharles.Forsyth if(size == 0 || size > nap)
18637da2899SCharles.Forsyth return 0;
18737da2899SCharles.Forsyth p = ap;
18837da2899SCharles.Forsyth *p++ = s->type;
18937da2899SCharles.Forsyth if(s->type == LogfsLogTend)
19037da2899SCharles.Forsyth return 1;
19137da2899SCharles.Forsyth size -= 1 + BIT16SZ;
19237da2899SCharles.Forsyth PBIT16(p, size); p += BIT16SZ;
19337da2899SCharles.Forsyth PBIT32(p, s->path); p += BIT32SZ;
19437da2899SCharles.Forsyth switch(s->type) {
19537da2899SCharles.Forsyth case LogfsLogTstart:
19637da2899SCharles.Forsyth PBIT32(p, s->u.start.nerase); p += BIT32SZ;
19737da2899SCharles.Forsyth break;
19837da2899SCharles.Forsyth case LogfsLogTcreate:
19937da2899SCharles.Forsyth /* 'c' size[2] path[4] perm[4] newpath[4] mtime[4] cvers[4] name[s] uid[s] gid[s] */
20037da2899SCharles.Forsyth PBIT32(p, s->u.create.perm); p += BIT32SZ;
20137da2899SCharles.Forsyth PBIT32(p, s->u.create.newpath); p += BIT32SZ;
20237da2899SCharles.Forsyth PBIT32(p, s->u.create.mtime); p += BIT32SZ;
20337da2899SCharles.Forsyth PBIT32(p, s->u.create.cvers); p += BIT32SZ;
20437da2899SCharles.Forsyth pn(&p, s->u.create.name);
20537da2899SCharles.Forsyth pn(&p, s->u.create.uid);
20637da2899SCharles.Forsyth pn(&p, s->u.create.gid);
20737da2899SCharles.Forsyth break;
20837da2899SCharles.Forsyth case LogfsLogTremove:
20937da2899SCharles.Forsyth /* 'r' size[2] path[4] mtime[4] muid[s] */
21037da2899SCharles.Forsyth PBIT32(p, s->u.remove.mtime); p += BIT32SZ;
21137da2899SCharles.Forsyth pn(&p, s->u.remove.muid);
21237da2899SCharles.Forsyth break;
21337da2899SCharles.Forsyth case LogfsLogTtrunc:
21437da2899SCharles.Forsyth /* 't' size[2] path[4] mtime[4] cvers[4] muid[s] */
21537da2899SCharles.Forsyth PBIT32(p, s->u.trunc.mtime); p += BIT32SZ;
21637da2899SCharles.Forsyth PBIT32(p, s->u.trunc.cvers); p += BIT32SZ;
21737da2899SCharles.Forsyth pn(&p, s->u.trunc.muid);
21837da2899SCharles.Forsyth break;
21937da2899SCharles.Forsyth case LogfsLogTwrite:
22037da2899SCharles.Forsyth /* 'w' size[2] path[4] offset[4] count[2] mtime[4] cvers[4] muid[s] flashaddr[4] [data[n]] */
22137da2899SCharles.Forsyth PBIT32(p, s->u.write.offset); p += BIT32SZ;
22237da2899SCharles.Forsyth PBIT16(p, s->u.write.count); p += BIT16SZ;
22337da2899SCharles.Forsyth PBIT32(p, s->u.write.mtime); p += BIT32SZ;
22437da2899SCharles.Forsyth PBIT32(p, s->u.write.cvers); p += BIT32SZ;
22537da2899SCharles.Forsyth pn(&p, s->u.write.muid);
22637da2899SCharles.Forsyth PBIT32(p, s->u.write.flashaddr); p += BIT32SZ;
22737da2899SCharles.Forsyth if(s->u.write.data) {
22837da2899SCharles.Forsyth memmove(p, s->u.write.data, s->u.write.count);
22937da2899SCharles.Forsyth p += s->u.write.count;
23037da2899SCharles.Forsyth }
23137da2899SCharles.Forsyth break;
23237da2899SCharles.Forsyth case LogfsLogTwstat:
23337da2899SCharles.Forsyth /* 'W' size[2] path[4] name[s] perm[4] uid[s] gid[s] mtime[4] muid[s] */
23437da2899SCharles.Forsyth /* 'W' size[2] path[4] name[s] perm[4] gid[s] mtime[4] muid[s] */
23537da2899SCharles.Forsyth pn(&p, s->u.wstat.name);
23637da2899SCharles.Forsyth PBIT32(p, s->u.wstat.perm); p += BIT32SZ;
23737da2899SCharles.Forsyth pn(&p, s->u.wstat.uid);
23837da2899SCharles.Forsyth pn(&p, s->u.wstat.gid);
23937da2899SCharles.Forsyth PBIT32(p, s->u.wstat.mtime); p+= BIT32SZ;
24037da2899SCharles.Forsyth pn(&p, s->u.wstat.muid);
24137da2899SCharles.Forsyth break;
24237da2899SCharles.Forsyth default:
24337da2899SCharles.Forsyth return 0;
24437da2899SCharles.Forsyth }
24537da2899SCharles.Forsyth return p - ap;
24637da2899SCharles.Forsyth }
24737da2899SCharles.Forsyth
24837da2899SCharles.Forsyth void
logfsdumpS(LogMessage * m)24937da2899SCharles.Forsyth logfsdumpS(LogMessage *m)
25037da2899SCharles.Forsyth {
25137da2899SCharles.Forsyth switch(m->type) {
25237da2899SCharles.Forsyth case LogfsLogTend:
25337da2899SCharles.Forsyth print("LogfsLogTend()");
25437da2899SCharles.Forsyth break;
25537da2899SCharles.Forsyth case LogfsLogTstart:
25637da2899SCharles.Forsyth print("LogfsLogTstart(path=%ud, nerase=%ud)", m->path, m->u.start.nerase);
25737da2899SCharles.Forsyth break;
25837da2899SCharles.Forsyth case LogfsLogTcreate:
25937da2899SCharles.Forsyth print("LogfsLogTcreate(path=%ud, perm=0%uo, newpath=%ud, mtime=%ud, cvers=%ud, name=%s, uid=%s, gid=%s)",
26037da2899SCharles.Forsyth m->path, m->u.create.perm, m->u.create.newpath, m->u.create.mtime, m->u.create.cvers,
26137da2899SCharles.Forsyth m->u.create.name, m->u.create.uid, m->u.create.gid);
26237da2899SCharles.Forsyth break;
26337da2899SCharles.Forsyth case LogfsLogTremove:
26437da2899SCharles.Forsyth print("LogfsLogTremove(path=%ud, mtime=%ud, muid=%s)",
26537da2899SCharles.Forsyth m->path, m->u.remove.mtime, m->u.remove.muid);
26637da2899SCharles.Forsyth break;
26737da2899SCharles.Forsyth case LogfsLogTtrunc:
26837da2899SCharles.Forsyth print("LogfsLogTtrunc(path=%ud, mtime=%ud, cvers=%ud, muid=%s)",
26937da2899SCharles.Forsyth m->path, m->u.trunc.mtime, m->u.trunc.cvers, m->u.trunc.muid);
27037da2899SCharles.Forsyth break;
27137da2899SCharles.Forsyth case LogfsLogTwrite:
27237da2899SCharles.Forsyth print("LogfsLogTwrite(path=%ud, offset=%ud, count=%ud, mtime=%ud, cvers=%ud, muid=%s, flashaddr=0x%.8ux)",
27337da2899SCharles.Forsyth m->path, m->u.write.offset, m->u.write.count, m->u.write.mtime, m->u.write.cvers, m->u.write.muid,
27437da2899SCharles.Forsyth m->u.write.flashaddr);
27537da2899SCharles.Forsyth break;
27637da2899SCharles.Forsyth case LogfsLogTwstat:
27737da2899SCharles.Forsyth print("LogfsLogTwstat(path=%ud, name=%s, perm=0%uo, uid=%s, gid=%s, mtime=%ud, muid=%s)",
27837da2899SCharles.Forsyth m->path, m->u.wstat.name, m->u.wstat.perm, m->u.wstat.uid, m->u.wstat.gid,
27937da2899SCharles.Forsyth m->u.wstat.mtime, m->u.wstat.muid);
28037da2899SCharles.Forsyth break;
28137da2899SCharles.Forsyth default:
28237da2899SCharles.Forsyth print("LogfsLogTother(%c)", m->type);
28337da2899SCharles.Forsyth break;
28437da2899SCharles.Forsyth }
28537da2899SCharles.Forsyth }
286