plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

convM2D.c (1503B)


      1 #include	<u.h>
      2 #include	<libc.h>
      3 #include	<fcall.h>
      4 
      5 int
      6 statcheck(uchar *buf, uint nbuf)
      7 {
      8 	uchar *ebuf;
      9 	int i, nstr;
     10 
     11 	ebuf = buf + nbuf;
     12 
     13 	if(nbuf < STATFIXLEN || nbuf != BIT16SZ + GBIT16(buf))
     14 		return -1;
     15 
     16 	buf += STATFIXLEN - 4 * BIT16SZ;
     17 
     18 	nstr = 4;
     19 	for(i = 0; i < nstr; i++){
     20 		if(buf + BIT16SZ > ebuf)
     21 			return -1;
     22 		buf += BIT16SZ + GBIT16(buf);
     23 	}
     24 
     25 	if(buf != ebuf)
     26 		return -1;
     27 
     28 	return 0;
     29 }
     30 
     31 static char nullstring[] = "";
     32 
     33 uint
     34 convM2D(uchar *buf, uint nbuf, Dir *d, char *strs)
     35 {
     36 	uchar *p, *ebuf;
     37 	char *sv[5];
     38 	int i, ns, nstr;
     39 
     40 	if(nbuf < STATFIXLEN)
     41 		return 0;
     42 
     43 	p = buf;
     44 	ebuf = buf + nbuf;
     45 
     46 	p += BIT16SZ;	/* ignore size */
     47 	d->type = GBIT16(p);
     48 	p += BIT16SZ;
     49 	d->dev = GBIT32(p);
     50 	p += BIT32SZ;
     51 	d->qid.type = GBIT8(p);
     52 	p += BIT8SZ;
     53 	d->qid.vers = GBIT32(p);
     54 	p += BIT32SZ;
     55 	d->qid.path = GBIT64(p);
     56 	p += BIT64SZ;
     57 	d->mode = GBIT32(p);
     58 	p += BIT32SZ;
     59 	d->atime = GBIT32(p);
     60 	p += BIT32SZ;
     61 	d->mtime = GBIT32(p);
     62 	p += BIT32SZ;
     63 	d->length = GBIT64(p);
     64 	p += BIT64SZ;
     65 
     66 	nstr = 4;
     67 	for(i = 0; i < nstr; i++){
     68 		if(p + BIT16SZ > ebuf)
     69 			return 0;
     70 		ns = GBIT16(p);
     71 		p += BIT16SZ;
     72 		if(p + ns > ebuf)
     73 			return 0;
     74 		if(strs){
     75 			sv[i] = strs;
     76 			memmove(strs, p, ns);
     77 			strs += ns;
     78 			*strs++ = '\0';
     79 		}
     80 		p += ns;
     81 	}
     82 
     83 	if(strs){
     84 		d->name = sv[0];
     85 		d->uid = sv[1];
     86 		d->gid = sv[2];
     87 		d->muid = sv[3];
     88 		d->ext = nullstring;
     89 	}else{
     90 		d->name = nullstring;
     91 		d->uid = nullstring;
     92 		d->gid = nullstring;
     93 		d->muid = nullstring;
     94 		d->ext = nullstring;
     95 	}
     96 
     97 	return p - buf;
     98 }