Charles.Forsyth20060303a828770d19 years agoHistory
93 lines · 1.4 KB · C
RawDownload
#include	"lib9.h"#include	"fcall.h" intstatcheck(uchar *buf, uint nbuf){	uchar *ebuf;	int i; 	ebuf = buf + nbuf; 	if(nbuf < STATFIXLEN || nbuf != BIT16SZ + GBIT16(buf))		return -1; 	buf += STATFIXLEN - 4 * BIT16SZ; 	for(i = 0; i < 4; i++){		if(buf + BIT16SZ > ebuf)			return -1;		buf += BIT16SZ + GBIT16(buf);	} 	if(buf != ebuf)		return -1; 	return 0;} static char nullstring[] = ""; uintconvM2D(uchar *buf, uint nbuf, Dir *d, char *strs){	uchar *p, *ebuf;	char *sv[4];	int i, ns; 	if(nbuf < STATFIXLEN)		return 0;  	p = buf;	ebuf = buf + nbuf; 	p += BIT16SZ;	/* ignore size */	d->type = GBIT16(p);	p += BIT16SZ;	d->dev = GBIT32(p);	p += BIT32SZ;	d->qid.type = GBIT8(p);	p += BIT8SZ;	d->qid.vers = GBIT32(p);	p += BIT32SZ;	d->qid.path = GBIT64(p);	p += BIT64SZ;	d->mode = GBIT32(p);	p += BIT32SZ;	d->atime = GBIT32(p);	p += BIT32SZ;	d->mtime = GBIT32(p);	p += BIT32SZ;	d->length = GBIT64(p);	p += BIT64SZ; 	for(i = 0; i < 4; i++){		if(p + BIT16SZ > ebuf)			return 0;		ns = GBIT16(p);		p += BIT16SZ;		if(p + ns > ebuf)			return 0;		if(strs){			sv[i] = strs;			memmove(strs, p, ns);			strs += ns;			*strs++ = '\0';		}		p += ns;	} 	if(strs){		d->name = sv[0];		d->uid = sv[1];		d->gid = sv[2];		d->muid = sv[3];	}else{		d->name = nullstring;		d->uid = nullstring;		d->gid = nullstring;		d->muid = nullstring;	}		return p - buf;}