220 lines · 4.7 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #include <u.h>#include <libc.h>#include "flashfs.h" intconvJ2M(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;} intconvM2J(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;} intJconv(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);	}}