plan9port

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

convS2M.c (5202B)


      1 #include	<u.h>
      2 #include	<libc.h>
      3 #include	<fcall.h>
      4 
      5 static
      6 uchar*
      7 pstring(uchar *p, char *s)
      8 {
      9 	uint n;
     10 
     11 	if(s == nil){
     12 		PBIT16(p, 0);
     13 		p += BIT16SZ;
     14 		return p;
     15 	}
     16 
     17 	n = strlen(s);
     18 	PBIT16(p, n);
     19 	p += BIT16SZ;
     20 	memmove(p, s, n);
     21 	p += n;
     22 	return p;
     23 }
     24 
     25 static
     26 uchar*
     27 pqid(uchar *p, Qid *q)
     28 {
     29 	PBIT8(p, q->type);
     30 	p += BIT8SZ;
     31 	PBIT32(p, q->vers);
     32 	p += BIT32SZ;
     33 	PBIT64(p, q->path);
     34 	p += BIT64SZ;
     35 	return p;
     36 }
     37 
     38 static
     39 uint
     40 stringsz(char *s)
     41 {
     42 	if(s == nil)
     43 		return BIT16SZ;
     44 
     45 	return BIT16SZ+strlen(s);
     46 }
     47 
     48 uint
     49 sizeS2M(Fcall *f)
     50 {
     51 	uint n;
     52 	int i;
     53 
     54 	n = 0;
     55 	n += BIT32SZ;	/* size */
     56 	n += BIT8SZ;	/* type */
     57 	n += BIT16SZ;	/* tag */
     58 
     59 	switch(f->type)
     60 	{
     61 	default:
     62 		return 0;
     63 
     64 	case Tversion:
     65 		n += BIT32SZ;
     66 		n += stringsz(f->version);
     67 		break;
     68 
     69 	case Tflush:
     70 		n += BIT16SZ;
     71 		break;
     72 
     73 	case Tauth:
     74 		n += BIT32SZ;
     75 		n += stringsz(f->uname);
     76 		n += stringsz(f->aname);
     77 		break;
     78 
     79 	case Tattach:
     80 		n += BIT32SZ;
     81 		n += BIT32SZ;
     82 		n += stringsz(f->uname);
     83 		n += stringsz(f->aname);
     84 		break;
     85 
     86 	case Twalk:
     87 		n += BIT32SZ;
     88 		n += BIT32SZ;
     89 		n += BIT16SZ;
     90 		for(i=0; i<f->nwname; i++)
     91 			n += stringsz(f->wname[i]);
     92 		break;
     93 
     94 	case Topen:
     95 	case Topenfd:
     96 		n += BIT32SZ;
     97 		n += BIT8SZ;
     98 		break;
     99 
    100 	case Tcreate:
    101 		n += BIT32SZ;
    102 		n += stringsz(f->name);
    103 		n += BIT32SZ;
    104 		n += BIT8SZ;
    105 		break;
    106 
    107 	case Tread:
    108 		n += BIT32SZ;
    109 		n += BIT64SZ;
    110 		n += BIT32SZ;
    111 		break;
    112 
    113 	case Twrite:
    114 		n += BIT32SZ;
    115 		n += BIT64SZ;
    116 		n += BIT32SZ;
    117 		n += f->count;
    118 		break;
    119 
    120 	case Tclunk:
    121 	case Tremove:
    122 		n += BIT32SZ;
    123 		break;
    124 
    125 	case Tstat:
    126 		n += BIT32SZ;
    127 		break;
    128 
    129 	case Twstat:
    130 		n += BIT32SZ;
    131 		n += BIT16SZ;
    132 		n += f->nstat;
    133 		break;
    134 /*
    135  */
    136 
    137 	case Rversion:
    138 		n += BIT32SZ;
    139 		n += stringsz(f->version);
    140 		break;
    141 
    142 	case Rerror:
    143 		n += stringsz(f->ename);
    144 		break;
    145 
    146 	case Rflush:
    147 		break;
    148 
    149 	case Rauth:
    150 		n += QIDSZ;
    151 		break;
    152 
    153 	case Rattach:
    154 		n += QIDSZ;
    155 		break;
    156 
    157 	case Rwalk:
    158 		n += BIT16SZ;
    159 		n += f->nwqid*QIDSZ;
    160 		break;
    161 
    162 	case Ropen:
    163 	case Rcreate:
    164 		n += QIDSZ;
    165 		n += BIT32SZ;
    166 		break;
    167 
    168 	case Ropenfd:
    169 		n += QIDSZ;
    170 		n += BIT32SZ;
    171 		n += BIT32SZ;
    172 		break;
    173 
    174 	case Rread:
    175 		n += BIT32SZ;
    176 		n += f->count;
    177 		break;
    178 
    179 	case Rwrite:
    180 		n += BIT32SZ;
    181 		break;
    182 
    183 	case Rclunk:
    184 		break;
    185 
    186 	case Rremove:
    187 		break;
    188 
    189 	case Rstat:
    190 		n += BIT16SZ;
    191 		n += f->nstat;
    192 		break;
    193 
    194 	case Rwstat:
    195 		break;
    196 	}
    197 	return n;
    198 }
    199 
    200 uint
    201 convS2M(Fcall *f, uchar *ap, uint nap)
    202 {
    203 	uchar *p;
    204 	uint i, size;
    205 
    206 	size = sizeS2M(f);
    207 	if(size == 0)
    208 		return 0;
    209 	if(size > nap)
    210 		return 0;
    211 
    212 	p = (uchar*)ap;
    213 
    214 	PBIT32(p, size);
    215 	p += BIT32SZ;
    216 	PBIT8(p, f->type);
    217 	p += BIT8SZ;
    218 	PBIT16(p, f->tag);
    219 	p += BIT16SZ;
    220 
    221 	switch(f->type)
    222 	{
    223 	default:
    224 		return 0;
    225 
    226 	case Tversion:
    227 		PBIT32(p, f->msize);
    228 		p += BIT32SZ;
    229 		p = pstring(p, f->version);
    230 		break;
    231 
    232 	case Tflush:
    233 		PBIT16(p, f->oldtag);
    234 		p += BIT16SZ;
    235 		break;
    236 
    237 	case Tauth:
    238 		PBIT32(p, f->afid);
    239 		p += BIT32SZ;
    240 		p  = pstring(p, f->uname);
    241 		p  = pstring(p, f->aname);
    242 		break;
    243 
    244 	case Tattach:
    245 		PBIT32(p, f->fid);
    246 		p += BIT32SZ;
    247 		PBIT32(p, f->afid);
    248 		p += BIT32SZ;
    249 		p  = pstring(p, f->uname);
    250 		p  = pstring(p, f->aname);
    251 		break;
    252 
    253 	case Twalk:
    254 		PBIT32(p, f->fid);
    255 		p += BIT32SZ;
    256 		PBIT32(p, f->newfid);
    257 		p += BIT32SZ;
    258 		PBIT16(p, f->nwname);
    259 		p += BIT16SZ;
    260 		if(f->nwname > MAXWELEM)
    261 			return 0;
    262 		for(i=0; i<f->nwname; i++)
    263 			p = pstring(p, f->wname[i]);
    264 		break;
    265 
    266 	case Topen:
    267 	case Topenfd:
    268 		PBIT32(p, f->fid);
    269 		p += BIT32SZ;
    270 		PBIT8(p, f->mode);
    271 		p += BIT8SZ;
    272 		break;
    273 
    274 	case Tcreate:
    275 		PBIT32(p, f->fid);
    276 		p += BIT32SZ;
    277 		p = pstring(p, f->name);
    278 		PBIT32(p, f->perm);
    279 		p += BIT32SZ;
    280 		PBIT8(p, f->mode);
    281 		p += BIT8SZ;
    282 		break;
    283 
    284 	case Tread:
    285 		PBIT32(p, f->fid);
    286 		p += BIT32SZ;
    287 		PBIT64(p, f->offset);
    288 		p += BIT64SZ;
    289 		PBIT32(p, f->count);
    290 		p += BIT32SZ;
    291 		break;
    292 
    293 	case Twrite:
    294 		PBIT32(p, f->fid);
    295 		p += BIT32SZ;
    296 		PBIT64(p, f->offset);
    297 		p += BIT64SZ;
    298 		PBIT32(p, f->count);
    299 		p += BIT32SZ;
    300 		memmove(p, f->data, f->count);
    301 		p += f->count;
    302 		break;
    303 
    304 	case Tclunk:
    305 	case Tremove:
    306 		PBIT32(p, f->fid);
    307 		p += BIT32SZ;
    308 		break;
    309 
    310 	case Tstat:
    311 		PBIT32(p, f->fid);
    312 		p += BIT32SZ;
    313 		break;
    314 
    315 	case Twstat:
    316 		PBIT32(p, f->fid);
    317 		p += BIT32SZ;
    318 		PBIT16(p, f->nstat);
    319 		p += BIT16SZ;
    320 		memmove(p, f->stat, f->nstat);
    321 		p += f->nstat;
    322 		break;
    323 /*
    324  */
    325 
    326 	case Rversion:
    327 		PBIT32(p, f->msize);
    328 		p += BIT32SZ;
    329 		p = pstring(p, f->version);
    330 		break;
    331 
    332 	case Rerror:
    333 		p = pstring(p, f->ename);
    334 		break;
    335 
    336 	case Rflush:
    337 		break;
    338 
    339 	case Rauth:
    340 		p = pqid(p, &f->aqid);
    341 		break;
    342 
    343 	case Rattach:
    344 		p = pqid(p, &f->qid);
    345 		break;
    346 
    347 	case Rwalk:
    348 		PBIT16(p, f->nwqid);
    349 		p += BIT16SZ;
    350 		if(f->nwqid > MAXWELEM)
    351 			return 0;
    352 		for(i=0; i<f->nwqid; i++)
    353 			p = pqid(p, &f->wqid[i]);
    354 		break;
    355 
    356 	case Ropen:
    357 	case Rcreate:
    358 	case Ropenfd:
    359 		p = pqid(p, &f->qid);
    360 		PBIT32(p, f->iounit);
    361 		p += BIT32SZ;
    362 		if(f->type == Ropenfd){
    363 			PBIT32(p, f->unixfd);
    364 			p += BIT32SZ;
    365 		}
    366 		break;
    367 
    368 	case Rread:
    369 		PBIT32(p, f->count);
    370 		p += BIT32SZ;
    371 		memmove(p, f->data, f->count);
    372 		p += f->count;
    373 		break;
    374 
    375 	case Rwrite:
    376 		PBIT32(p, f->count);
    377 		p += BIT32SZ;
    378 		break;
    379 
    380 	case Rclunk:
    381 		break;
    382 
    383 	case Rremove:
    384 		break;
    385 
    386 	case Rstat:
    387 		PBIT16(p, f->nstat);
    388 		p += BIT16SZ;
    389 		memmove(p, f->stat, f->nstat);
    390 		p += f->nstat;
    391 		break;
    392 
    393 	case Rwstat:
    394 		break;
    395 	}
    396 	if(size != p-ap)
    397 		return 0;
    398 	return size;
    399 }