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