123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- #include <u.h>
- #include <libc.h>
- #include "flashfs.h"
- int
- convJ2M(Jrec *j, uchar *buff)
- {
- int m, n;
- switch(j->type) {
- case FT_create:
- if(j->mode & (1 << 8)) {
- if(j->mode & DMDIR)
- j->type = FT_DCREATE1;
- else
- j->type = FT_FCREATE1;
- }
- else {
- if(j->mode & DMDIR)
- j->type = FT_DCREATE0;
- else
- j->type = FT_FCREATE0;
- }
- case FT_FCREATE0:
- case FT_FCREATE1:
- case FT_DCREATE0:
- case FT_DCREATE1:
- n = putc3(&buff[0], j->fnum);
- goto create;
- case FT_chmod:
- if(j->mode & (1 << 8))
- j->type = FT_CHMOD1;
- else
- j->type = FT_CHMOD0;
- case FT_CHMOD0:
- case FT_CHMOD1:
- n = putc3(&buff[0], j->fnum);
- buff[n++] = j->mode;
- return n + putc3(&buff[n], j->mnum);
- case FT_REMOVE:
- return putc3(&buff[0], j->fnum);
- case FT_WRITE:
- n = putc3(&buff[0], j->fnum);
- n += putc3(&buff[n], j->mtime);
- n += putc3(&buff[n], j->offset);
- return n + putc3(&buff[n], j->size - 1);
- case FT_AWRITE:
- n = putc3(&buff[0], j->fnum);
- n += putc3(&buff[n], j->offset);
- return n + putc3(&buff[n], j->size - 1);
- case FT_trunc:
- if(j->mode & (1 << 8))
- j->type = FT_TRUNC1;
- else
- j->type = FT_TRUNC0;
- case FT_TRUNC0:
- case FT_TRUNC1:
- n = putc3(&buff[0], j->fnum);
- n += putc3(&buff[n], j->tnum);
- goto create;
- case FT_SUMMARY:
- case FT_SUMBEG:
- return putc3(&buff[0], j->seq);
- case FT_SUMEND:
- return 0;
- create:
- buff[n++] = j->mode;
- n += putc3(&buff[n], j->mtime);
- n += putc3(&buff[n], j->parent);
- m = strlen(j->name);
- memmove(&buff[n], j->name, m);
- n += m;
- buff[n++] = '\0';
- return n;
- }
- return -1;
- }
- int
- convM2J(Jrec *j, uchar *buff)
- {
- int m, n;
- j->type = buff[0];
- switch(j->type) {
- case FT_FCREATE0:
- case FT_FCREATE1:
- case FT_DCREATE0:
- case FT_DCREATE1:
- n = 1 + getc3(&buff[1], &j->fnum);
- j->mode = buff[n++];
- switch(j->type) {
- case FT_FCREATE0:
- break;
- case FT_FCREATE1:
- j->mode |= 1 << 8;
- break;
- case FT_DCREATE0:
- j->mode |= DMDIR;
- break;
- case FT_DCREATE1:
- j->mode |= DMDIR | (1 << 8);
- break;
- }
- j->type = FT_create;
- goto create;
- case FT_CHMOD0:
- case FT_CHMOD1:
- n = 1 + getc3(&buff[1], &j->fnum);
- j->mode = buff[n++];
- switch(j->type) {
- case FT_CHMOD0:
- break;
- case FT_CHMOD1:
- j->mode |= 1 << 8;
- break;
- }
- j->type = FT_chmod;
- return n + getc3(&buff[n], &j->mnum);
- case FT_REMOVE:
- return 1 + getc3(&buff[1], &j->fnum);
- case FT_WRITE:
- n = 1 + getc3(&buff[1], &j->fnum);
- n += getc3(&buff[n], &j->mtime);
- n += getc3(&buff[n], &j->offset);
- n += getc3(&buff[n], &j->size);
- j->size++;
- return n;
- case FT_AWRITE:
- n = 1 + getc3(&buff[1], &j->fnum);
- n += getc3(&buff[n], &j->offset);
- n += getc3(&buff[n], &j->size);
- j->size++;
- return n;
- case FT_TRUNC0:
- case FT_TRUNC1:
- n = 1 + getc3(&buff[1], &j->fnum);
- n += getc3(&buff[n], &j->tnum);
- j->mode = buff[n++];
- switch(j->type) {
- case FT_TRUNC0:
- break;
- case FT_TRUNC1:
- j->mode |= 1 << 8;
- break;
- }
- j->type = FT_trunc;
- goto create;
- case FT_SUMMARY:
- case FT_SUMBEG:
- return 1 + getc3(&buff[1], &j->seq);
- case FT_SUMEND:
- return 1;
- create:
- n += getc3(&buff[n], &j->mtime);
- n += getc3(&buff[n], &j->parent);
- memmove(j->name, &buff[n], MAXNSIZE+1);
- j->name[MAXNSIZE+1] = '\0';
- m = strlen(j->name);
- if(m > MAXNSIZE)
- return -1;
- return n + m + 1;
- }
- return -1;
- }
- int
- Jconv(Fmt *fp)
- {
- Jrec *j;
- j = va_arg(fp->args, Jrec *);
- switch(j->type) {
- case FT_create:
- case FT_FCREATE0:
- case FT_FCREATE1:
- case FT_DCREATE0:
- case FT_DCREATE1:
- return fmtprint(fp, "create f %ld p %ld t %lud m %ulo %s",
- j->fnum, j->parent, j->mtime, j->mode, j->name);
- case FT_chmod:
- case FT_CHMOD0:
- case FT_CHMOD1:
- return fmtprint(fp, "chmod f %ld m %ulo #%ld",
- j->fnum, j->mode, j->mnum);
- case FT_REMOVE:
- return fmtprint(fp, "remove f %ld", j->fnum);
- case FT_WRITE:
- return fmtprint(fp, "write f %ld z %ld o %ld t %uld",
- j->fnum, j->size, j->offset, j->mtime);
- case FT_AWRITE:
- return fmtprint(fp, "awrite f %ld z %ld o %ld",
- j->fnum, j->size, j->offset);
- case FT_trunc:
- case FT_TRUNC0:
- case FT_TRUNC1:
- return fmtprint(fp, "trunc f %ld o %ld p %ld t %ld m %ulo %s",
- j->fnum, j->tnum, j->parent, j->mtime, j->mode, j->name);
- case FT_SUMMARY:
- return fmtprint(fp, "summary %ld",
- j->seq);
- case FT_SUMBEG:
- return fmtprint(fp, "sumbeg %ld",
- j->seq);
- case FT_SUMEND:
- return fmtprint(fp, "end");
- default:
- return fmtprint(fp, "?type %d", j->type);
- }
- }
|