1 #include "all.h" 2 3 /* BUG transition */ 4 // int client9p = 2; 5 // int kernel9p = 2; 6 7 #include "9p1.h" 8 9 #define CHAR(x) *p++ = f->x 10 #define SHORT(x) { ulong vvv = f->x; *p++ = vvv; *p++ = vvv>>8; } 11 #define LONGINT(q) {*p++ = (q); *p++ = (q)>>8; *p++ = (q)>>16; *p++ = (q)>>24;} 12 #define LONG(x) { ulong vvv = f->x; LONGINT(vvv); } 13 #define VLONG(x) { \ 14 uvlong q = f->x; \ 15 *p++ = (q)>> 0; *p++ = (q)>> 8; *p++ = (q)>>16; *p++ = (q)>>24; \ 16 *p++ = (q)>>32; *p++ = (q)>>40; *p++ = (q)>>48; *p++ = (q)>>56; \ 17 } 18 19 #define BYTES(x,n) memmove(p, f->x, n); p += n 20 #define STRING(x,n) strncpy((char*)p, f->x, n); p += n 21 22 int 23 convS2M9p1(Fcall *f, uchar *ap) 24 { 25 uchar *p; 26 int t; 27 28 p = ap; 29 CHAR(type); 30 t = f->type; 31 SHORT(tag); 32 switch(t) { 33 default: 34 print("convS2M9p1: bad type: %d\n", t); 35 return 0; 36 37 case Tnop: 38 case Tosession: 39 break; 40 41 case Tsession: 42 BYTES(chal, sizeof(f->chal)); 43 break; 44 45 case Tflush: 46 SHORT(oldtag); 47 break; 48 49 case Tattach: 50 SHORT(fid); 51 STRING(uname, sizeof(f->uname)); 52 STRING(aname, sizeof(f->aname)); 53 BYTES(ticket, sizeof(f->ticket)); 54 BYTES(auth, sizeof(f->auth)); 55 break; 56 57 case Toattach: 58 SHORT(fid); 59 STRING(uname, sizeof(f->uname)); 60 STRING(aname, sizeof(f->aname)); 61 BYTES(ticket, NAMELEN); 62 break; 63 64 case Tclone: 65 SHORT(fid); 66 SHORT(newfid); 67 break; 68 69 case Twalk: 70 SHORT(fid); 71 STRING(name, sizeof(f->name)); 72 break; 73 74 case Tclwalk: 75 SHORT(fid); 76 SHORT(newfid); 77 STRING(name, sizeof(f->name)); 78 break; 79 80 case Topen: 81 SHORT(fid); 82 CHAR(mode); 83 break; 84 85 case Tcreate: 86 SHORT(fid); 87 STRING(name, sizeof(f->name)); 88 LONG(perm); 89 CHAR(mode); 90 break; 91 92 case Tread: 93 SHORT(fid); 94 VLONG(offset); 95 SHORT(count); 96 break; 97 98 case Twrite: 99 SHORT(fid); 100 VLONG(offset); 101 SHORT(count); 102 p++; 103 if((uchar*)p == (uchar*)f->data) { 104 p += f->count; 105 break; 106 } 107 BYTES(data, f->count); 108 break; 109 110 case Tclunk: 111 case Tremove: 112 case Tstat: 113 SHORT(fid); 114 break; 115 116 case Twstat: 117 SHORT(fid); 118 BYTES(stat, sizeof(f->stat)); 119 break; 120 /* 121 */ 122 case Rnop: 123 case Rosession: 124 case Rflush: 125 break; 126 127 case Rsession: 128 BYTES(chal, sizeof(f->chal)); 129 BYTES(authid, sizeof(f->authid)); 130 BYTES(authdom, sizeof(f->authdom)); 131 break; 132 133 case Rerror: 134 STRING(ename, sizeof(f->ename)); 135 break; 136 137 case Rclone: 138 case Rclunk: 139 case Rremove: 140 case Rwstat: 141 SHORT(fid); 142 break; 143 144 case Rwalk: 145 case Ropen: 146 case Rcreate: 147 case Rclwalk: 148 SHORT(fid); 149 LONG(qid.path); 150 LONG(qid.version); 151 break; 152 153 case Rattach: 154 SHORT(fid); 155 LONG(qid.path); 156 LONG(qid.version); 157 BYTES(rauth, sizeof(f->rauth)); 158 break; 159 160 case Roattach: 161 SHORT(fid); 162 LONG(qid.path); 163 LONG(qid.version); 164 break; 165 166 case Rread: 167 SHORT(fid); 168 SHORT(count); 169 p++; 170 if((uchar*)p == (uchar*)f->data) { 171 p += f->count; 172 break; 173 } 174 BYTES(data, f->count); 175 break; 176 177 case Rwrite: 178 SHORT(fid); 179 SHORT(count); 180 break; 181 182 case Rstat: 183 SHORT(fid); 184 BYTES(stat, sizeof(f->stat)); 185 break; 186 } 187 return p - (uchar*)ap; 188 } 189 190 /* 191 * buggery to give false qid for 192 * the top 2 levels of the dump fs 193 */ 194 static ulong 195 fakeqid9p1(Dentry *f) 196 { 197 ulong q; 198 int c; 199 200 q = f->qid.path; 201 if(q == (QPROOT|QPDIR)) { 202 c = f->name[0]; 203 if(isascii(c) && isdigit(c)) { 204 q = 3|QPDIR; 205 c = (c-'0')*10 + (f->name[1]-'0'); 206 if(c >= 1 && c <= 12) 207 q = 4|QPDIR; 208 } 209 } 210 return q; 211 } 212 213 int 214 convD2M9p1(Dentry *f, char *ap) 215 { 216 uchar *p; 217 ulong q; 218 219 p = (uchar*)ap; 220 STRING(name, sizeof(f->name)); 221 222 memset(p, 0, 2*NAMELEN); 223 uidtostr((char*)p, f->uid, 1); 224 p += NAMELEN; 225 226 uidtostr((char*)p, f->gid, 1); 227 p += NAMELEN; 228 229 q = fakeqid9p1(f); 230 LONGINT(q); 231 LONG(qid.version); 232 233 q = f->mode & 0x0fff; 234 if(f->mode & DDIR) 235 q |= PDIR; 236 if(f->mode & DAPND) 237 q |= PAPND; 238 if(f->mode & DLOCK) 239 q |= PLOCK; 240 LONGINT(q); 241 242 LONG(atime); 243 LONG(mtime); 244 VLONG(size); 245 LONGINT(0); 246 return p - (uchar*)ap; 247 } 248 249 int 250 convA2M9p1(Authenticator *f, char *ap, char *key) 251 { 252 int n; 253 uchar *p; 254 255 p = (uchar*)ap; 256 CHAR(num); 257 BYTES(chal, CHALLEN); 258 LONG(id); 259 n = p - (uchar*)ap; 260 if(key) 261 encrypt(key, ap, n); 262 return n; 263 } 264 265 #undef CHAR 266 #undef SHORT 267 #undef LONG 268 #undef LONGINT 269 #undef VLONG 270 #undef BYTES 271 #undef STRING 272 273 #define CHAR(x) f->x = *p++ 274 #define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2 275 #define LONG(x) f->x = p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24); p += 4 276 #define VLONG(x) { \ 277 f->x = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)) | \ 278 (uvlong)(p[4] | (p[5]<<8) | (p[6]<<16) | (p[7]<<24)) << 32; \ 279 p += 8; \ 280 } 281 282 #define BYTES(x,n) memmove(f->x, p, n); p += n 283 #define STRING(x,n) memmove(f->x, p, n); p += n 284 285 int 286 convM2S9p1(uchar *ap, Fcall *f, int n) 287 { 288 uchar *p; 289 int t; 290 291 p = ap; 292 CHAR(type); 293 t = f->type; 294 SHORT(tag); 295 switch(t) { 296 default: 297 /* 298 * only whine if it couldn't be a 9P2000 Tversion. 299 */ 300 if(t != 19 || ap[4] != 100) 301 print("convM2S9p1: bad type: %d\n", f->type); 302 return 0; 303 304 case Tnop: 305 case Tosession: 306 break; 307 308 case Tsession: 309 BYTES(chal, sizeof(f->chal)); 310 break; 311 312 case Tflush: 313 SHORT(oldtag); 314 break; 315 316 case Tattach: 317 SHORT(fid); 318 BYTES(uname, sizeof(f->uname)); 319 BYTES(aname, sizeof(f->aname)); 320 BYTES(ticket, sizeof(f->ticket)); 321 BYTES(auth, sizeof(f->auth)); 322 break; 323 324 case Toattach: 325 SHORT(fid); 326 BYTES(uname, sizeof(f->uname)); 327 BYTES(aname, sizeof(f->aname)); 328 BYTES(ticket, NAMELEN); 329 break; 330 331 case Tclone: 332 SHORT(fid); 333 SHORT(newfid); 334 break; 335 336 case Twalk: 337 SHORT(fid); 338 BYTES(name, sizeof(f->name)); 339 break; 340 341 case Tclwalk: 342 SHORT(fid); 343 SHORT(newfid); 344 BYTES(name, sizeof(f->name)); 345 break; 346 347 case Tremove: 348 SHORT(fid); 349 break; 350 351 case Topen: 352 SHORT(fid); 353 CHAR(mode); 354 break; 355 356 case Tcreate: 357 SHORT(fid); 358 BYTES(name, sizeof(f->name)); 359 LONG(perm); 360 CHAR(mode); 361 break; 362 363 case Tread: 364 SHORT(fid); 365 VLONG(offset); 366 SHORT(count); 367 break; 368 369 case Twrite: 370 SHORT(fid); 371 VLONG(offset); 372 SHORT(count); 373 p++; 374 f->data = (char*)p; p += f->count; 375 break; 376 377 case Tclunk: 378 case Tstat: 379 SHORT(fid); 380 break; 381 382 case Twstat: 383 SHORT(fid); 384 BYTES(stat, sizeof(f->stat)); 385 break; 386 387 /* 388 */ 389 case Rnop: 390 case Rosession: 391 break; 392 393 case Rsession: 394 BYTES(chal, sizeof(f->chal)); 395 BYTES(authid, sizeof(f->authid)); 396 BYTES(authdom, sizeof(f->authdom)); 397 break; 398 399 case Rerror: 400 BYTES(ename, sizeof(f->ename)); 401 break; 402 403 case Rflush: 404 break; 405 406 case Rclone: 407 case Rclunk: 408 case Rremove: 409 case Rwstat: 410 SHORT(fid); 411 break; 412 413 case Rwalk: 414 case Rclwalk: 415 case Ropen: 416 case Rcreate: 417 SHORT(fid); 418 LONG(qid.path); 419 LONG(qid.version); 420 break; 421 422 case Rattach: 423 SHORT(fid); 424 LONG(qid.path); 425 LONG(qid.version); 426 BYTES(rauth, sizeof(f->rauth)); 427 break; 428 429 case Roattach: 430 SHORT(fid); 431 LONG(qid.path); 432 LONG(qid.version); 433 break; 434 435 case Rread: 436 SHORT(fid); 437 SHORT(count); 438 p++; 439 f->data = (char*)p; p += f->count; 440 break; 441 442 case Rwrite: 443 SHORT(fid); 444 SHORT(count); 445 break; 446 447 case Rstat: 448 SHORT(fid); 449 BYTES(stat, sizeof(f->stat)); 450 break; 451 } 452 if((uchar*)ap+n == p) 453 return n; 454 return 0; 455 } 456 457 int 458 convM2D9p1(char *ap, Dentry *f) 459 { 460 uchar *p; 461 char str[NAMELEN]; 462 463 p = (uchar*)ap; 464 BYTES(name, sizeof(f->name)); 465 466 memmove(str, p, NAMELEN); 467 p += NAMELEN; 468 f->uid = strtouid(str); 469 470 memmove(str, p, NAMELEN); 471 p += NAMELEN; 472 f->gid = strtouid(str); 473 474 LONG(qid.path); 475 LONG(qid.version); 476 477 LONG(atime); 478 f->mode = (f->atime & 0x0fff) | DALLOC; 479 if(f->atime & PDIR) 480 f->mode |= DDIR; 481 if(f->atime & PAPND) 482 f->mode |= DAPND; 483 if(f->atime & PLOCK) 484 f->mode |= DLOCK; 485 486 LONG(atime); 487 LONG(mtime); 488 VLONG(size); 489 p += 4; 490 return p - (uchar*)ap; 491 } 492 493 void 494 convM2A9p1(char *ap, Authenticator *f, char *key) 495 { 496 uchar *p; 497 498 if(key) 499 decrypt(key, ap, AUTHENTLEN); 500 p = (uchar*)ap; 501 CHAR(num); 502 BYTES(chal, CHALLEN); 503 LONG(id); 504 USED(p); 505 } 506 507 void 508 convM2T9p1(char *ap, Ticket *f, char *key) 509 { 510 uchar *p; 511 512 if(key) 513 decrypt(key, ap, TICKETLEN); 514 p = (uchar*)ap; 515 CHAR(num); 516 BYTES(chal, CHALLEN); 517 STRING(cuid, NAMELEN); 518 f->cuid[NAMELEN-1] = 0; 519 STRING(suid, NAMELEN); 520 f->suid[NAMELEN-1] = 0; 521 BYTES(key, DESKEYLEN); 522 USED(p); 523 } 524