vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

convD2M.c (1398B)


      1 #include "u.h"
      2 #include "lib.h"
      3 #include "fcall.h"
      4 
      5 uint
      6 sizeD2M(Dir *d)
      7 {
      8 	char *sv[4];
      9 	int i, ns;
     10 
     11 	sv[0] = d->name;
     12 	sv[1] = d->uid;
     13 	sv[2] = d->gid;
     14 	sv[3] = d->muid;
     15 
     16 	ns = 0;
     17 	for(i = 0; i < 4; i++)
     18 		if(sv[i])
     19 			ns += strlen(sv[i]);
     20 
     21 	return STATFIXLEN + ns;
     22 }
     23 
     24 uint
     25 convD2M(Dir *d, uchar *buf, uint nbuf)
     26 {
     27 	uchar *p, *ebuf;
     28 	char *sv[4];
     29 	int i, ns, nsv[4], ss;
     30 
     31 	if(nbuf < BIT16SZ)
     32 		return 0;
     33 
     34 	p = buf;
     35 	ebuf = buf + nbuf;
     36 
     37 	sv[0] = d->name;
     38 	sv[1] = d->uid;
     39 	sv[2] = d->gid;
     40 	sv[3] = d->muid;
     41 
     42 	ns = 0;
     43 	for(i = 0; i < 4; i++){
     44 		if(sv[i])
     45 			nsv[i] = strlen(sv[i]);
     46 		else
     47 			nsv[i] = 0;
     48 		ns += nsv[i];
     49 	}
     50 
     51 	ss = STATFIXLEN + ns;
     52 
     53 	/* set size before erroring, so user can know how much is needed */
     54 	/* note that length excludes count field itself */
     55 	PBIT16(p, ss-BIT16SZ);
     56 	p += BIT16SZ;
     57 
     58 	if(ss > nbuf)
     59 		return BIT16SZ;
     60 
     61 	PBIT16(p, d->type);
     62 	p += BIT16SZ;
     63 	PBIT32(p, d->dev);
     64 	p += BIT32SZ;
     65 	PBIT8(p, d->qid.type);
     66 	p += BIT8SZ;
     67 	PBIT32(p, d->qid.vers);
     68 	p += BIT32SZ;
     69 	PBIT64(p, d->qid.path);
     70 	p += BIT64SZ;
     71 	PBIT32(p, d->mode);
     72 	p += BIT32SZ;
     73 	PBIT32(p, d->atime);
     74 	p += BIT32SZ;
     75 	PBIT32(p, d->mtime);
     76 	p += BIT32SZ;
     77 	PBIT64(p, d->length);
     78 	p += BIT64SZ;
     79 
     80 	for(i = 0; i < 4; i++){
     81 		ns = nsv[i];
     82 		if(p + ns + BIT16SZ > ebuf)
     83 			return 0;
     84 		PBIT16(p, ns);
     85 		p += BIT16SZ;
     86 		if(ns)
     87 			memmove(p, sv[i], ns);
     88 		p += ns;
     89 	}
     90 
     91 	if(ss != p - buf)
     92 		return 0;
     93 
     94 	return p - buf;
     95 }