Blob
1 #include <u.h>2 #include <libc.h>3 #include <fcall.h>5 static6 uchar*7 pstring(uchar *p, char *s)8 {9 uint n;11 if(s == nil){12 PBIT16(p, 0);13 p += BIT16SZ;14 return p;15 }17 n = strlen(s);18 PBIT16(p, n);19 p += BIT16SZ;20 memmove(p, s, n);21 p += n;22 return p;23 }25 static26 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 }38 static39 uint40 stringsz(char *s)41 {42 if(s == nil)43 return BIT16SZ;45 return BIT16SZ+strlen(s);46 }48 uint49 sizeS2Mu(Fcall *f, int dotu)50 {51 uint n;52 int i;54 n = 0;55 n += BIT32SZ; /* size */56 n += BIT8SZ; /* type */57 n += BIT16SZ; /* tag */59 switch(f->type)60 {61 default:62 return 0;64 case Tversion:65 n += BIT32SZ;66 n += stringsz(f->version);67 break;69 case Tflush:70 n += BIT16SZ;71 break;73 case Tauth:74 n += BIT32SZ;75 n += stringsz(f->uname);76 n += stringsz(f->aname);77 if(dotu)78 n += BIT32SZ;79 break;81 case Tattach:82 n += BIT32SZ;83 n += BIT32SZ;84 n += stringsz(f->uname);85 n += stringsz(f->aname);86 if(dotu)87 n += BIT32SZ;88 break;90 case Twalk:91 n += BIT32SZ;92 n += BIT32SZ;93 n += BIT16SZ;94 for(i=0; i<f->nwname; i++)95 n += stringsz(f->wname[i]);96 break;98 case Topen:99 case Topenfd:100 n += BIT32SZ;101 n += BIT8SZ;102 break;104 case Tcreate:105 n += BIT32SZ;106 n += stringsz(f->name);107 n += BIT32SZ;108 n += BIT8SZ;109 if(dotu)110 n += stringsz(f->extension);111 break;113 case Tread:114 n += BIT32SZ;115 n += BIT64SZ;116 n += BIT32SZ;117 break;119 case Twrite:120 n += BIT32SZ;121 n += BIT64SZ;122 n += BIT32SZ;123 n += f->count;124 break;126 case Tclunk:127 case Tremove:128 n += BIT32SZ;129 break;131 case Tstat:132 n += BIT32SZ;133 break;135 case Twstat:136 n += BIT32SZ;137 n += BIT16SZ;138 n += f->nstat;139 break;140 /*141 */143 case Rversion:144 n += BIT32SZ;145 n += stringsz(f->version);146 break;148 case Rerror:149 n += stringsz(f->ename);150 if(dotu)151 n += BIT32SZ;152 break;154 case Rflush:155 break;157 case Rauth:158 n += QIDSZ;159 break;161 case Rattach:162 n += QIDSZ;163 break;165 case Rwalk:166 n += BIT16SZ;167 n += f->nwqid*QIDSZ;168 break;170 case Ropen:171 case Rcreate:172 n += QIDSZ;173 n += BIT32SZ;174 break;176 case Ropenfd:177 n += QIDSZ;178 n += BIT32SZ;179 n += BIT32SZ;180 break;182 case Rread:183 n += BIT32SZ;184 n += f->count;185 break;187 case Rwrite:188 n += BIT32SZ;189 break;191 case Rclunk:192 break;194 case Rremove:195 break;197 case Rstat:198 n += BIT16SZ;199 n += f->nstat;200 break;202 case Rwstat:203 break;204 }205 return n;206 }208 uint209 sizeS2M(Fcall *f)210 {211 return sizeS2Mu(f, 0);212 }214 uint215 convS2Mu(Fcall *f, uchar *ap, uint nap, int dotu)216 {217 uchar *p;218 uint i, size;220 size = sizeS2Mu(f, dotu);221 if(size == 0)222 return 0;223 if(size > nap)224 return 0;226 p = (uchar*)ap;228 PBIT32(p, size);229 p += BIT32SZ;230 PBIT8(p, f->type);231 p += BIT8SZ;232 PBIT16(p, f->tag);233 p += BIT16SZ;235 switch(f->type)236 {237 default:238 return 0;240 case Tversion:241 PBIT32(p, f->msize);242 p += BIT32SZ;243 p = pstring(p, f->version);244 break;246 case Tflush:247 PBIT16(p, f->oldtag);248 p += BIT16SZ;249 break;251 case Tauth:252 PBIT32(p, f->afid);253 p += BIT32SZ;254 p = pstring(p, f->uname);255 p = pstring(p, f->aname);256 if(dotu){257 f->uidnum = NOUID;258 PBIT32(p, f->uidnum);259 p += BIT32SZ;260 }261 break;263 case Tattach:264 PBIT32(p, f->fid);265 p += BIT32SZ;266 PBIT32(p, f->afid);267 p += BIT32SZ;268 p = pstring(p, f->uname);269 p = pstring(p, f->aname);270 if(dotu){271 f->uidnum = NOUID;272 PBIT32(p, f->uidnum);273 p += BIT32SZ;274 }275 break;277 case Twalk:278 PBIT32(p, f->fid);279 p += BIT32SZ;280 PBIT32(p, f->newfid);281 p += BIT32SZ;282 PBIT16(p, f->nwname);283 p += BIT16SZ;284 if(f->nwname > MAXWELEM)285 return 0;286 for(i=0; i<f->nwname; i++)287 p = pstring(p, f->wname[i]);288 break;290 case Topen:291 case Topenfd:292 PBIT32(p, f->fid);293 p += BIT32SZ;294 PBIT8(p, f->mode);295 p += BIT8SZ;296 break;298 case Tcreate:299 PBIT32(p, f->fid);300 p += BIT32SZ;301 p = pstring(p, f->name);302 PBIT32(p, f->perm);303 p += BIT32SZ;304 PBIT8(p, f->mode);305 p += BIT8SZ;306 if(dotu)307 p = pstring(p, f->extension);308 break;310 case Tread:311 PBIT32(p, f->fid);312 p += BIT32SZ;313 PBIT64(p, f->offset);314 p += BIT64SZ;315 PBIT32(p, f->count);316 p += BIT32SZ;317 break;319 case Twrite:320 PBIT32(p, f->fid);321 p += BIT32SZ;322 PBIT64(p, f->offset);323 p += BIT64SZ;324 PBIT32(p, f->count);325 p += BIT32SZ;326 memmove(p, f->data, f->count);327 p += f->count;328 break;330 case Tclunk:331 case Tremove:332 PBIT32(p, f->fid);333 p += BIT32SZ;334 break;336 case Tstat:337 PBIT32(p, f->fid);338 p += BIT32SZ;339 break;341 case Twstat:342 PBIT32(p, f->fid);343 p += BIT32SZ;344 PBIT16(p, f->nstat);345 p += BIT16SZ;346 memmove(p, f->stat, f->nstat);347 p += f->nstat;348 break;349 /*350 */352 case Rversion:353 PBIT32(p, f->msize);354 p += BIT32SZ;355 p = pstring(p, f->version);356 break;358 case Rerror:359 p = pstring(p, f->ename);360 if(dotu){361 PBIT32(p, f->errornum);362 p += BIT32SZ;363 }364 break;366 case Rflush:367 break;369 case Rauth:370 p = pqid(p, &f->aqid);371 break;373 case Rattach:374 p = pqid(p, &f->qid);375 break;377 case Rwalk:378 PBIT16(p, f->nwqid);379 p += BIT16SZ;380 if(f->nwqid > MAXWELEM)381 return 0;382 for(i=0; i<f->nwqid; i++)383 p = pqid(p, &f->wqid[i]);384 break;386 case Ropen:387 case Rcreate:388 case Ropenfd:389 p = pqid(p, &f->qid);390 PBIT32(p, f->iounit);391 p += BIT32SZ;392 if(f->type == Ropenfd){393 PBIT32(p, f->unixfd);394 p += BIT32SZ;395 }396 break;398 case Rread:399 PBIT32(p, f->count);400 p += BIT32SZ;401 memmove(p, f->data, f->count);402 p += f->count;403 break;405 case Rwrite:406 PBIT32(p, f->count);407 p += BIT32SZ;408 break;410 case Rclunk:411 break;413 case Rremove:414 break;416 case Rstat:417 PBIT16(p, f->nstat);418 p += BIT16SZ;419 memmove(p, f->stat, f->nstat);420 p += f->nstat;421 break;423 case Rwstat:424 break;425 }426 if(size != p-ap)427 return 0;428 return size;429 }431 uint432 convS2M(Fcall *f, uchar *ap, uint nap)433 {434 return convS2Mu(f, ap, nap, 0);435 }