plan9port

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

nfs3.c (93582B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <thread.h>
      4 #include <sunrpc.h>
      5 #include <nfs3.h>
      6 
      7 char*
      8 nfs3statusstr(Nfs3Status x)
      9 {
     10 	switch(x){
     11 	case Nfs3Ok:
     12 		return "Nfs3Ok";
     13 	case Nfs3ErrNotOwner:
     14 		return "Nfs3ErrNotOwner";
     15 	case Nfs3ErrNoEnt:
     16 		return "Nfs3ErrNoEnt";
     17 	case Nfs3ErrNoMem:
     18 		return "Nfs3ErrNoMem";
     19 	case Nfs3ErrIo:
     20 		return "Nfs3ErrIo";
     21 	case Nfs3ErrNxio:
     22 		return "Nfs3ErrNxio";
     23 	case Nfs3ErrAcces:
     24 		return "Nfs3ErrAcces";
     25 	case Nfs3ErrExist:
     26 		return "Nfs3ErrExist";
     27 	case Nfs3ErrXDev:
     28 		return "Nfs3ErrXDev";
     29 	case Nfs3ErrNoDev:
     30 		return "Nfs3ErrNoDev";
     31 	case Nfs3ErrNotDir:
     32 		return "Nfs3ErrNotDir";
     33 	case Nfs3ErrIsDir:
     34 		return "Nfs3ErrIsDir";
     35 	case Nfs3ErrInval:
     36 		return "Nfs3ErrInval";
     37 	case Nfs3ErrFbig:
     38 		return "Nfs3ErrFbig";
     39 	case Nfs3ErrNoSpc:
     40 		return "Nfs3ErrNoSpc";
     41 	case Nfs3ErrRoFs:
     42 		return "Nfs3ErrRoFs";
     43 	case Nfs3ErrMLink:
     44 		return "Nfs3ErrMLink";
     45 	case Nfs3ErrNameTooLong:
     46 		return "Nfs3ErrNameTooLong";
     47 	case Nfs3ErrNotEmpty:
     48 		return "Nfs3ErrNotEmpty";
     49 	case Nfs3ErrDQuot:
     50 		return "Nfs3ErrDQuot";
     51 	case Nfs3ErrStale:
     52 		return "Nfs3ErrStale";
     53 	case Nfs3ErrRemote:
     54 		return "Nfs3ErrRemote";
     55 	case Nfs3ErrBadHandle:
     56 		return "Nfs3ErrBadHandle";
     57 	case Nfs3ErrNotSync:
     58 		return "Nfs3ErrNotSync";
     59 	case Nfs3ErrBadCookie:
     60 		return "Nfs3ErrBadCookie";
     61 	case Nfs3ErrNotSupp:
     62 		return "Nfs3ErrNotSupp";
     63 	case Nfs3ErrTooSmall:
     64 		return "Nfs3ErrTooSmall";
     65 	case Nfs3ErrServerFault:
     66 		return "Nfs3ErrServerFault";
     67 	case Nfs3ErrBadType:
     68 		return "Nfs3ErrBadType";
     69 	case Nfs3ErrJukebox:
     70 		return "Nfs3ErrJukebox";
     71 	case Nfs3ErrFprintNotFound:
     72 		return "Nfs3ErrFprintNotFound";
     73 	case Nfs3ErrAborted:
     74 		return "Nfs3ErrAborted";
     75 	default:
     76 		return "unknown";
     77 	}
     78 }
     79 
     80 static struct {
     81 	Nfs3Status status;
     82 	char *msg;
     83 } etab[] = {
     84 	Nfs3ErrNotOwner,	"not owner",
     85 	Nfs3ErrNoEnt,		"directory entry not found",
     86 	Nfs3ErrIo,			"i/o error",
     87 	Nfs3ErrNxio,		"no such device",
     88 	Nfs3ErrNoMem,	"out of memory",
     89 	Nfs3ErrAcces,		"access denied",
     90 	Nfs3ErrExist,		"file or directory exists",
     91 	Nfs3ErrXDev,		"cross-device operation",
     92 	Nfs3ErrNoDev,		"no such device",
     93 	Nfs3ErrNotDir,		"not a directory",
     94 	Nfs3ErrIsDir,		"is a directory",
     95 	Nfs3ErrInval,		"invalid arguments",
     96 	Nfs3ErrFbig,		"file too big",
     97 	Nfs3ErrNoSpc,		"no space left on device",
     98 	Nfs3ErrRoFs,		"read-only file system",
     99 	Nfs3ErrMLink,		"too many links",
    100 	Nfs3ErrNameTooLong,	"name too long",
    101 	Nfs3ErrNotEmpty,	"directory not empty",
    102 	Nfs3ErrDQuot,		"dquot",
    103 	Nfs3ErrStale,		"stale handle",
    104 	Nfs3ErrRemote,	"remote error",
    105 	Nfs3ErrBadHandle,	"bad handle",
    106 	Nfs3ErrNotSync,	"out of sync with server",
    107 	Nfs3ErrBadCookie,	"bad cookie",
    108 	Nfs3ErrNotSupp,	"not supported",
    109 	Nfs3ErrTooSmall,	"too small",
    110 	Nfs3ErrServerFault,	"server fault",
    111 	Nfs3ErrBadType,	"bad type",
    112 	Nfs3ErrJukebox,	"jukebox -- try again later",
    113 	Nfs3ErrFprintNotFound,	"fprint not found",
    114 	Nfs3ErrAborted,	"aborted",
    115 };
    116 
    117 void
    118 nfs3errstr(Nfs3Status status)
    119 {
    120 	int i;
    121 
    122 	for(i=0; i<nelem(etab); i++){
    123 		if((int)etab[i].status == (int)status){
    124 			werrstr(etab[i].msg);
    125 			return;
    126 		}
    127 	}
    128 	werrstr("unknown nfs3 error %d", (int)status);
    129 }
    130 
    131 char*
    132 nfs3filetypestr(Nfs3FileType x)
    133 {
    134 	switch(x){
    135 	case Nfs3FileReg:
    136 		return "Nfs3FileReg";
    137 	case Nfs3FileDir:
    138 		return "Nfs3FileDir";
    139 	case Nfs3FileBlock:
    140 		return "Nfs3FileBlock";
    141 	case Nfs3FileChar:
    142 		return "Nfs3FileChar";
    143 	case Nfs3FileSymlink:
    144 		return "Nfs3FileSymlink";
    145 	case Nfs3FileSocket:
    146 		return "Nfs3FileSocket";
    147 	case Nfs3FileFifo:
    148 		return "Nfs3FileFifo";
    149 	default:
    150 		return "unknown";
    151 	}
    152 }
    153 
    154 void
    155 nfs3handleprint(Fmt *fmt, Nfs3Handle *x)
    156 {
    157 	fmtprint(fmt, "%s\n", "Nfs3Handle");
    158 	fmtprint(fmt, "\t%s=", "handle");
    159 	if(x->len > 64)
    160 		fmtprint(fmt, "%.*H... (%d)", 64, x->h, x->len);
    161 	else
    162 		fmtprint(fmt, "%.*H", x->len, x->h);
    163 	fmtprint(fmt, "\n");
    164 }
    165 uint
    166 nfs3handlesize(Nfs3Handle *x)
    167 {
    168 	uint a;
    169 	USED(x);
    170 	a = 0 + sunvaropaquesize(x->len);
    171 	return a;
    172 }
    173 int
    174 nfs3handlepack(uchar *a, uchar *ea, uchar **pa, Nfs3Handle *x)
    175 {
    176 	if(x->len > Nfs3MaxHandleSize || sunuint32pack(a, ea, &a, &x->len) < 0
    177 	|| sunfixedopaquepack(a, ea, &a, x->h, x->len) < 0)
    178 		goto Err;
    179 	*pa = a;
    180 	return 0;
    181 Err:
    182 	*pa = ea;
    183 	return -1;
    184 }
    185 int
    186 nfs3handleunpack(uchar *a, uchar *ea, uchar **pa, Nfs3Handle *x)
    187 {
    188 	uchar *ha;
    189 	u32int n;
    190 
    191 	if(sunuint32unpack(a, ea, &a, &n) < 0 || n > Nfs3MaxHandleSize)
    192 		goto Err;
    193 	ha = a;
    194 	a += (n+3)&~3;
    195 	if(a > ea)
    196 		goto Err;
    197 	memmove(x->h, ha, n);
    198 	x->len = n;
    199 	*pa = a;
    200 	return 0;
    201 Err:
    202 	*pa = ea;
    203 	return -1;
    204 }
    205 void
    206 nfs3timeprint(Fmt *fmt, Nfs3Time *x)
    207 {
    208 	fmtprint(fmt, "%s\n", "Nfs3Time");
    209 	fmtprint(fmt, "\t%s=", "sec");
    210 	fmtprint(fmt, "%ud", x->sec);
    211 	fmtprint(fmt, "\n");
    212 	fmtprint(fmt, "\t%s=", "nsec");
    213 	fmtprint(fmt, "%ud", x->nsec);
    214 	fmtprint(fmt, "\n");
    215 }
    216 uint
    217 nfs3timesize(Nfs3Time *x)
    218 {
    219 	uint a;
    220 	USED(x);
    221 	a = 0 + 4 + 4;
    222 	return a;
    223 }
    224 int
    225 nfs3timepack(uchar *a, uchar *ea, uchar **pa, Nfs3Time *x)
    226 {
    227 	if(sunuint32pack(a, ea, &a, &x->sec) < 0) goto Err;
    228 	if(sunuint32pack(a, ea, &a, &x->nsec) < 0) goto Err;
    229 	*pa = a;
    230 	return 0;
    231 Err:
    232 	*pa = ea;
    233 	return -1;
    234 }
    235 int
    236 nfs3timeunpack(uchar *a, uchar *ea, uchar **pa, Nfs3Time *x)
    237 {
    238 	if(sunuint32unpack(a, ea, &a, &x->sec) < 0) goto Err;
    239 	if(sunuint32unpack(a, ea, &a, &x->nsec) < 0) goto Err;
    240 	*pa = a;
    241 	return 0;
    242 Err:
    243 	*pa = ea;
    244 	return -1;
    245 }
    246 void
    247 nfs3attrprint(Fmt *fmt, Nfs3Attr *x)
    248 {
    249 	fmtprint(fmt, "%s\n", "Nfs3Attr");
    250 	fmtprint(fmt, "\t%s=", "type");
    251 	fmtprint(fmt, "%s", nfs3filetypestr(x->type));
    252 	fmtprint(fmt, "\n");
    253 	fmtprint(fmt, "\t%s=", "mode");
    254 	fmtprint(fmt, "%ud", x->mode);
    255 	fmtprint(fmt, "\n");
    256 	fmtprint(fmt, "\t%s=", "nlink");
    257 	fmtprint(fmt, "%ud", x->nlink);
    258 	fmtprint(fmt, "\n");
    259 	fmtprint(fmt, "\t%s=", "uid");
    260 	fmtprint(fmt, "%ud", x->uid);
    261 	fmtprint(fmt, "\n");
    262 	fmtprint(fmt, "\t%s=", "gid");
    263 	fmtprint(fmt, "%ud", x->gid);
    264 	fmtprint(fmt, "\n");
    265 	fmtprint(fmt, "\t%s=", "size");
    266 	fmtprint(fmt, "%llud", x->size);
    267 	fmtprint(fmt, "\n");
    268 	fmtprint(fmt, "\t%s=", "used");
    269 	fmtprint(fmt, "%llud", x->used);
    270 	fmtprint(fmt, "\n");
    271 	fmtprint(fmt, "\t%s=", "major");
    272 	fmtprint(fmt, "%ud", x->major);
    273 	fmtprint(fmt, "\n");
    274 	fmtprint(fmt, "\t%s=", "minor");
    275 	fmtprint(fmt, "%ud", x->minor);
    276 	fmtprint(fmt, "\n");
    277 	fmtprint(fmt, "\t%s=", "fsid");
    278 	fmtprint(fmt, "%llud", x->fsid);
    279 	fmtprint(fmt, "\n");
    280 	fmtprint(fmt, "\t%s=", "fileid");
    281 	fmtprint(fmt, "%llud", x->fileid);
    282 	fmtprint(fmt, "\n");
    283 	fmtprint(fmt, "\t%s=", "atime");
    284 	nfs3timeprint(fmt, &x->atime);
    285 	fmtprint(fmt, "\n");
    286 	fmtprint(fmt, "\t%s=", "mtime");
    287 	nfs3timeprint(fmt, &x->mtime);
    288 	fmtprint(fmt, "\n");
    289 	fmtprint(fmt, "\t%s=", "ctime");
    290 	nfs3timeprint(fmt, &x->ctime);
    291 	fmtprint(fmt, "\n");
    292 }
    293 uint
    294 nfs3attrsize(Nfs3Attr *x)
    295 {
    296 	uint a;
    297 	USED(x);
    298 	a = 0 + 4 + 4 + 4 + 4 + 4 + 8 + 8 + 4 + 4 + 8 + 8 + nfs3timesize(&x->atime) + nfs3timesize(&x->mtime) + nfs3timesize(&x->ctime);
    299 	return a;
    300 }
    301 int
    302 nfs3attrpack(uchar *a, uchar *ea, uchar **pa, Nfs3Attr *x)
    303 {
    304 	int i;
    305 
    306 	if(i=x->type, sunenumpack(a, ea, &a, &i) < 0) goto Err;
    307 	if(sunuint32pack(a, ea, &a, &x->mode) < 0) goto Err;
    308 	if(sunuint32pack(a, ea, &a, &x->nlink) < 0) goto Err;
    309 	if(sunuint32pack(a, ea, &a, &x->uid) < 0) goto Err;
    310 	if(sunuint32pack(a, ea, &a, &x->gid) < 0) goto Err;
    311 	if(sunuint64pack(a, ea, &a, &x->size) < 0) goto Err;
    312 	if(sunuint64pack(a, ea, &a, &x->used) < 0) goto Err;
    313 	if(sunuint32pack(a, ea, &a, &x->major) < 0) goto Err;
    314 	if(sunuint32pack(a, ea, &a, &x->minor) < 0) goto Err;
    315 	if(sunuint64pack(a, ea, &a, &x->fsid) < 0) goto Err;
    316 	if(sunuint64pack(a, ea, &a, &x->fileid) < 0) goto Err;
    317 	if(nfs3timepack(a, ea, &a, &x->atime) < 0) goto Err;
    318 	if(nfs3timepack(a, ea, &a, &x->mtime) < 0) goto Err;
    319 	if(nfs3timepack(a, ea, &a, &x->ctime) < 0) goto Err;
    320 	*pa = a;
    321 	return 0;
    322 Err:
    323 	*pa = ea;
    324 	return -1;
    325 }
    326 int
    327 nfs3attrunpack(uchar *a, uchar *ea, uchar **pa, Nfs3Attr *x)
    328 {
    329 	int i;
    330 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->type = i;
    331 	if(sunuint32unpack(a, ea, &a, &x->mode) < 0) goto Err;
    332 	if(sunuint32unpack(a, ea, &a, &x->nlink) < 0) goto Err;
    333 	if(sunuint32unpack(a, ea, &a, &x->uid) < 0) goto Err;
    334 	if(sunuint32unpack(a, ea, &a, &x->gid) < 0) goto Err;
    335 	if(sunuint64unpack(a, ea, &a, &x->size) < 0) goto Err;
    336 	if(sunuint64unpack(a, ea, &a, &x->used) < 0) goto Err;
    337 	if(sunuint32unpack(a, ea, &a, &x->major) < 0) goto Err;
    338 	if(sunuint32unpack(a, ea, &a, &x->minor) < 0) goto Err;
    339 	if(sunuint64unpack(a, ea, &a, &x->fsid) < 0) goto Err;
    340 	if(sunuint64unpack(a, ea, &a, &x->fileid) < 0) goto Err;
    341 	if(nfs3timeunpack(a, ea, &a, &x->atime) < 0) goto Err;
    342 	if(nfs3timeunpack(a, ea, &a, &x->mtime) < 0) goto Err;
    343 	if(nfs3timeunpack(a, ea, &a, &x->ctime) < 0) goto Err;
    344 	*pa = a;
    345 	return 0;
    346 Err:
    347 	*pa = ea;
    348 	return -1;
    349 }
    350 void
    351 nfs3wccattrprint(Fmt *fmt, Nfs3WccAttr *x)
    352 {
    353 	fmtprint(fmt, "%s\n", "Nfs3WccAttr");
    354 	fmtprint(fmt, "\t%s=", "size");
    355 	fmtprint(fmt, "%llud", x->size);
    356 	fmtprint(fmt, "\n");
    357 	fmtprint(fmt, "\t%s=", "mtime");
    358 	nfs3timeprint(fmt, &x->mtime);
    359 	fmtprint(fmt, "\n");
    360 	fmtprint(fmt, "\t%s=", "ctime");
    361 	nfs3timeprint(fmt, &x->ctime);
    362 	fmtprint(fmt, "\n");
    363 }
    364 uint
    365 nfs3wccattrsize(Nfs3WccAttr *x)
    366 {
    367 	uint a;
    368 	USED(x);
    369 	a = 0 + 8 + nfs3timesize(&x->mtime) + nfs3timesize(&x->ctime);
    370 	return a;
    371 }
    372 int
    373 nfs3wccattrpack(uchar *a, uchar *ea, uchar **pa, Nfs3WccAttr *x)
    374 {
    375 	if(sunuint64pack(a, ea, &a, &x->size) < 0) goto Err;
    376 	if(nfs3timepack(a, ea, &a, &x->mtime) < 0) goto Err;
    377 	if(nfs3timepack(a, ea, &a, &x->ctime) < 0) goto Err;
    378 	*pa = a;
    379 	return 0;
    380 Err:
    381 	*pa = ea;
    382 	return -1;
    383 }
    384 int
    385 nfs3wccattrunpack(uchar *a, uchar *ea, uchar **pa, Nfs3WccAttr *x)
    386 {
    387 	if(sunuint64unpack(a, ea, &a, &x->size) < 0) goto Err;
    388 	if(nfs3timeunpack(a, ea, &a, &x->mtime) < 0) goto Err;
    389 	if(nfs3timeunpack(a, ea, &a, &x->ctime) < 0) goto Err;
    390 	*pa = a;
    391 	return 0;
    392 Err:
    393 	*pa = ea;
    394 	return -1;
    395 }
    396 void
    397 nfs3wccprint(Fmt *fmt, Nfs3Wcc *x)
    398 {
    399 	fmtprint(fmt, "%s\n", "Nfs3Wcc");
    400 	fmtprint(fmt, "\t%s=", "haveWccAttr");
    401 	fmtprint(fmt, "%d", x->haveWccAttr);
    402 	fmtprint(fmt, "\n");
    403 	switch(x->haveWccAttr){
    404 	case 1:
    405 		fmtprint(fmt, "\t%s=", "wccAttr");
    406 		nfs3wccattrprint(fmt, &x->wccAttr);
    407 		fmtprint(fmt, "\n");
    408 		break;
    409 	}
    410 	fmtprint(fmt, "\t%s=", "haveAttr");
    411 	fmtprint(fmt, "%d", x->haveAttr);
    412 	fmtprint(fmt, "\n");
    413 	switch(x->haveAttr){
    414 	case 1:
    415 		fmtprint(fmt, "\t%s=", "attr");
    416 		nfs3attrprint(fmt, &x->attr);
    417 		fmtprint(fmt, "\n");
    418 		break;
    419 	}
    420 }
    421 uint
    422 nfs3wccsize(Nfs3Wcc *x)
    423 {
    424 	uint a;
    425 	USED(x);
    426 	a = 0 + 4;
    427 	switch(x->haveWccAttr){
    428 	case 1:
    429 		a = a + nfs3wccattrsize(&x->wccAttr);
    430 		break;
    431 	}
    432 	a = a + 4;
    433 	switch(x->haveAttr){
    434 	case 1:
    435 		a = a + nfs3attrsize(&x->attr);
    436 		break;
    437 	}
    438 	return a;
    439 }
    440 int
    441 nfs3wccpack(uchar *a, uchar *ea, uchar **pa, Nfs3Wcc *x)
    442 {
    443 	if(sunuint1pack(a, ea, &a, &x->haveWccAttr) < 0) goto Err;
    444 	switch(x->haveWccAttr){
    445 	case 1:
    446 		if(nfs3wccattrpack(a, ea, &a, &x->wccAttr) < 0) goto Err;
    447 		break;
    448 	}
    449 	if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
    450 	switch(x->haveAttr){
    451 	case 1:
    452 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
    453 		break;
    454 	}
    455 	*pa = a;
    456 	return 0;
    457 Err:
    458 	*pa = ea;
    459 	return -1;
    460 }
    461 int
    462 nfs3wccunpack(uchar *a, uchar *ea, uchar **pa, Nfs3Wcc *x)
    463 {
    464 	if(sunuint1unpack(a, ea, &a, &x->haveWccAttr) < 0) goto Err;
    465 	switch(x->haveWccAttr){
    466 	case 1:
    467 		if(nfs3wccattrunpack(a, ea, &a, &x->wccAttr) < 0) goto Err;
    468 		break;
    469 	}
    470 	if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
    471 	switch(x->haveAttr){
    472 	case 1:
    473 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
    474 		break;
    475 	}
    476 	*pa = a;
    477 	return 0;
    478 Err:
    479 	*pa = ea;
    480 	return -1;
    481 }
    482 char*
    483 nfs3settimestr(Nfs3SetTime x)
    484 {
    485 	switch(x){
    486 	case Nfs3SetTimeDont:
    487 		return "Nfs3SetTimeDont";
    488 	case Nfs3SetTimeServer:
    489 		return "Nfs3SetTimeServer";
    490 	case Nfs3SetTimeClient:
    491 		return "Nfs3SetTimeClient";
    492 	default:
    493 		return "unknown";
    494 	}
    495 }
    496 
    497 void
    498 nfs3setattrprint(Fmt *fmt, Nfs3SetAttr *x)
    499 {
    500 	fmtprint(fmt, "%s\n", "Nfs3SetAttr");
    501 	fmtprint(fmt, "\t%s=", "setMode");
    502 	fmtprint(fmt, "%d", x->setMode);
    503 	fmtprint(fmt, "\n");
    504 	switch(x->setMode){
    505 	case 1:
    506 		fmtprint(fmt, "\t%s=", "mode");
    507 		fmtprint(fmt, "%ud", x->mode);
    508 		fmtprint(fmt, "\n");
    509 		break;
    510 	}
    511 	fmtprint(fmt, "\t%s=", "setUid");
    512 	fmtprint(fmt, "%d", x->setUid);
    513 	fmtprint(fmt, "\n");
    514 	switch(x->setUid){
    515 	case 1:
    516 		fmtprint(fmt, "\t%s=", "uid");
    517 		fmtprint(fmt, "%ud", x->uid);
    518 		fmtprint(fmt, "\n");
    519 		break;
    520 	}
    521 	fmtprint(fmt, "\t%s=", "setGid");
    522 	fmtprint(fmt, "%d", x->setGid);
    523 	fmtprint(fmt, "\n");
    524 	switch(x->setGid){
    525 	case 1:
    526 		fmtprint(fmt, "\t%s=", "gid");
    527 		fmtprint(fmt, "%ud", x->gid);
    528 		fmtprint(fmt, "\n");
    529 		break;
    530 	}
    531 	fmtprint(fmt, "\t%s=", "setSize");
    532 	fmtprint(fmt, "%d", x->setSize);
    533 	fmtprint(fmt, "\n");
    534 	switch(x->setSize){
    535 	case 1:
    536 		fmtprint(fmt, "\t%s=", "size");
    537 		fmtprint(fmt, "%llud", x->size);
    538 		fmtprint(fmt, "\n");
    539 		break;
    540 	}
    541 	fmtprint(fmt, "\t%s=", "setAtime");
    542 	fmtprint(fmt, "%s", nfs3settimestr(x->setAtime));
    543 	fmtprint(fmt, "\n");
    544 	switch(x->setAtime){
    545 	case Nfs3SetTimeClient:
    546 		fmtprint(fmt, "\t%s=", "atime");
    547 		nfs3timeprint(fmt, &x->atime);
    548 		fmtprint(fmt, "\n");
    549 		break;
    550 	}
    551 	fmtprint(fmt, "\t%s=", "setMtime");
    552 	fmtprint(fmt, "%s", nfs3settimestr(x->setMtime));
    553 	fmtprint(fmt, "\n");
    554 	switch(x->setMtime){
    555 	case Nfs3SetTimeClient:
    556 		fmtprint(fmt, "\t%s=", "mtime");
    557 		nfs3timeprint(fmt, &x->mtime);
    558 		fmtprint(fmt, "\n");
    559 		break;
    560 	}
    561 }
    562 uint
    563 nfs3setattrsize(Nfs3SetAttr *x)
    564 {
    565 	uint a;
    566 	USED(x);
    567 	a = 0 + 4;
    568 	switch(x->setMode){
    569 	case 1:
    570 		a = a + 4;
    571 		break;
    572 	}
    573 	a = a + 4;
    574 	switch(x->setUid){
    575 	case 1:
    576 		a = a + 4;
    577 		break;
    578 	}
    579 	a = a + 4;
    580 	switch(x->setGid){
    581 	case 1:
    582 		a = a + 4;
    583 		break;
    584 	}
    585 	a = a + 4;
    586 	switch(x->setSize){
    587 	case 1:
    588 		a = a + 8;
    589 		break;
    590 	}
    591 	a = a + 4;
    592 	switch(x->setAtime){
    593 	case Nfs3SetTimeClient:
    594 		a = a + nfs3timesize(&x->atime);
    595 		break;
    596 	}
    597 	a = a + 4;
    598 	switch(x->setMtime){
    599 	case Nfs3SetTimeClient:
    600 		a = a + nfs3timesize(&x->mtime);
    601 		break;
    602 	}
    603 	return a;
    604 }
    605 int
    606 nfs3setattrpack(uchar *a, uchar *ea, uchar **pa, Nfs3SetAttr *x)
    607 {
    608 	int i;
    609 
    610 	if(sunuint1pack(a, ea, &a, &x->setMode) < 0) goto Err;
    611 	switch(x->setMode){
    612 	case 1:
    613 		if(sunuint32pack(a, ea, &a, &x->mode) < 0) goto Err;
    614 		break;
    615 	}
    616 	if(sunuint1pack(a, ea, &a, &x->setUid) < 0) goto Err;
    617 	switch(x->setUid){
    618 	case 1:
    619 		if(sunuint32pack(a, ea, &a, &x->uid) < 0) goto Err;
    620 		break;
    621 	}
    622 	if(sunuint1pack(a, ea, &a, &x->setGid) < 0) goto Err;
    623 	switch(x->setGid){
    624 	case 1:
    625 		if(sunuint32pack(a, ea, &a, &x->gid) < 0) goto Err;
    626 		break;
    627 	}
    628 	if(sunuint1pack(a, ea, &a, &x->setSize) < 0) goto Err;
    629 	switch(x->setSize){
    630 	case 1:
    631 		if(sunuint64pack(a, ea, &a, &x->size) < 0) goto Err;
    632 		break;
    633 	}
    634 	if(i=x->setAtime, sunenumpack(a, ea, &a, &i) < 0) goto Err;
    635 	switch(x->setAtime){
    636 	case Nfs3SetTimeClient:
    637 		if(nfs3timepack(a, ea, &a, &x->atime) < 0) goto Err;
    638 		break;
    639 	}
    640 	if(i=x->setMtime, sunenumpack(a, ea, &a, &i) < 0) goto Err;
    641 	switch(x->setMtime){
    642 	case Nfs3SetTimeClient:
    643 		if(nfs3timepack(a, ea, &a, &x->mtime) < 0) goto Err;
    644 		break;
    645 	}
    646 	*pa = a;
    647 	return 0;
    648 Err:
    649 	*pa = ea;
    650 	return -1;
    651 }
    652 int
    653 nfs3setattrunpack(uchar *a, uchar *ea, uchar **pa, Nfs3SetAttr *x)
    654 {
    655 	int i;
    656 
    657 	if(sunuint1unpack(a, ea, &a, &x->setMode) < 0) goto Err;
    658 	switch(x->setMode){
    659 	case 1:
    660 		if(sunuint32unpack(a, ea, &a, &x->mode) < 0) goto Err;
    661 		break;
    662 	}
    663 	if(sunuint1unpack(a, ea, &a, &x->setUid) < 0) goto Err;
    664 	switch(x->setUid){
    665 	case 1:
    666 		if(sunuint32unpack(a, ea, &a, &x->uid) < 0) goto Err;
    667 		break;
    668 	}
    669 	if(sunuint1unpack(a, ea, &a, &x->setGid) < 0) goto Err;
    670 	switch(x->setGid){
    671 	case 1:
    672 		if(sunuint32unpack(a, ea, &a, &x->gid) < 0) goto Err;
    673 		break;
    674 	}
    675 	if(sunuint1unpack(a, ea, &a, &x->setSize) < 0) goto Err;
    676 	switch(x->setSize){
    677 	case 1:
    678 		if(sunuint64unpack(a, ea, &a, &x->size) < 0) goto Err;
    679 		break;
    680 	}
    681 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->setAtime = i;
    682 	switch(x->setAtime){
    683 	case Nfs3SetTimeClient:
    684 		if(nfs3timeunpack(a, ea, &a, &x->atime) < 0) goto Err;
    685 		break;
    686 	}
    687 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->setMtime = i;
    688 	switch(x->setMtime){
    689 	case Nfs3SetTimeClient:
    690 		if(nfs3timeunpack(a, ea, &a, &x->mtime) < 0) goto Err;
    691 		break;
    692 	}
    693 	*pa = a;
    694 	return 0;
    695 Err:
    696 	*pa = ea;
    697 	return -1;
    698 }
    699 void
    700 nfs3tnullprint(Fmt *fmt, Nfs3TNull *x)
    701 {
    702 	USED(x);
    703 	fmtprint(fmt, "%s\n", "Nfs3TNull");
    704 }
    705 uint
    706 nfs3tnullsize(Nfs3TNull *x)
    707 {
    708 	uint a;
    709 	USED(x);
    710 	a = 0;
    711 	return a;
    712 }
    713 int
    714 nfs3tnullpack(uchar *a, uchar *ea, uchar **pa, Nfs3TNull *x)
    715 {
    716 	USED(x);
    717 	USED(ea);
    718 	*pa = a;
    719 	return 0;
    720 }
    721 int
    722 nfs3tnullunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TNull *x)
    723 {
    724 	USED(x);
    725 	USED(ea);
    726 	*pa = a;
    727 	return 0;
    728 }
    729 void
    730 nfs3rnullprint(Fmt *fmt, Nfs3RNull *x)
    731 {
    732 	USED(x);
    733 	fmtprint(fmt, "%s\n", "Nfs3RNull");
    734 }
    735 uint
    736 nfs3rnullsize(Nfs3RNull *x)
    737 {
    738 	uint a;
    739 	USED(x);
    740 	a = 0;
    741 	return a;
    742 }
    743 int
    744 nfs3rnullpack(uchar *a, uchar *ea, uchar **pa, Nfs3RNull *x)
    745 {
    746 	USED(ea);
    747 	USED(x);
    748 	*pa = a;
    749 	return 0;
    750 }
    751 int
    752 nfs3rnullunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RNull *x)
    753 {
    754 	USED(ea);
    755 	USED(x);
    756 	*pa = a;
    757 	return 0;
    758 }
    759 void
    760 nfs3tgetattrprint(Fmt *fmt, Nfs3TGetattr *x)
    761 {
    762 	fmtprint(fmt, "%s\n", "Nfs3TGetattr");
    763 	fmtprint(fmt, "\t%s=", "handle");
    764 	nfs3handleprint(fmt, &x->handle);
    765 	fmtprint(fmt, "\n");
    766 }
    767 uint
    768 nfs3tgetattrsize(Nfs3TGetattr *x)
    769 {
    770 	uint a;
    771 	USED(x);
    772 	a = 0 + nfs3handlesize(&x->handle);
    773 	return a;
    774 }
    775 int
    776 nfs3tgetattrpack(uchar *a, uchar *ea, uchar **pa, Nfs3TGetattr *x)
    777 {
    778 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
    779 	*pa = a;
    780 	return 0;
    781 Err:
    782 	*pa = ea;
    783 	return -1;
    784 }
    785 int
    786 nfs3tgetattrunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TGetattr *x)
    787 {
    788 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
    789 	*pa = a;
    790 	return 0;
    791 Err:
    792 	*pa = ea;
    793 	return -1;
    794 }
    795 void
    796 nfs3rgetattrprint(Fmt *fmt, Nfs3RGetattr *x)
    797 {
    798 	fmtprint(fmt, "%s\n", "Nfs3RGetattr");
    799 	fmtprint(fmt, "\t%s=", "status");
    800 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
    801 	fmtprint(fmt, "\n");
    802 	switch(x->status){
    803 	case Nfs3Ok:
    804 		fmtprint(fmt, "\t%s=", "attr");
    805 		nfs3attrprint(fmt, &x->attr);
    806 		fmtprint(fmt, "\n");
    807 		break;
    808 	}
    809 }
    810 uint
    811 nfs3rgetattrsize(Nfs3RGetattr *x)
    812 {
    813 	uint a;
    814 	USED(x);
    815 	a = 0 + 4;
    816 	switch(x->status){
    817 	case Nfs3Ok:
    818 		a = a + nfs3attrsize(&x->attr);
    819 		break;
    820 	}
    821 	return a;
    822 }
    823 int
    824 nfs3rgetattrpack(uchar *a, uchar *ea, uchar **pa, Nfs3RGetattr *x)
    825 {
    826 	int i;
    827 
    828 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
    829 	switch(x->status){
    830 	case Nfs3Ok:
    831 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
    832 		break;
    833 	}
    834 	*pa = a;
    835 	return 0;
    836 Err:
    837 	*pa = ea;
    838 	return -1;
    839 }
    840 int
    841 nfs3rgetattrunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RGetattr *x)
    842 {
    843 	int i;
    844 
    845 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
    846 	switch(x->status){
    847 	case Nfs3Ok:
    848 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
    849 		break;
    850 	}
    851 	*pa = a;
    852 	return 0;
    853 Err:
    854 	*pa = ea;
    855 	return -1;
    856 }
    857 void
    858 nfs3tsetattrprint(Fmt *fmt, Nfs3TSetattr *x)
    859 {
    860 	fmtprint(fmt, "%s\n", "Nfs3TSetattr");
    861 	fmtprint(fmt, "\t%s=", "handle");
    862 	nfs3handleprint(fmt, &x->handle);
    863 	fmtprint(fmt, "\n");
    864 	fmtprint(fmt, "\t%s=", "attr");
    865 	nfs3setattrprint(fmt, &x->attr);
    866 	fmtprint(fmt, "\n");
    867 	fmtprint(fmt, "\t%s=", "checkCtime");
    868 	fmtprint(fmt, "%d", x->checkCtime);
    869 	fmtprint(fmt, "\n");
    870 	switch(x->checkCtime){
    871 	case 1:
    872 		fmtprint(fmt, "\t%s=", "ctime");
    873 		nfs3timeprint(fmt, &x->ctime);
    874 		fmtprint(fmt, "\n");
    875 		break;
    876 	}
    877 }
    878 uint
    879 nfs3tsetattrsize(Nfs3TSetattr *x)
    880 {
    881 	uint a;
    882 	USED(x);
    883 	a = 0 + nfs3handlesize(&x->handle) + nfs3setattrsize(&x->attr) + 4;
    884 	switch(x->checkCtime){
    885 	case 1:
    886 		a = a + nfs3timesize(&x->ctime);
    887 		break;
    888 	}
    889 	return a;
    890 }
    891 int
    892 nfs3tsetattrpack(uchar *a, uchar *ea, uchar **pa, Nfs3TSetattr *x)
    893 {
    894 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
    895 	if(nfs3setattrpack(a, ea, &a, &x->attr) < 0) goto Err;
    896 	if(sunuint1pack(a, ea, &a, &x->checkCtime) < 0) goto Err;
    897 	switch(x->checkCtime){
    898 	case 1:
    899 		if(nfs3timepack(a, ea, &a, &x->ctime) < 0) goto Err;
    900 		break;
    901 	}
    902 	*pa = a;
    903 	return 0;
    904 Err:
    905 	*pa = ea;
    906 	return -1;
    907 }
    908 int
    909 nfs3tsetattrunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TSetattr *x)
    910 {
    911 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
    912 	if(nfs3setattrunpack(a, ea, &a, &x->attr) < 0) goto Err;
    913 	if(sunuint1unpack(a, ea, &a, &x->checkCtime) < 0) goto Err;
    914 	switch(x->checkCtime){
    915 	case 1:
    916 		if(nfs3timeunpack(a, ea, &a, &x->ctime) < 0) goto Err;
    917 		break;
    918 	}
    919 	*pa = a;
    920 	return 0;
    921 Err:
    922 	*pa = ea;
    923 	return -1;
    924 }
    925 void
    926 nfs3rsetattrprint(Fmt *fmt, Nfs3RSetattr *x)
    927 {
    928 	fmtprint(fmt, "%s\n", "Nfs3RSetattr");
    929 	fmtprint(fmt, "\t%s=", "status");
    930 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
    931 	fmtprint(fmt, "\n");
    932 	fmtprint(fmt, "\t%s=", "wcc");
    933 	nfs3wccprint(fmt, &x->wcc);
    934 	fmtprint(fmt, "\n");
    935 }
    936 uint
    937 nfs3rsetattrsize(Nfs3RSetattr *x)
    938 {
    939 	uint a;
    940 	USED(x);
    941 	a = 0 + 4 + nfs3wccsize(&x->wcc);
    942 	return a;
    943 }
    944 int
    945 nfs3rsetattrpack(uchar *a, uchar *ea, uchar **pa, Nfs3RSetattr *x)
    946 {
    947 	int i;
    948 
    949 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
    950 	if(nfs3wccpack(a, ea, &a, &x->wcc) < 0) goto Err;
    951 	*pa = a;
    952 	return 0;
    953 Err:
    954 	*pa = ea;
    955 	return -1;
    956 }
    957 int
    958 nfs3rsetattrunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RSetattr *x)
    959 {
    960 	int i;
    961 
    962 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
    963 	if(nfs3wccunpack(a, ea, &a, &x->wcc) < 0) goto Err;
    964 	*pa = a;
    965 	return 0;
    966 Err:
    967 	*pa = ea;
    968 	return -1;
    969 }
    970 void
    971 nfs3tlookupprint(Fmt *fmt, Nfs3TLookup *x)
    972 {
    973 	fmtprint(fmt, "%s\n", "Nfs3TLookup");
    974 	fmtprint(fmt, "\t%s=", "handle");
    975 	nfs3handleprint(fmt, &x->handle);
    976 	fmtprint(fmt, "\n");
    977 	fmtprint(fmt, "\t%s=", "name");
    978 	fmtprint(fmt, "\"%s\"", x->name);
    979 	fmtprint(fmt, "\n");
    980 }
    981 uint
    982 nfs3tlookupsize(Nfs3TLookup *x)
    983 {
    984 	uint a;
    985 	USED(x);
    986 	a = 0 + nfs3handlesize(&x->handle) + sunstringsize(x->name);
    987 	return a;
    988 }
    989 int
    990 nfs3tlookuppack(uchar *a, uchar *ea, uchar **pa, Nfs3TLookup *x)
    991 {
    992 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
    993 	if(sunstringpack(a, ea, &a, &x->name, -1) < 0) goto Err;
    994 	*pa = a;
    995 	return 0;
    996 Err:
    997 	*pa = ea;
    998 	return -1;
    999 }
   1000 int
   1001 nfs3tlookupunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TLookup *x)
   1002 {
   1003 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   1004 	if(sunstringunpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   1005 	*pa = a;
   1006 	return 0;
   1007 Err:
   1008 	*pa = ea;
   1009 	return -1;
   1010 }
   1011 void
   1012 nfs3rlookupprint(Fmt *fmt, Nfs3RLookup *x)
   1013 {
   1014 	fmtprint(fmt, "%s\n", "Nfs3RLookup");
   1015 	fmtprint(fmt, "\t%s=", "status");
   1016 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   1017 	fmtprint(fmt, "\n");
   1018 	switch(x->status){
   1019 	case Nfs3Ok:
   1020 		fmtprint(fmt, "\t%s=", "handle");
   1021 		nfs3handleprint(fmt, &x->handle);
   1022 		fmtprint(fmt, "\n");
   1023 		fmtprint(fmt, "\t%s=", "haveAttr");
   1024 		fmtprint(fmt, "%d", x->haveAttr);
   1025 		fmtprint(fmt, "\n");
   1026 		switch(x->haveAttr){
   1027 		case 1:
   1028 			fmtprint(fmt, "\t%s=", "attr");
   1029 			nfs3attrprint(fmt, &x->attr);
   1030 			fmtprint(fmt, "\n");
   1031 			break;
   1032 		}
   1033 		break;
   1034 	}
   1035 	fmtprint(fmt, "\t%s=", "haveDirAttr");
   1036 	fmtprint(fmt, "%d", x->haveDirAttr);
   1037 	fmtprint(fmt, "\n");
   1038 	switch(x->haveDirAttr){
   1039 	case 1:
   1040 		fmtprint(fmt, "\t%s=", "dirAttr");
   1041 		nfs3attrprint(fmt, &x->dirAttr);
   1042 		fmtprint(fmt, "\n");
   1043 		break;
   1044 	}
   1045 }
   1046 uint
   1047 nfs3rlookupsize(Nfs3RLookup *x)
   1048 {
   1049 	uint a;
   1050 	USED(x);
   1051 	a = 0 + 4;
   1052 	switch(x->status){
   1053 	case Nfs3Ok:
   1054 		a = a + nfs3handlesize(&x->handle) + 4;
   1055 		switch(x->haveAttr){
   1056 		case 1:
   1057 			a = a + nfs3attrsize(&x->attr);
   1058 			break;
   1059 		}
   1060 			break;
   1061 	}
   1062 	a = a + 4;
   1063 	switch(x->haveDirAttr){
   1064 	case 1:
   1065 		a = a + nfs3attrsize(&x->dirAttr);
   1066 		break;
   1067 	}
   1068 	return a;
   1069 }
   1070 int
   1071 nfs3rlookuppack(uchar *a, uchar *ea, uchar **pa, Nfs3RLookup *x)
   1072 {
   1073 	int i;
   1074 
   1075 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   1076 	switch(x->status){
   1077 	case Nfs3Ok:
   1078 		if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   1079 		if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   1080 		switch(x->haveAttr){
   1081 		case 1:
   1082 			if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   1083 			break;
   1084 		}
   1085 		break;
   1086 	}
   1087 	if(sunuint1pack(a, ea, &a, &x->haveDirAttr) < 0) goto Err;
   1088 	switch(x->haveDirAttr){
   1089 	case 1:
   1090 		if(nfs3attrpack(a, ea, &a, &x->dirAttr) < 0) goto Err;
   1091 		break;
   1092 	}
   1093 	*pa = a;
   1094 	return 0;
   1095 Err:
   1096 	*pa = ea;
   1097 	return -1;
   1098 }
   1099 int
   1100 nfs3rlookupunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RLookup *x)
   1101 {
   1102 	int i;
   1103 
   1104 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   1105 	switch(x->status){
   1106 	case Nfs3Ok:
   1107 		if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   1108 		if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   1109 		switch(x->haveAttr){
   1110 		case 1:
   1111 			if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   1112 			break;
   1113 		}
   1114 		break;
   1115 	}
   1116 	if(sunuint1unpack(a, ea, &a, &x->haveDirAttr) < 0) goto Err;
   1117 	switch(x->haveDirAttr){
   1118 	case 1:
   1119 		if(nfs3attrunpack(a, ea, &a, &x->dirAttr) < 0) goto Err;
   1120 		break;
   1121 	}
   1122 	*pa = a;
   1123 	return 0;
   1124 Err:
   1125 	*pa = ea;
   1126 	return -1;
   1127 }
   1128 void
   1129 nfs3taccessprint(Fmt *fmt, Nfs3TAccess *x)
   1130 {
   1131 	fmtprint(fmt, "%s\n", "Nfs3TAccess");
   1132 	fmtprint(fmt, "\t%s=", "handle");
   1133 	nfs3handleprint(fmt, &x->handle);
   1134 	fmtprint(fmt, "\n");
   1135 	fmtprint(fmt, "\t%s=", "access");
   1136 	fmtprint(fmt, "%ud", x->access);
   1137 	fmtprint(fmt, "\n");
   1138 }
   1139 uint
   1140 nfs3taccesssize(Nfs3TAccess *x)
   1141 {
   1142 	uint a;
   1143 	USED(x);
   1144 	a = 0 + nfs3handlesize(&x->handle) + 4;
   1145 	return a;
   1146 }
   1147 int
   1148 nfs3taccesspack(uchar *a, uchar *ea, uchar **pa, Nfs3TAccess *x)
   1149 {
   1150 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   1151 	if(sunuint32pack(a, ea, &a, &x->access) < 0) goto Err;
   1152 	*pa = a;
   1153 	return 0;
   1154 Err:
   1155 	*pa = ea;
   1156 	return -1;
   1157 }
   1158 int
   1159 nfs3taccessunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TAccess *x)
   1160 {
   1161 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   1162 	if(sunuint32unpack(a, ea, &a, &x->access) < 0) goto Err;
   1163 	*pa = a;
   1164 	return 0;
   1165 Err:
   1166 	*pa = ea;
   1167 	return -1;
   1168 }
   1169 void
   1170 nfs3raccessprint(Fmt *fmt, Nfs3RAccess *x)
   1171 {
   1172 	fmtprint(fmt, "%s\n", "Nfs3RAccess");
   1173 	fmtprint(fmt, "\t%s=", "status");
   1174 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   1175 	fmtprint(fmt, "\n");
   1176 	fmtprint(fmt, "\t%s=", "haveAttr");
   1177 	fmtprint(fmt, "%d", x->haveAttr);
   1178 	fmtprint(fmt, "\n");
   1179 	switch(x->haveAttr){
   1180 	case 1:
   1181 		fmtprint(fmt, "\t%s=", "attr");
   1182 		nfs3attrprint(fmt, &x->attr);
   1183 		fmtprint(fmt, "\n");
   1184 		break;
   1185 	}
   1186 	switch(x->status){
   1187 	case Nfs3Ok:
   1188 		fmtprint(fmt, "\t%s=", "access");
   1189 		fmtprint(fmt, "%ud", x->access);
   1190 		fmtprint(fmt, "\n");
   1191 		break;
   1192 	}
   1193 }
   1194 uint
   1195 nfs3raccesssize(Nfs3RAccess *x)
   1196 {
   1197 	uint a;
   1198 	USED(x);
   1199 	a = 0 + 4 + 4;
   1200 	switch(x->haveAttr){
   1201 	case 1:
   1202 		a = a + nfs3attrsize(&x->attr);
   1203 		break;
   1204 	}
   1205 	switch(x->status){
   1206 	case Nfs3Ok:
   1207 		a = a + 4;
   1208 		break;
   1209 	}
   1210 	return a;
   1211 }
   1212 int
   1213 nfs3raccesspack(uchar *a, uchar *ea, uchar **pa, Nfs3RAccess *x)
   1214 {
   1215 	int i;
   1216 
   1217 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   1218 	if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   1219 	switch(x->haveAttr){
   1220 	case 1:
   1221 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   1222 		break;
   1223 	}
   1224 	switch(x->status){
   1225 	case Nfs3Ok:
   1226 		if(sunuint32pack(a, ea, &a, &x->access) < 0) goto Err;
   1227 		break;
   1228 	}
   1229 	*pa = a;
   1230 	return 0;
   1231 Err:
   1232 	*pa = ea;
   1233 	return -1;
   1234 }
   1235 int
   1236 nfs3raccessunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RAccess *x)
   1237 {
   1238 	int i;
   1239 
   1240 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   1241 	if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   1242 	switch(x->haveAttr){
   1243 	case 1:
   1244 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   1245 		break;
   1246 	}
   1247 	switch(x->status){
   1248 	case Nfs3Ok:
   1249 		if(sunuint32unpack(a, ea, &a, &x->access) < 0) goto Err;
   1250 		break;
   1251 	}
   1252 	*pa = a;
   1253 	return 0;
   1254 Err:
   1255 	*pa = ea;
   1256 	return -1;
   1257 }
   1258 void
   1259 nfs3treadlinkprint(Fmt *fmt, Nfs3TReadlink *x)
   1260 {
   1261 	fmtprint(fmt, "%s\n", "Nfs3TReadlink");
   1262 	fmtprint(fmt, "\t%s=", "handle");
   1263 	nfs3handleprint(fmt, &x->handle);
   1264 	fmtprint(fmt, "\n");
   1265 }
   1266 uint
   1267 nfs3treadlinksize(Nfs3TReadlink *x)
   1268 {
   1269 	uint a;
   1270 	USED(x);
   1271 	a = 0 + nfs3handlesize(&x->handle);
   1272 	return a;
   1273 }
   1274 int
   1275 nfs3treadlinkpack(uchar *a, uchar *ea, uchar **pa, Nfs3TReadlink *x)
   1276 {
   1277 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   1278 	*pa = a;
   1279 	return 0;
   1280 Err:
   1281 	*pa = ea;
   1282 	return -1;
   1283 }
   1284 int
   1285 nfs3treadlinkunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TReadlink *x)
   1286 {
   1287 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   1288 	*pa = a;
   1289 	return 0;
   1290 Err:
   1291 	*pa = ea;
   1292 	return -1;
   1293 }
   1294 void
   1295 nfs3rreadlinkprint(Fmt *fmt, Nfs3RReadlink *x)
   1296 {
   1297 	fmtprint(fmt, "%s\n", "Nfs3RReadlink");
   1298 	fmtprint(fmt, "\t%s=", "status");
   1299 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   1300 	fmtprint(fmt, "\n");
   1301 	fmtprint(fmt, "\t%s=", "haveAttr");
   1302 	fmtprint(fmt, "%d", x->haveAttr);
   1303 	fmtprint(fmt, "\n");
   1304 	switch(x->haveAttr){
   1305 	case 1:
   1306 		fmtprint(fmt, "\t%s=", "attr");
   1307 		nfs3attrprint(fmt, &x->attr);
   1308 		fmtprint(fmt, "\n");
   1309 		break;
   1310 	}
   1311 	switch(x->status){
   1312 	case Nfs3Ok:
   1313 		fmtprint(fmt, "\t%s=", "data");
   1314 		fmtprint(fmt, "\"%s\"", x->data);
   1315 		fmtprint(fmt, "\n");
   1316 		break;
   1317 	}
   1318 }
   1319 uint
   1320 nfs3rreadlinksize(Nfs3RReadlink *x)
   1321 {
   1322 	uint a;
   1323 	USED(x);
   1324 	a = 0 + 4 + 4;
   1325 	switch(x->haveAttr){
   1326 	case 1:
   1327 		a = a + nfs3attrsize(&x->attr);
   1328 		break;
   1329 	}
   1330 	switch(x->status){
   1331 	case Nfs3Ok:
   1332 		a = a + sunstringsize(x->data);
   1333 		break;
   1334 	}
   1335 	return a;
   1336 }
   1337 int
   1338 nfs3rreadlinkpack(uchar *a, uchar *ea, uchar **pa, Nfs3RReadlink *x)
   1339 {
   1340 	int i;
   1341 
   1342 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   1343 	if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   1344 	switch(x->haveAttr){
   1345 	case 1:
   1346 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   1347 		break;
   1348 	}
   1349 	switch(x->status){
   1350 	case Nfs3Ok:
   1351 		if(sunstringpack(a, ea, &a, &x->data, -1) < 0) goto Err;
   1352 		break;
   1353 	}
   1354 	*pa = a;
   1355 	return 0;
   1356 Err:
   1357 	*pa = ea;
   1358 	return -1;
   1359 }
   1360 int
   1361 nfs3rreadlinkunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RReadlink *x)
   1362 {
   1363 	int i;
   1364 
   1365 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   1366 	if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   1367 	switch(x->haveAttr){
   1368 	case 1:
   1369 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   1370 		break;
   1371 	}
   1372 	switch(x->status){
   1373 	case Nfs3Ok:
   1374 		if(sunstringunpack(a, ea, &a, &x->data, -1) < 0) goto Err;
   1375 		break;
   1376 	}
   1377 	*pa = a;
   1378 	return 0;
   1379 Err:
   1380 	*pa = ea;
   1381 	return -1;
   1382 }
   1383 void
   1384 nfs3treadprint(Fmt *fmt, Nfs3TRead *x)
   1385 {
   1386 	fmtprint(fmt, "%s\n", "Nfs3TRead");
   1387 	fmtprint(fmt, "\t%s=", "handle");
   1388 	nfs3handleprint(fmt, &x->handle);
   1389 	fmtprint(fmt, "\n");
   1390 	fmtprint(fmt, "\t%s=", "offset");
   1391 	fmtprint(fmt, "%llud", x->offset);
   1392 	fmtprint(fmt, "\n");
   1393 	fmtprint(fmt, "\t%s=", "count");
   1394 	fmtprint(fmt, "%ud", x->count);
   1395 	fmtprint(fmt, "\n");
   1396 }
   1397 uint
   1398 nfs3treadsize(Nfs3TRead *x)
   1399 {
   1400 	uint a;
   1401 	USED(x);
   1402 	a = 0 + nfs3handlesize(&x->handle) + 8 + 4;
   1403 	return a;
   1404 }
   1405 int
   1406 nfs3treadpack(uchar *a, uchar *ea, uchar **pa, Nfs3TRead *x)
   1407 {
   1408 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   1409 	if(sunuint64pack(a, ea, &a, &x->offset) < 0) goto Err;
   1410 	if(sunuint32pack(a, ea, &a, &x->count) < 0) goto Err;
   1411 	*pa = a;
   1412 	return 0;
   1413 Err:
   1414 	*pa = ea;
   1415 	return -1;
   1416 }
   1417 int
   1418 nfs3treadunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TRead *x)
   1419 {
   1420 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   1421 	if(sunuint64unpack(a, ea, &a, &x->offset) < 0) goto Err;
   1422 	if(sunuint32unpack(a, ea, &a, &x->count) < 0) goto Err;
   1423 	*pa = a;
   1424 	return 0;
   1425 Err:
   1426 	*pa = ea;
   1427 	return -1;
   1428 }
   1429 void
   1430 nfs3rreadprint(Fmt *fmt, Nfs3RRead *x)
   1431 {
   1432 	fmtprint(fmt, "%s\n", "Nfs3RRead");
   1433 	fmtprint(fmt, "\t%s=", "status");
   1434 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   1435 	fmtprint(fmt, "\n");
   1436 	fmtprint(fmt, "\t%s=", "haveAttr");
   1437 	fmtprint(fmt, "%d", x->haveAttr);
   1438 	fmtprint(fmt, "\n");
   1439 	switch(x->haveAttr){
   1440 	case 1:
   1441 		fmtprint(fmt, "\t%s=", "attr");
   1442 		nfs3attrprint(fmt, &x->attr);
   1443 		fmtprint(fmt, "\n");
   1444 		break;
   1445 	}
   1446 	switch(x->status){
   1447 	case Nfs3Ok:
   1448 		fmtprint(fmt, "\t%s=", "count");
   1449 		fmtprint(fmt, "%ud", x->count);
   1450 		fmtprint(fmt, "\n");
   1451 		fmtprint(fmt, "\t%s=", "eof");
   1452 		fmtprint(fmt, "%d", x->eof);
   1453 		fmtprint(fmt, "\n");
   1454 		fmtprint(fmt, "\t%s=", "data");
   1455 		if(x->ndata <= 32)
   1456 			fmtprint(fmt, "%.*H", x->ndata, x->data);
   1457 		else
   1458 			fmtprint(fmt, "%.32H...", x->data);
   1459 		fmtprint(fmt, "\n");
   1460 		break;
   1461 	}
   1462 }
   1463 uint
   1464 nfs3rreadsize(Nfs3RRead *x)
   1465 {
   1466 	uint a;
   1467 	USED(x);
   1468 	a = 0 + 4 + 4;
   1469 	switch(x->haveAttr){
   1470 	case 1:
   1471 		a = a + nfs3attrsize(&x->attr);
   1472 		break;
   1473 	}
   1474 	switch(x->status){
   1475 	case Nfs3Ok:
   1476 		a = a + 4 + 4 + sunvaropaquesize(x->ndata);
   1477 		break;
   1478 	}
   1479 	return a;
   1480 }
   1481 int
   1482 nfs3rreadpack(uchar *a, uchar *ea, uchar **pa, Nfs3RRead *x)
   1483 {
   1484 	int i;
   1485 
   1486 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   1487 	if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   1488 	switch(x->haveAttr){
   1489 	case 1:
   1490 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   1491 		break;
   1492 	}
   1493 	switch(x->status){
   1494 	case Nfs3Ok:
   1495 		if(sunuint32pack(a, ea, &a, &x->count) < 0) goto Err;
   1496 		if(sunuint1pack(a, ea, &a, &x->eof) < 0) goto Err;
   1497 		if(sunvaropaquepack(a, ea, &a, &x->data, &x->ndata, x->count) < 0) goto Err;
   1498 		break;
   1499 	}
   1500 	*pa = a;
   1501 	return 0;
   1502 Err:
   1503 	*pa = ea;
   1504 	return -1;
   1505 }
   1506 int
   1507 nfs3rreadunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RRead *x)
   1508 {
   1509 	int i;
   1510 
   1511 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   1512 	if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   1513 	switch(x->haveAttr){
   1514 	case 1:
   1515 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   1516 		break;
   1517 	}
   1518 	switch(x->status){
   1519 	case Nfs3Ok:
   1520 		if(sunuint32unpack(a, ea, &a, &x->count) < 0) goto Err;
   1521 		if(sunuint1unpack(a, ea, &a, &x->eof) < 0) goto Err;
   1522 		if(sunvaropaqueunpack(a, ea, &a, &x->data, &x->ndata, x->count) < 0) goto Err;
   1523 		break;
   1524 	}
   1525 	*pa = a;
   1526 	return 0;
   1527 Err:
   1528 	*pa = ea;
   1529 	return -1;
   1530 }
   1531 char*
   1532 nfs3syncstr(Nfs3Sync x)
   1533 {
   1534 	switch(x){
   1535 	case Nfs3SyncNone:
   1536 		return "Nfs3SyncNone";
   1537 	case Nfs3SyncData:
   1538 		return "Nfs3SyncData";
   1539 	case Nfs3SyncFile:
   1540 		return "Nfs3SyncFile";
   1541 	default:
   1542 		return "unknown";
   1543 	}
   1544 }
   1545 
   1546 void
   1547 nfs3twriteprint(Fmt *fmt, Nfs3TWrite *x)
   1548 {
   1549 	fmtprint(fmt, "%s\n", "Nfs3TWrite");
   1550 	fmtprint(fmt, "\t%s=", "file");
   1551 	nfs3handleprint(fmt, &x->handle);
   1552 	fmtprint(fmt, "\n");
   1553 	fmtprint(fmt, "\t%s=", "offset");
   1554 	fmtprint(fmt, "%llud", x->offset);
   1555 	fmtprint(fmt, "\n");
   1556 	fmtprint(fmt, "\t%s=", "count");
   1557 	fmtprint(fmt, "%ud", x->count);
   1558 	fmtprint(fmt, "\n");
   1559 	fmtprint(fmt, "\t%s=", "stable");
   1560 	fmtprint(fmt, "%s", nfs3syncstr(x->stable));
   1561 	fmtprint(fmt, "\n");
   1562 	fmtprint(fmt, "\t%s=", "data");
   1563 	if(x->ndata > 32)
   1564 		fmtprint(fmt, "%.32H... (%d)", x->data, x->ndata);
   1565 	else
   1566 		fmtprint(fmt, "%.*H", x->ndata, x->data);
   1567 	fmtprint(fmt, "\n");
   1568 }
   1569 uint
   1570 nfs3twritesize(Nfs3TWrite *x)
   1571 {
   1572 	uint a;
   1573 	USED(x);
   1574 	a = 0 + nfs3handlesize(&x->handle) + 8 + 4 + 4 + sunvaropaquesize(x->ndata);
   1575 	return a;
   1576 }
   1577 int
   1578 nfs3twritepack(uchar *a, uchar *ea, uchar **pa, Nfs3TWrite *x)
   1579 {
   1580 	int i;
   1581 
   1582 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   1583 	if(sunuint64pack(a, ea, &a, &x->offset) < 0) goto Err;
   1584 	if(sunuint32pack(a, ea, &a, &x->count) < 0) goto Err;
   1585 	if(i=x->stable, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   1586 	if(sunvaropaquepack(a, ea, &a, &x->data, &x->ndata, x->count) < 0) goto Err;
   1587 	*pa = a;
   1588 	return 0;
   1589 Err:
   1590 	*pa = ea;
   1591 	return -1;
   1592 }
   1593 int
   1594 nfs3twriteunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TWrite *x)
   1595 {
   1596 	int i;
   1597 
   1598 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   1599 	if(sunuint64unpack(a, ea, &a, &x->offset) < 0) goto Err;
   1600 	if(sunuint32unpack(a, ea, &a, &x->count) < 0) goto Err;
   1601 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->stable = i;
   1602 	if(sunvaropaqueunpack(a, ea, &a, &x->data, &x->ndata, x->count) < 0) goto Err;
   1603 	*pa = a;
   1604 	return 0;
   1605 Err:
   1606 	*pa = ea;
   1607 	return -1;
   1608 }
   1609 void
   1610 nfs3rwriteprint(Fmt *fmt, Nfs3RWrite *x)
   1611 {
   1612 	fmtprint(fmt, "%s\n", "Nfs3RWrite");
   1613 	fmtprint(fmt, "\t%s=", "status");
   1614 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   1615 	fmtprint(fmt, "\n");
   1616 	fmtprint(fmt, "\t%s=", "wcc");
   1617 	nfs3wccprint(fmt, &x->wcc);
   1618 	fmtprint(fmt, "\n");
   1619 	switch(x->status){
   1620 	case Nfs3Ok:
   1621 		fmtprint(fmt, "\t%s=", "count");
   1622 		fmtprint(fmt, "%ud", x->count);
   1623 		fmtprint(fmt, "\n");
   1624 		fmtprint(fmt, "\t%s=", "committed");
   1625 		fmtprint(fmt, "%s", nfs3syncstr(x->committed));
   1626 		fmtprint(fmt, "\n");
   1627 		fmtprint(fmt, "\t%s=", "verf");
   1628 		fmtprint(fmt, "%.*H", Nfs3WriteVerfSize, x->verf);
   1629 		fmtprint(fmt, "\n");
   1630 		break;
   1631 	}
   1632 }
   1633 uint
   1634 nfs3rwritesize(Nfs3RWrite *x)
   1635 {
   1636 	uint a;
   1637 	USED(x);
   1638 	a = 0 + 4 + nfs3wccsize(&x->wcc);
   1639 	switch(x->status){
   1640 	case Nfs3Ok:
   1641 		a = a + 4 + 4 + Nfs3WriteVerfSize;
   1642 		break;
   1643 	}
   1644 	return a;
   1645 }
   1646 int
   1647 nfs3rwritepack(uchar *a, uchar *ea, uchar **pa, Nfs3RWrite *x)
   1648 {
   1649 	int i;
   1650 
   1651 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   1652 	if(nfs3wccpack(a, ea, &a, &x->wcc) < 0) goto Err;
   1653 	switch(x->status){
   1654 	case Nfs3Ok:
   1655 		if(sunuint32pack(a, ea, &a, &x->count) < 0) goto Err;
   1656 		if(i=x->committed, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   1657 		if(sunfixedopaquepack(a, ea, &a, x->verf, Nfs3WriteVerfSize) < 0) goto Err;
   1658 		break;
   1659 	}
   1660 	*pa = a;
   1661 	return 0;
   1662 Err:
   1663 	*pa = ea;
   1664 	return -1;
   1665 }
   1666 int
   1667 nfs3rwriteunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RWrite *x)
   1668 {
   1669 	int i;
   1670 
   1671 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   1672 	if(nfs3wccunpack(a, ea, &a, &x->wcc) < 0) goto Err;
   1673 	switch(x->status){
   1674 	case Nfs3Ok:
   1675 		if(sunuint32unpack(a, ea, &a, &x->count) < 0) goto Err;
   1676 		if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->committed = i;
   1677 		if(sunfixedopaqueunpack(a, ea, &a, x->verf, Nfs3WriteVerfSize) < 0) goto Err;
   1678 		break;
   1679 	}
   1680 	*pa = a;
   1681 	return 0;
   1682 Err:
   1683 	*pa = ea;
   1684 	return -1;
   1685 }
   1686 char*
   1687 nfs3createstr(Nfs3Create x)
   1688 {
   1689 	switch(x){
   1690 	case Nfs3CreateUnchecked:
   1691 		return "Nfs3CreateUnchecked";
   1692 	case Nfs3CreateGuarded:
   1693 		return "Nfs3CreateGuarded";
   1694 	case Nfs3CreateExclusive:
   1695 		return "Nfs3CreateExclusive";
   1696 	default:
   1697 		return "unknown";
   1698 	}
   1699 }
   1700 
   1701 void
   1702 nfs3tcreateprint(Fmt *fmt, Nfs3TCreate *x)
   1703 {
   1704 	fmtprint(fmt, "%s\n", "Nfs3TCreate");
   1705 	fmtprint(fmt, "\t%s=", "handle");
   1706 	nfs3handleprint(fmt, &x->handle);
   1707 	fmtprint(fmt, "\n");
   1708 	fmtprint(fmt, "\t%s=", "name");
   1709 	fmtprint(fmt, "\"%s\"", x->name);
   1710 	fmtprint(fmt, "\n");
   1711 	fmtprint(fmt, "\t%s=", "mode");
   1712 	fmtprint(fmt, "%s", nfs3createstr(x->mode));
   1713 	fmtprint(fmt, "\n");
   1714 	switch(x->mode){
   1715 	case Nfs3CreateUnchecked:
   1716 	case Nfs3CreateGuarded:
   1717 		fmtprint(fmt, "\t%s=", "attr");
   1718 		nfs3setattrprint(fmt, &x->attr);
   1719 		fmtprint(fmt, "\n");
   1720 		break;
   1721 	case Nfs3CreateExclusive:
   1722 		fmtprint(fmt, "\t%s=", "verf");
   1723 		fmtprint(fmt, "%.*H", Nfs3CreateVerfSize, x->verf);
   1724 		fmtprint(fmt, "\n");
   1725 		break;
   1726 	}
   1727 }
   1728 uint
   1729 nfs3tcreatesize(Nfs3TCreate *x)
   1730 {
   1731 	uint a;
   1732 	USED(x);
   1733 	a = 0 + nfs3handlesize(&x->handle) + sunstringsize(x->name) + 4;
   1734 	switch(x->mode){
   1735 	case Nfs3CreateUnchecked:
   1736 	case Nfs3CreateGuarded:
   1737 		a = a + nfs3setattrsize(&x->attr);
   1738 		break;
   1739 	case Nfs3CreateExclusive:
   1740 		a = a + Nfs3CreateVerfSize;
   1741 		break;
   1742 	}
   1743 	return a;
   1744 }
   1745 int
   1746 nfs3tcreatepack(uchar *a, uchar *ea, uchar **pa, Nfs3TCreate *x)
   1747 {
   1748 	int i;
   1749 
   1750 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   1751 	if(sunstringpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   1752 	if(i=x->mode, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   1753 	switch(x->mode){
   1754 	case Nfs3CreateUnchecked:
   1755 	case Nfs3CreateGuarded:
   1756 		if(nfs3setattrpack(a, ea, &a, &x->attr) < 0) goto Err;
   1757 		break;
   1758 	case Nfs3CreateExclusive:
   1759 		if(sunfixedopaquepack(a, ea, &a, x->verf, Nfs3CreateVerfSize) < 0) goto Err;
   1760 		break;
   1761 	}
   1762 	*pa = a;
   1763 	return 0;
   1764 Err:
   1765 	*pa = ea;
   1766 	return -1;
   1767 }
   1768 int
   1769 nfs3tcreateunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TCreate *x)
   1770 {
   1771 	int i;
   1772 
   1773 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   1774 	if(sunstringunpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   1775 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->mode = i;
   1776 	switch(x->mode){
   1777 	case Nfs3CreateUnchecked:
   1778 	case Nfs3CreateGuarded:
   1779 		if(nfs3setattrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   1780 		break;
   1781 	case Nfs3CreateExclusive:
   1782 		if(sunfixedopaqueunpack(a, ea, &a, x->verf, Nfs3CreateVerfSize) < 0) goto Err;
   1783 		break;
   1784 	}
   1785 	*pa = a;
   1786 	return 0;
   1787 Err:
   1788 	*pa = ea;
   1789 	return -1;
   1790 }
   1791 void
   1792 nfs3rcreateprint(Fmt *fmt, Nfs3RCreate *x)
   1793 {
   1794 	fmtprint(fmt, "%s\n", "Nfs3RCreate");
   1795 	fmtprint(fmt, "\t%s=", "status");
   1796 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   1797 	fmtprint(fmt, "\n");
   1798 	switch(x->status){
   1799 	case Nfs3Ok:
   1800 		fmtprint(fmt, "\t%s=", "haveHandle");
   1801 		fmtprint(fmt, "%d", x->haveHandle);
   1802 		fmtprint(fmt, "\n");
   1803 		switch(x->haveHandle){
   1804 		case 1:
   1805 			fmtprint(fmt, "\t%s=", "handle");
   1806 			nfs3handleprint(fmt, &x->handle);
   1807 			fmtprint(fmt, "\n");
   1808 			break;
   1809 		}
   1810 		fmtprint(fmt, "\t%s=", "haveAttr");
   1811 		fmtprint(fmt, "%d", x->haveAttr);
   1812 		fmtprint(fmt, "\n");
   1813 		switch(x->haveAttr){
   1814 		case 1:
   1815 			fmtprint(fmt, "\t%s=", "attr");
   1816 			nfs3attrprint(fmt, &x->attr);
   1817 			fmtprint(fmt, "\n");
   1818 			break;
   1819 		}
   1820 		break;
   1821 	}
   1822 	fmtprint(fmt, "\t%s=", "dirWcc");
   1823 	nfs3wccprint(fmt, &x->dirWcc);
   1824 	fmtprint(fmt, "\n");
   1825 }
   1826 uint
   1827 nfs3rcreatesize(Nfs3RCreate *x)
   1828 {
   1829 	uint a;
   1830 	USED(x);
   1831 	a = 0 + 4;
   1832 	switch(x->status){
   1833 	case Nfs3Ok:
   1834 		a = a + 4;
   1835 		switch(x->haveHandle){
   1836 		case 1:
   1837 			a = a + nfs3handlesize(&x->handle);
   1838 			break;
   1839 		}
   1840 		a = a + 4;
   1841 		switch(x->haveAttr){
   1842 		case 1:
   1843 			a = a + nfs3attrsize(&x->attr);
   1844 			break;
   1845 		}
   1846 			break;
   1847 	}
   1848 	a = a + nfs3wccsize(&x->dirWcc);
   1849 	return a;
   1850 }
   1851 int
   1852 nfs3rcreatepack(uchar *a, uchar *ea, uchar **pa, Nfs3RCreate *x)
   1853 {
   1854 	int i;
   1855 
   1856 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   1857 	switch(x->status){
   1858 	case Nfs3Ok:
   1859 		if(sunuint1pack(a, ea, &a, &x->haveHandle) < 0) goto Err;
   1860 		switch(x->haveHandle){
   1861 		case 1:
   1862 			if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   1863 			break;
   1864 		}
   1865 		if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   1866 		switch(x->haveAttr){
   1867 		case 1:
   1868 			if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   1869 			break;
   1870 		}
   1871 		break;
   1872 	}
   1873 	if(nfs3wccpack(a, ea, &a, &x->dirWcc) < 0) goto Err;
   1874 	*pa = a;
   1875 	return 0;
   1876 Err:
   1877 	*pa = ea;
   1878 	return -1;
   1879 }
   1880 int
   1881 nfs3rcreateunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RCreate *x)
   1882 {
   1883 	int i;
   1884 
   1885 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   1886 	switch(x->status){
   1887 	case Nfs3Ok:
   1888 		if(sunuint1unpack(a, ea, &a, &x->haveHandle) < 0) goto Err;
   1889 		switch(x->haveHandle){
   1890 		case 1:
   1891 			if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   1892 			break;
   1893 		}
   1894 		if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   1895 		switch(x->haveAttr){
   1896 		case 1:
   1897 			if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   1898 			break;
   1899 		}
   1900 		break;
   1901 	}
   1902 	if(nfs3wccunpack(a, ea, &a, &x->dirWcc) < 0) goto Err;
   1903 	*pa = a;
   1904 	return 0;
   1905 Err:
   1906 	*pa = ea;
   1907 	return -1;
   1908 }
   1909 void
   1910 nfs3tmkdirprint(Fmt *fmt, Nfs3TMkdir *x)
   1911 {
   1912 	fmtprint(fmt, "%s\n", "Nfs3TMkdir");
   1913 	fmtprint(fmt, "\t%s=", "handle");
   1914 	nfs3handleprint(fmt, &x->handle);
   1915 	fmtprint(fmt, "\n");
   1916 	fmtprint(fmt, "\t%s=", "name");
   1917 	fmtprint(fmt, "\"%s\"", x->name);
   1918 	fmtprint(fmt, "\n");
   1919 	fmtprint(fmt, "\t%s=", "attr");
   1920 	nfs3setattrprint(fmt, &x->attr);
   1921 	fmtprint(fmt, "\n");
   1922 }
   1923 uint
   1924 nfs3tmkdirsize(Nfs3TMkdir *x)
   1925 {
   1926 	uint a;
   1927 	USED(x);
   1928 	a = 0 + nfs3handlesize(&x->handle) + sunstringsize(x->name) + nfs3setattrsize(&x->attr);
   1929 	return a;
   1930 }
   1931 int
   1932 nfs3tmkdirpack(uchar *a, uchar *ea, uchar **pa, Nfs3TMkdir *x)
   1933 {
   1934 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   1935 	if(sunstringpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   1936 	if(nfs3setattrpack(a, ea, &a, &x->attr) < 0) goto Err;
   1937 	*pa = a;
   1938 	return 0;
   1939 Err:
   1940 	*pa = ea;
   1941 	return -1;
   1942 }
   1943 int
   1944 nfs3tmkdirunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TMkdir *x)
   1945 {
   1946 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   1947 	if(sunstringunpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   1948 	if(nfs3setattrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   1949 	*pa = a;
   1950 	return 0;
   1951 Err:
   1952 	*pa = ea;
   1953 	return -1;
   1954 }
   1955 void
   1956 nfs3rmkdirprint(Fmt *fmt, Nfs3RMkdir *x)
   1957 {
   1958 	fmtprint(fmt, "%s\n", "Nfs3RMkdir");
   1959 	fmtprint(fmt, "\t%s=", "status");
   1960 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   1961 	fmtprint(fmt, "\n");
   1962 	switch(x->status){
   1963 	case Nfs3Ok:
   1964 		fmtprint(fmt, "\t%s=", "haveHandle");
   1965 		fmtprint(fmt, "%d", x->haveHandle);
   1966 		fmtprint(fmt, "\n");
   1967 		switch(x->haveHandle){
   1968 		case 1:
   1969 			fmtprint(fmt, "\t%s=", "handle");
   1970 			nfs3handleprint(fmt, &x->handle);
   1971 			fmtprint(fmt, "\n");
   1972 			break;
   1973 		}
   1974 		fmtprint(fmt, "\t%s=", "haveAttr");
   1975 		fmtprint(fmt, "%d", x->haveAttr);
   1976 		fmtprint(fmt, "\n");
   1977 		switch(x->haveAttr){
   1978 		case 1:
   1979 			fmtprint(fmt, "\t%s=", "attr");
   1980 			nfs3attrprint(fmt, &x->attr);
   1981 			fmtprint(fmt, "\n");
   1982 			break;
   1983 		}
   1984 		break;
   1985 	}
   1986 	fmtprint(fmt, "\t%s=", "dirWcc");
   1987 	nfs3wccprint(fmt, &x->dirWcc);
   1988 	fmtprint(fmt, "\n");
   1989 }
   1990 uint
   1991 nfs3rmkdirsize(Nfs3RMkdir *x)
   1992 {
   1993 	uint a;
   1994 	USED(x);
   1995 	a = 0 + 4;
   1996 	switch(x->status){
   1997 	case Nfs3Ok:
   1998 		a = a + 4;
   1999 		switch(x->haveHandle){
   2000 		case 1:
   2001 			a = a + nfs3handlesize(&x->handle);
   2002 			break;
   2003 		}
   2004 		a = a + 4;
   2005 		switch(x->haveAttr){
   2006 		case 1:
   2007 			a = a + nfs3attrsize(&x->attr);
   2008 			break;
   2009 		}
   2010 			break;
   2011 	}
   2012 	a = a + nfs3wccsize(&x->dirWcc);
   2013 	return a;
   2014 }
   2015 int
   2016 nfs3rmkdirpack(uchar *a, uchar *ea, uchar **pa, Nfs3RMkdir *x)
   2017 {
   2018 	int i;
   2019 
   2020 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   2021 	switch(x->status){
   2022 	case Nfs3Ok:
   2023 		if(sunuint1pack(a, ea, &a, &x->haveHandle) < 0) goto Err;
   2024 		switch(x->haveHandle){
   2025 		case 1:
   2026 			if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   2027 			break;
   2028 		}
   2029 		if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   2030 		switch(x->haveAttr){
   2031 		case 1:
   2032 			if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   2033 			break;
   2034 		}
   2035 		break;
   2036 	}
   2037 	if(nfs3wccpack(a, ea, &a, &x->dirWcc) < 0) goto Err;
   2038 	*pa = a;
   2039 	return 0;
   2040 Err:
   2041 	*pa = ea;
   2042 	return -1;
   2043 }
   2044 int
   2045 nfs3rmkdirunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RMkdir *x)
   2046 {
   2047 	int i;
   2048 
   2049 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   2050 	switch(x->status){
   2051 	case Nfs3Ok:
   2052 		if(sunuint1unpack(a, ea, &a, &x->haveHandle) < 0) goto Err;
   2053 		switch(x->haveHandle){
   2054 		case 1:
   2055 			if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   2056 			break;
   2057 		}
   2058 		if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   2059 		switch(x->haveAttr){
   2060 		case 1:
   2061 			if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   2062 			break;
   2063 		}
   2064 		break;
   2065 	}
   2066 	if(nfs3wccunpack(a, ea, &a, &x->dirWcc) < 0) goto Err;
   2067 	*pa = a;
   2068 	return 0;
   2069 Err:
   2070 	*pa = ea;
   2071 	return -1;
   2072 }
   2073 void
   2074 nfs3tsymlinkprint(Fmt *fmt, Nfs3TSymlink *x)
   2075 {
   2076 	fmtprint(fmt, "%s\n", "Nfs3TSymlink");
   2077 	fmtprint(fmt, "\t%s=", "handle");
   2078 	nfs3handleprint(fmt, &x->handle);
   2079 	fmtprint(fmt, "\n");
   2080 	fmtprint(fmt, "\t%s=", "name");
   2081 	fmtprint(fmt, "\"%s\"", x->name);
   2082 	fmtprint(fmt, "\n");
   2083 	fmtprint(fmt, "\t%s=", "attr");
   2084 	nfs3setattrprint(fmt, &x->attr);
   2085 	fmtprint(fmt, "\n");
   2086 	fmtprint(fmt, "\t%s=", "data");
   2087 	fmtprint(fmt, "\"%s\"", x->data);
   2088 	fmtprint(fmt, "\n");
   2089 }
   2090 uint
   2091 nfs3tsymlinksize(Nfs3TSymlink *x)
   2092 {
   2093 	uint a;
   2094 	USED(x);
   2095 	a = 0 + nfs3handlesize(&x->handle) + sunstringsize(x->name) + nfs3setattrsize(&x->attr) + sunstringsize(x->data);
   2096 	return a;
   2097 }
   2098 int
   2099 nfs3tsymlinkpack(uchar *a, uchar *ea, uchar **pa, Nfs3TSymlink *x)
   2100 {
   2101 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   2102 	if(sunstringpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   2103 	if(nfs3setattrpack(a, ea, &a, &x->attr) < 0) goto Err;
   2104 	if(sunstringpack(a, ea, &a, &x->data, -1) < 0) goto Err;
   2105 	*pa = a;
   2106 	return 0;
   2107 Err:
   2108 	*pa = ea;
   2109 	return -1;
   2110 }
   2111 int
   2112 nfs3tsymlinkunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TSymlink *x)
   2113 {
   2114 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   2115 	if(sunstringunpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   2116 	if(nfs3setattrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   2117 	if(sunstringunpack(a, ea, &a, &x->data, -1) < 0) goto Err;
   2118 	*pa = a;
   2119 	return 0;
   2120 Err:
   2121 	*pa = ea;
   2122 	return -1;
   2123 }
   2124 void
   2125 nfs3rsymlinkprint(Fmt *fmt, Nfs3RSymlink *x)
   2126 {
   2127 	fmtprint(fmt, "%s\n", "Nfs3RSymlink");
   2128 	fmtprint(fmt, "\t%s=", "status");
   2129 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   2130 	fmtprint(fmt, "\n");
   2131 	switch(x->status){
   2132 	case Nfs3Ok:
   2133 		fmtprint(fmt, "\t%s=", "haveHandle");
   2134 		fmtprint(fmt, "%d", x->haveHandle);
   2135 		fmtprint(fmt, "\n");
   2136 		switch(x->haveHandle){
   2137 		case 1:
   2138 			fmtprint(fmt, "\t%s=", "handle");
   2139 			nfs3handleprint(fmt, &x->handle);
   2140 			fmtprint(fmt, "\n");
   2141 			break;
   2142 		}
   2143 		fmtprint(fmt, "\t%s=", "haveAttr");
   2144 		fmtprint(fmt, "%d", x->haveAttr);
   2145 		fmtprint(fmt, "\n");
   2146 		switch(x->haveAttr){
   2147 		case 1:
   2148 			fmtprint(fmt, "\t%s=", "attr");
   2149 			nfs3attrprint(fmt, &x->attr);
   2150 			fmtprint(fmt, "\n");
   2151 			break;
   2152 		}
   2153 		break;
   2154 	}
   2155 	fmtprint(fmt, "\t%s=", "dirWcc");
   2156 	nfs3wccprint(fmt, &x->dirWcc);
   2157 	fmtprint(fmt, "\n");
   2158 }
   2159 uint
   2160 nfs3rsymlinksize(Nfs3RSymlink *x)
   2161 {
   2162 	uint a;
   2163 	USED(x);
   2164 	a = 0 + 4;
   2165 	switch(x->status){
   2166 	case Nfs3Ok:
   2167 		a = a + 4;
   2168 		switch(x->haveHandle){
   2169 		case 1:
   2170 			a = a + nfs3handlesize(&x->handle);
   2171 			break;
   2172 		}
   2173 		a = a + 4;
   2174 		switch(x->haveAttr){
   2175 		case 1:
   2176 			a = a + nfs3attrsize(&x->attr);
   2177 			break;
   2178 		}
   2179 			break;
   2180 	}
   2181 	a = a + nfs3wccsize(&x->dirWcc);
   2182 	return a;
   2183 }
   2184 int
   2185 nfs3rsymlinkpack(uchar *a, uchar *ea, uchar **pa, Nfs3RSymlink *x)
   2186 {
   2187 	int i;
   2188 
   2189 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   2190 	switch(x->status){
   2191 	case Nfs3Ok:
   2192 		if(sunuint1pack(a, ea, &a, &x->haveHandle) < 0) goto Err;
   2193 		switch(x->haveHandle){
   2194 		case 1:
   2195 			if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   2196 			break;
   2197 		}
   2198 		if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   2199 		switch(x->haveAttr){
   2200 		case 1:
   2201 			if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   2202 			break;
   2203 		}
   2204 		break;
   2205 	}
   2206 	if(nfs3wccpack(a, ea, &a, &x->dirWcc) < 0) goto Err;
   2207 	*pa = a;
   2208 	return 0;
   2209 Err:
   2210 	*pa = ea;
   2211 	return -1;
   2212 }
   2213 int
   2214 nfs3rsymlinkunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RSymlink *x)
   2215 {
   2216 	int i;
   2217 
   2218 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   2219 	switch(x->status){
   2220 	case Nfs3Ok:
   2221 		if(sunuint1unpack(a, ea, &a, &x->haveHandle) < 0) goto Err;
   2222 		switch(x->haveHandle){
   2223 		case 1:
   2224 			if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   2225 			break;
   2226 		}
   2227 		if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   2228 		switch(x->haveAttr){
   2229 		case 1:
   2230 			if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   2231 			break;
   2232 		}
   2233 		break;
   2234 	}
   2235 	if(nfs3wccunpack(a, ea, &a, &x->dirWcc) < 0) goto Err;
   2236 	*pa = a;
   2237 	return 0;
   2238 Err:
   2239 	*pa = ea;
   2240 	return -1;
   2241 }
   2242 void
   2243 nfs3tmknodprint(Fmt *fmt, Nfs3TMknod *x)
   2244 {
   2245 	fmtprint(fmt, "%s\n", "Nfs3TMknod");
   2246 	fmtprint(fmt, "\t%s=", "handle");
   2247 	nfs3handleprint(fmt, &x->handle);
   2248 	fmtprint(fmt, "\n");
   2249 	fmtprint(fmt, "\t%s=", "name");
   2250 	fmtprint(fmt, "\"%s\"", x->name);
   2251 	fmtprint(fmt, "\n");
   2252 	fmtprint(fmt, "\t%s=", "type");
   2253 	fmtprint(fmt, "%s", nfs3filetypestr(x->type));
   2254 	fmtprint(fmt, "\n");
   2255 	switch(x->type){
   2256 	case Nfs3FileChar:
   2257 	case Nfs3FileBlock:
   2258 		fmtprint(fmt, "\t%s=", "attr");
   2259 		nfs3setattrprint(fmt, &x->attr);
   2260 		fmtprint(fmt, "\n");
   2261 		fmtprint(fmt, "\t%s=", "major");
   2262 		fmtprint(fmt, "%ud", x->major);
   2263 		fmtprint(fmt, "\n");
   2264 		fmtprint(fmt, "\t%s=", "minor");
   2265 		fmtprint(fmt, "%ud", x->minor);
   2266 		fmtprint(fmt, "\n");
   2267 		break;
   2268 	case Nfs3FileSocket:
   2269 	case Nfs3FileFifo:
   2270 		fmtprint(fmt, "\t%s=", "attr");
   2271 		nfs3setattrprint(fmt, &x->attr);
   2272 		fmtprint(fmt, "\n");
   2273 		break;
   2274 	}
   2275 }
   2276 uint
   2277 nfs3tmknodsize(Nfs3TMknod *x)
   2278 {
   2279 	uint a;
   2280 	USED(x);
   2281 	a = 0 + nfs3handlesize(&x->handle) + sunstringsize(x->name) + 4;
   2282 	switch(x->type){
   2283 	case Nfs3FileChar:
   2284 	case Nfs3FileBlock:
   2285 		a = a + nfs3setattrsize(&x->attr) + 4 + 4;
   2286 		break;
   2287 	case Nfs3FileSocket:
   2288 	case Nfs3FileFifo:
   2289 		a = a + nfs3setattrsize(&x->attr);
   2290 		break;
   2291 	}
   2292 	return a;
   2293 }
   2294 int
   2295 nfs3tmknodpack(uchar *a, uchar *ea, uchar **pa, Nfs3TMknod *x)
   2296 {
   2297 	int i;
   2298 
   2299 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   2300 	if(sunstringpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   2301 	if(i=x->type, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   2302 	switch(x->type){
   2303 	case Nfs3FileChar:
   2304 	case Nfs3FileBlock:
   2305 		if(nfs3setattrpack(a, ea, &a, &x->attr) < 0) goto Err;
   2306 		if(sunuint32pack(a, ea, &a, &x->major) < 0) goto Err;
   2307 		if(sunuint32pack(a, ea, &a, &x->minor) < 0) goto Err;
   2308 		break;
   2309 	case Nfs3FileSocket:
   2310 	case Nfs3FileFifo:
   2311 		if(nfs3setattrpack(a, ea, &a, &x->attr) < 0) goto Err;
   2312 		break;
   2313 	}
   2314 	*pa = a;
   2315 	return 0;
   2316 Err:
   2317 	*pa = ea;
   2318 	return -1;
   2319 }
   2320 int
   2321 nfs3tmknodunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TMknod *x)
   2322 {
   2323 	int i;
   2324 
   2325 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   2326 	if(sunstringunpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   2327 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->type = i;
   2328 	switch(x->type){
   2329 	case Nfs3FileChar:
   2330 	case Nfs3FileBlock:
   2331 		if(nfs3setattrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   2332 		if(sunuint32unpack(a, ea, &a, &x->major) < 0) goto Err;
   2333 		if(sunuint32unpack(a, ea, &a, &x->minor) < 0) goto Err;
   2334 		break;
   2335 	case Nfs3FileSocket:
   2336 	case Nfs3FileFifo:
   2337 		if(nfs3setattrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   2338 		break;
   2339 	}
   2340 	*pa = a;
   2341 	return 0;
   2342 Err:
   2343 	*pa = ea;
   2344 	return -1;
   2345 }
   2346 void
   2347 nfs3rmknodprint(Fmt *fmt, Nfs3RMknod *x)
   2348 {
   2349 	fmtprint(fmt, "%s\n", "Nfs3RMknod");
   2350 	fmtprint(fmt, "\t%s=", "status");
   2351 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   2352 	fmtprint(fmt, "\n");
   2353 	switch(x->status){
   2354 	case Nfs3Ok:
   2355 		fmtprint(fmt, "\t%s=", "haveHandle");
   2356 		fmtprint(fmt, "%d", x->haveHandle);
   2357 		fmtprint(fmt, "\n");
   2358 		switch(x->haveHandle){
   2359 		case 1:
   2360 			fmtprint(fmt, "\t%s=", "handle");
   2361 			nfs3handleprint(fmt, &x->handle);
   2362 			fmtprint(fmt, "\n");
   2363 			break;
   2364 		}
   2365 		fmtprint(fmt, "\t%s=", "haveAttr");
   2366 		fmtprint(fmt, "%d", x->haveAttr);
   2367 		fmtprint(fmt, "\n");
   2368 		switch(x->haveAttr){
   2369 		case 1:
   2370 			fmtprint(fmt, "\t%s=", "attr");
   2371 			nfs3attrprint(fmt, &x->attr);
   2372 			fmtprint(fmt, "\n");
   2373 			break;
   2374 		}
   2375 		break;
   2376 	}
   2377 	fmtprint(fmt, "\t%s=", "dirWcc");
   2378 	nfs3wccprint(fmt, &x->dirWcc);
   2379 	fmtprint(fmt, "\n");
   2380 }
   2381 uint
   2382 nfs3rmknodsize(Nfs3RMknod *x)
   2383 {
   2384 	uint a;
   2385 	USED(x);
   2386 	a = 0 + 4;
   2387 	switch(x->status){
   2388 	case Nfs3Ok:
   2389 		a = a + 4;
   2390 		switch(x->haveHandle){
   2391 		case 1:
   2392 			a = a + nfs3handlesize(&x->handle);
   2393 			break;
   2394 		}
   2395 		a = a + 4;
   2396 		switch(x->haveAttr){
   2397 		case 1:
   2398 			a = a + nfs3attrsize(&x->attr);
   2399 			break;
   2400 		}
   2401 			break;
   2402 	}
   2403 	a = a + nfs3wccsize(&x->dirWcc);
   2404 	return a;
   2405 }
   2406 int
   2407 nfs3rmknodpack(uchar *a, uchar *ea, uchar **pa, Nfs3RMknod *x)
   2408 {
   2409 	int i;
   2410 
   2411 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   2412 	switch(x->status){
   2413 	case Nfs3Ok:
   2414 		if(sunuint1pack(a, ea, &a, &x->haveHandle) < 0) goto Err;
   2415 		switch(x->haveHandle){
   2416 		case 1:
   2417 			if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   2418 			break;
   2419 		}
   2420 		if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   2421 		switch(x->haveAttr){
   2422 		case 1:
   2423 			if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   2424 			break;
   2425 		}
   2426 		break;
   2427 	}
   2428 	if(nfs3wccpack(a, ea, &a, &x->dirWcc) < 0) goto Err;
   2429 	*pa = a;
   2430 	return 0;
   2431 Err:
   2432 	*pa = ea;
   2433 	return -1;
   2434 }
   2435 int
   2436 nfs3rmknodunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RMknod *x)
   2437 {
   2438 	int i;
   2439 
   2440 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   2441 	switch(x->status){
   2442 	case Nfs3Ok:
   2443 		if(sunuint1unpack(a, ea, &a, &x->haveHandle) < 0) goto Err;
   2444 		switch(x->haveHandle){
   2445 		case 1:
   2446 			if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   2447 			break;
   2448 		}
   2449 		if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   2450 		switch(x->haveAttr){
   2451 		case 1:
   2452 			if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   2453 			break;
   2454 		}
   2455 		break;
   2456 	}
   2457 	if(nfs3wccunpack(a, ea, &a, &x->dirWcc) < 0) goto Err;
   2458 	*pa = a;
   2459 	return 0;
   2460 Err:
   2461 	*pa = ea;
   2462 	return -1;
   2463 }
   2464 void
   2465 nfs3tremoveprint(Fmt *fmt, Nfs3TRemove *x)
   2466 {
   2467 	fmtprint(fmt, "%s\n", "Nfs3TRemove");
   2468 	fmtprint(fmt, "\t%s=", "handle");
   2469 	nfs3handleprint(fmt, &x->handle);
   2470 	fmtprint(fmt, "\n");
   2471 	fmtprint(fmt, "\t%s=", "name");
   2472 	fmtprint(fmt, "\"%s\"", x->name);
   2473 	fmtprint(fmt, "\n");
   2474 }
   2475 uint
   2476 nfs3tremovesize(Nfs3TRemove *x)
   2477 {
   2478 	uint a;
   2479 	USED(x);
   2480 	a = 0 + nfs3handlesize(&x->handle) + sunstringsize(x->name);
   2481 	return a;
   2482 }
   2483 int
   2484 nfs3tremovepack(uchar *a, uchar *ea, uchar **pa, Nfs3TRemove *x)
   2485 {
   2486 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   2487 	if(sunstringpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   2488 	*pa = a;
   2489 	return 0;
   2490 Err:
   2491 	*pa = ea;
   2492 	return -1;
   2493 }
   2494 int
   2495 nfs3tremoveunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TRemove *x)
   2496 {
   2497 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   2498 	if(sunstringunpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   2499 	*pa = a;
   2500 	return 0;
   2501 Err:
   2502 	*pa = ea;
   2503 	return -1;
   2504 }
   2505 void
   2506 nfs3rremoveprint(Fmt *fmt, Nfs3RRemove *x)
   2507 {
   2508 	fmtprint(fmt, "%s\n", "Nfs3RRemove");
   2509 	fmtprint(fmt, "\t%s=", "status");
   2510 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   2511 	fmtprint(fmt, "\n");
   2512 	fmtprint(fmt, "\t%s=", "wcc");
   2513 	nfs3wccprint(fmt, &x->wcc);
   2514 	fmtprint(fmt, "\n");
   2515 }
   2516 uint
   2517 nfs3rremovesize(Nfs3RRemove *x)
   2518 {
   2519 	uint a;
   2520 	USED(x);
   2521 	a = 0 + 4 + nfs3wccsize(&x->wcc);
   2522 	return a;
   2523 }
   2524 int
   2525 nfs3rremovepack(uchar *a, uchar *ea, uchar **pa, Nfs3RRemove *x)
   2526 {
   2527 	int i;
   2528 
   2529 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   2530 	if(nfs3wccpack(a, ea, &a, &x->wcc) < 0) goto Err;
   2531 	*pa = a;
   2532 	return 0;
   2533 Err:
   2534 	*pa = ea;
   2535 	return -1;
   2536 }
   2537 int
   2538 nfs3rremoveunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RRemove *x)
   2539 {
   2540 	int i;
   2541 
   2542 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   2543 	if(nfs3wccunpack(a, ea, &a, &x->wcc) < 0) goto Err;
   2544 	*pa = a;
   2545 	return 0;
   2546 Err:
   2547 	*pa = ea;
   2548 	return -1;
   2549 }
   2550 void
   2551 nfs3trmdirprint(Fmt *fmt, Nfs3TRmdir *x)
   2552 {
   2553 	fmtprint(fmt, "%s\n", "Nfs3TRmdir");
   2554 	fmtprint(fmt, "\t%s=", "handle");
   2555 	nfs3handleprint(fmt, &x->handle);
   2556 	fmtprint(fmt, "\n");
   2557 	fmtprint(fmt, "\t%s=", "name");
   2558 	fmtprint(fmt, "\"%s\"", x->name);
   2559 	fmtprint(fmt, "\n");
   2560 }
   2561 uint
   2562 nfs3trmdirsize(Nfs3TRmdir *x)
   2563 {
   2564 	uint a;
   2565 	USED(x);
   2566 	a = 0 + nfs3handlesize(&x->handle) + sunstringsize(x->name);
   2567 	return a;
   2568 }
   2569 int
   2570 nfs3trmdirpack(uchar *a, uchar *ea, uchar **pa, Nfs3TRmdir *x)
   2571 {
   2572 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   2573 	if(sunstringpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   2574 	*pa = a;
   2575 	return 0;
   2576 Err:
   2577 	*pa = ea;
   2578 	return -1;
   2579 }
   2580 int
   2581 nfs3trmdirunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TRmdir *x)
   2582 {
   2583 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   2584 	if(sunstringunpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   2585 	*pa = a;
   2586 	return 0;
   2587 Err:
   2588 	*pa = ea;
   2589 	return -1;
   2590 }
   2591 void
   2592 nfs3rrmdirprint(Fmt *fmt, Nfs3RRmdir *x)
   2593 {
   2594 	fmtprint(fmt, "%s\n", "Nfs3RRmdir");
   2595 	fmtprint(fmt, "\t%s=", "status");
   2596 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   2597 	fmtprint(fmt, "\n");
   2598 	fmtprint(fmt, "\t%s=", "wcc");
   2599 	nfs3wccprint(fmt, &x->wcc);
   2600 	fmtprint(fmt, "\n");
   2601 }
   2602 uint
   2603 nfs3rrmdirsize(Nfs3RRmdir *x)
   2604 {
   2605 	uint a;
   2606 	USED(x);
   2607 	a = 0 + 4 + nfs3wccsize(&x->wcc);
   2608 	return a;
   2609 }
   2610 int
   2611 nfs3rrmdirpack(uchar *a, uchar *ea, uchar **pa, Nfs3RRmdir *x)
   2612 {
   2613 	int i;
   2614 
   2615 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   2616 	if(nfs3wccpack(a, ea, &a, &x->wcc) < 0) goto Err;
   2617 	*pa = a;
   2618 	return 0;
   2619 Err:
   2620 	*pa = ea;
   2621 	return -1;
   2622 }
   2623 int
   2624 nfs3rrmdirunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RRmdir *x)
   2625 {
   2626 	int i;
   2627 
   2628 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   2629 	if(nfs3wccunpack(a, ea, &a, &x->wcc) < 0) goto Err;
   2630 	*pa = a;
   2631 	return 0;
   2632 Err:
   2633 	*pa = ea;
   2634 	return -1;
   2635 }
   2636 void
   2637 nfs3trenameprint(Fmt *fmt, Nfs3TRename *x)
   2638 {
   2639 	fmtprint(fmt, "%s\n", "Nfs3TRename");
   2640 	fmtprint(fmt, "\t%s=", "from");
   2641 	fmtprint(fmt, "{\n");
   2642 	fmtprint(fmt, "\t\t%s=", "handle");
   2643 	nfs3handleprint(fmt, &x->from.handle);
   2644 	fmtprint(fmt, "\n");
   2645 	fmtprint(fmt, "\t\t%s=", "name");
   2646 	fmtprint(fmt, "\"%s\"", x->from.name);
   2647 	fmtprint(fmt, "\n");
   2648 	fmtprint(fmt, "\t}");
   2649 	fmtprint(fmt, "\n");
   2650 	fmtprint(fmt, "\t%s=", "to");
   2651 	fmtprint(fmt, "{\n");
   2652 	fmtprint(fmt, "\t\t%s=", "handle");
   2653 	nfs3handleprint(fmt, &x->to.handle);
   2654 	fmtprint(fmt, "\n");
   2655 	fmtprint(fmt, "\t\t%s=", "name");
   2656 	fmtprint(fmt, "\"%s\"", x->to.name);
   2657 	fmtprint(fmt, "\n");
   2658 	fmtprint(fmt, "\t}");
   2659 	fmtprint(fmt, "\n");
   2660 }
   2661 uint
   2662 nfs3trenamesize(Nfs3TRename *x)
   2663 {
   2664 	uint a;
   2665 	USED(x);
   2666 	a = 0 + nfs3handlesize(&x->from.handle) + sunstringsize(x->from.name) + nfs3handlesize(&x->to.handle) + sunstringsize(x->to.name);
   2667 	return a;
   2668 }
   2669 int
   2670 nfs3trenamepack(uchar *a, uchar *ea, uchar **pa, Nfs3TRename *x)
   2671 {
   2672 	if(nfs3handlepack(a, ea, &a, &x->from.handle) < 0) goto Err;
   2673 	if(sunstringpack(a, ea, &a, &x->from.name, -1) < 0) goto Err;
   2674 	if(nfs3handlepack(a, ea, &a, &x->to.handle) < 0) goto Err;
   2675 	if(sunstringpack(a, ea, &a, &x->to.name, -1) < 0) goto Err;
   2676 	*pa = a;
   2677 	return 0;
   2678 Err:
   2679 	*pa = ea;
   2680 	return -1;
   2681 }
   2682 int
   2683 nfs3trenameunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TRename *x)
   2684 {
   2685 	if(nfs3handleunpack(a, ea, &a, &x->from.handle) < 0) goto Err;
   2686 	if(sunstringunpack(a, ea, &a, &x->from.name, -1) < 0) goto Err;
   2687 	if(nfs3handleunpack(a, ea, &a, &x->to.handle) < 0) goto Err;
   2688 	if(sunstringunpack(a, ea, &a, &x->to.name, -1) < 0) goto Err;
   2689 	*pa = a;
   2690 	return 0;
   2691 Err:
   2692 	*pa = ea;
   2693 	return -1;
   2694 }
   2695 void
   2696 nfs3rrenameprint(Fmt *fmt, Nfs3RRename *x)
   2697 {
   2698 	fmtprint(fmt, "%s\n", "Nfs3RRename");
   2699 	fmtprint(fmt, "\t%s=", "status");
   2700 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   2701 	fmtprint(fmt, "\n");
   2702 	fmtprint(fmt, "\t%s=", "fromWcc");
   2703 	nfs3wccprint(fmt, &x->fromWcc);
   2704 	fmtprint(fmt, "\n");
   2705 	fmtprint(fmt, "\t%s=", "toWcc");
   2706 	nfs3wccprint(fmt, &x->toWcc);
   2707 	fmtprint(fmt, "\n");
   2708 }
   2709 uint
   2710 nfs3rrenamesize(Nfs3RRename *x)
   2711 {
   2712 	uint a;
   2713 	USED(x);
   2714 	a = 0 + 4 + nfs3wccsize(&x->fromWcc) + nfs3wccsize(&x->toWcc);
   2715 	return a;
   2716 }
   2717 int
   2718 nfs3rrenamepack(uchar *a, uchar *ea, uchar **pa, Nfs3RRename *x)
   2719 {
   2720 	int i;
   2721 
   2722 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   2723 	if(nfs3wccpack(a, ea, &a, &x->fromWcc) < 0) goto Err;
   2724 	if(nfs3wccpack(a, ea, &a, &x->toWcc) < 0) goto Err;
   2725 	*pa = a;
   2726 	return 0;
   2727 Err:
   2728 	*pa = ea;
   2729 	return -1;
   2730 }
   2731 int
   2732 nfs3rrenameunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RRename *x)
   2733 {
   2734 	int i;
   2735 
   2736 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   2737 	if(nfs3wccunpack(a, ea, &a, &x->fromWcc) < 0) goto Err;
   2738 	if(nfs3wccunpack(a, ea, &a, &x->toWcc) < 0) goto Err;
   2739 	*pa = a;
   2740 	return 0;
   2741 Err:
   2742 	*pa = ea;
   2743 	return -1;
   2744 }
   2745 void
   2746 nfs3tlinkprint(Fmt *fmt, Nfs3TLink *x)
   2747 {
   2748 	fmtprint(fmt, "%s\n", "Nfs3TLink");
   2749 	fmtprint(fmt, "\t%s=", "handle");
   2750 	nfs3handleprint(fmt, &x->handle);
   2751 	fmtprint(fmt, "\n");
   2752 	fmtprint(fmt, "\t%s=", "link");
   2753 	fmtprint(fmt, "{\n");
   2754 	fmtprint(fmt, "\t\t%s=", "handle");
   2755 	nfs3handleprint(fmt, &x->link.handle);
   2756 	fmtprint(fmt, "\n");
   2757 	fmtprint(fmt, "\t\t%s=", "name");
   2758 	fmtprint(fmt, "\"%s\"", x->link.name);
   2759 	fmtprint(fmt, "\n");
   2760 	fmtprint(fmt, "\t}");
   2761 	fmtprint(fmt, "\n");
   2762 }
   2763 uint
   2764 nfs3tlinksize(Nfs3TLink *x)
   2765 {
   2766 	uint a;
   2767 	USED(x);
   2768 	a = 0 + nfs3handlesize(&x->handle) + nfs3handlesize(&x->link.handle) + sunstringsize(x->link.name);
   2769 	return a;
   2770 }
   2771 int
   2772 nfs3tlinkpack(uchar *a, uchar *ea, uchar **pa, Nfs3TLink *x)
   2773 {
   2774 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   2775 	if(nfs3handlepack(a, ea, &a, &x->link.handle) < 0) goto Err;
   2776 	if(sunstringpack(a, ea, &a, &x->link.name, -1) < 0) goto Err;
   2777 	*pa = a;
   2778 	return 0;
   2779 Err:
   2780 	*pa = ea;
   2781 	return -1;
   2782 }
   2783 int
   2784 nfs3tlinkunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TLink *x)
   2785 {
   2786 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   2787 	if(nfs3handleunpack(a, ea, &a, &x->link.handle) < 0) goto Err;
   2788 	if(sunstringunpack(a, ea, &a, &x->link.name, -1) < 0) goto Err;
   2789 	*pa = a;
   2790 	return 0;
   2791 Err:
   2792 	*pa = ea;
   2793 	return -1;
   2794 }
   2795 void
   2796 nfs3rlinkprint(Fmt *fmt, Nfs3RLink *x)
   2797 {
   2798 	fmtprint(fmt, "%s\n", "Nfs3RLink");
   2799 	fmtprint(fmt, "\t%s=", "status");
   2800 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   2801 	fmtprint(fmt, "\n");
   2802 	fmtprint(fmt, "\t%s=", "haveAttr");
   2803 	fmtprint(fmt, "%d", x->haveAttr);
   2804 	fmtprint(fmt, "\n");
   2805 	switch(x->haveAttr){
   2806 	case 1:
   2807 		fmtprint(fmt, "\t%s=", "attr");
   2808 		nfs3attrprint(fmt, &x->attr);
   2809 		fmtprint(fmt, "\n");
   2810 		break;
   2811 	}
   2812 	fmtprint(fmt, "\t%s=", "dirWcc");
   2813 	nfs3wccprint(fmt, &x->dirWcc);
   2814 	fmtprint(fmt, "\n");
   2815 }
   2816 uint
   2817 nfs3rlinksize(Nfs3RLink *x)
   2818 {
   2819 	uint a;
   2820 	USED(x);
   2821 	a = 0 + 4 + 4;
   2822 	switch(x->haveAttr){
   2823 	case 1:
   2824 		a = a + nfs3attrsize(&x->attr);
   2825 		break;
   2826 	}
   2827 	a = a + nfs3wccsize(&x->dirWcc);
   2828 	return a;
   2829 }
   2830 int
   2831 nfs3rlinkpack(uchar *a, uchar *ea, uchar **pa, Nfs3RLink *x)
   2832 {
   2833 	int i;
   2834 
   2835 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   2836 	if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   2837 	switch(x->haveAttr){
   2838 	case 1:
   2839 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   2840 		break;
   2841 	}
   2842 	if(nfs3wccpack(a, ea, &a, &x->dirWcc) < 0) goto Err;
   2843 	*pa = a;
   2844 	return 0;
   2845 Err:
   2846 	*pa = ea;
   2847 	return -1;
   2848 }
   2849 int
   2850 nfs3rlinkunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RLink *x)
   2851 {
   2852 	int i;
   2853 
   2854 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   2855 	if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   2856 	switch(x->haveAttr){
   2857 	case 1:
   2858 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   2859 		break;
   2860 	}
   2861 	if(nfs3wccunpack(a, ea, &a, &x->dirWcc) < 0) goto Err;
   2862 	*pa = a;
   2863 	return 0;
   2864 Err:
   2865 	*pa = ea;
   2866 	return -1;
   2867 }
   2868 void
   2869 nfs3treaddirprint(Fmt *fmt, Nfs3TReadDir *x)
   2870 {
   2871 	fmtprint(fmt, "%s\n", "Nfs3TReadDir");
   2872 	fmtprint(fmt, "\t%s=", "handle");
   2873 	nfs3handleprint(fmt, &x->handle);
   2874 	fmtprint(fmt, "\n");
   2875 	fmtprint(fmt, "\t%s=", "cookie");
   2876 	fmtprint(fmt, "%llud", x->cookie);
   2877 	fmtprint(fmt, "\n");
   2878 	fmtprint(fmt, "\t%s=", "verf");
   2879 	fmtprint(fmt, "%.*H", Nfs3CookieVerfSize, x->verf);
   2880 	fmtprint(fmt, "\n");
   2881 	fmtprint(fmt, "\t%s=", "count");
   2882 	fmtprint(fmt, "%ud", x->count);
   2883 	fmtprint(fmt, "\n");
   2884 }
   2885 uint
   2886 nfs3treaddirsize(Nfs3TReadDir *x)
   2887 {
   2888 	uint a;
   2889 	USED(x);
   2890 	a = 0 + nfs3handlesize(&x->handle) + 8 + Nfs3CookieVerfSize + 4;
   2891 	return a;
   2892 }
   2893 int
   2894 nfs3treaddirpack(uchar *a, uchar *ea, uchar **pa, Nfs3TReadDir *x)
   2895 {
   2896 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   2897 	if(sunuint64pack(a, ea, &a, &x->cookie) < 0) goto Err;
   2898 	if(sunfixedopaquepack(a, ea, &a, x->verf, Nfs3CookieVerfSize) < 0) goto Err;
   2899 	if(sunuint32pack(a, ea, &a, &x->count) < 0) goto Err;
   2900 	*pa = a;
   2901 	return 0;
   2902 Err:
   2903 	*pa = ea;
   2904 	return -1;
   2905 }
   2906 int
   2907 nfs3treaddirunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TReadDir *x)
   2908 {
   2909 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   2910 	if(sunuint64unpack(a, ea, &a, &x->cookie) < 0) goto Err;
   2911 	if(sunfixedopaqueunpack(a, ea, &a, x->verf, Nfs3CookieVerfSize) < 0) goto Err;
   2912 	if(sunuint32unpack(a, ea, &a, &x->count) < 0) goto Err;
   2913 	*pa = a;
   2914 	return 0;
   2915 Err:
   2916 	*pa = ea;
   2917 	return -1;
   2918 }
   2919 void
   2920 nfs3entryprint(Fmt *fmt, Nfs3Entry *x)
   2921 {
   2922 	fmtprint(fmt, "%s\n", "Nfs3Entry");
   2923 	fmtprint(fmt, "\t%s=", "fileid");
   2924 	fmtprint(fmt, "%llud", x->fileid);
   2925 	fmtprint(fmt, "\n");
   2926 	fmtprint(fmt, "\t%s=", "name");
   2927 	fmtprint(fmt, "\"%s\"", x->name);
   2928 	fmtprint(fmt, "\n");
   2929 	fmtprint(fmt, "\t%s=", "cookie");
   2930 	fmtprint(fmt, "%llud", x->cookie);
   2931 	fmtprint(fmt, "\n");
   2932 }
   2933 uint
   2934 nfs3entrysize(Nfs3Entry *x)
   2935 {
   2936 	uint a;
   2937 	USED(x);
   2938 	a = 0 + 4 + 8 + sunstringsize(x->name) + 8;
   2939 	return a;
   2940 }
   2941 static int
   2942 sunstringvpack(uchar *a, uchar *ea, uchar **pa, char **s, u32int n)
   2943 {
   2944 	return sunvaropaquepack(a, ea, pa, (uchar**)(void*)s, &n, -1);
   2945 }
   2946 int
   2947 nfs3entrypack(uchar *a, uchar *ea, uchar **pa, Nfs3Entry *x)
   2948 {
   2949 	u1int one;
   2950 
   2951 	one = 1;
   2952 	if(sunuint1pack(a, ea, &a, &one) < 0) goto Err;
   2953 	if(sunuint64pack(a, ea, &a, &x->fileid) < 0) goto Err;
   2954 	if(sunstringvpack(a, ea, &a, &x->name, x->namelen) < 0) goto Err;
   2955 	if(sunuint64pack(a, ea, &a, &x->cookie) < 0) goto Err;
   2956 	*pa = a;
   2957 	return 0;
   2958 Err:
   2959 	*pa = ea;
   2960 	return -1;
   2961 }
   2962 int
   2963 nfs3entryunpack(uchar *a, uchar *ea, uchar **pa, Nfs3Entry *x)
   2964 {
   2965 	u1int one;
   2966 
   2967 	memset(x, 0, sizeof *x);
   2968 	if(sunuint1unpack(a, ea, &a, &one) < 0 || one != 1) goto Err;
   2969 	if(sunuint64unpack(a, ea, &a, &x->fileid) < 0) goto Err;
   2970 	if(sunstringunpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   2971 	x->namelen = strlen(x->name);
   2972 	if(sunuint64unpack(a, ea, &a, &x->cookie) < 0) goto Err;
   2973 	*pa = a;
   2974 	return 0;
   2975 Err:
   2976 	*pa = ea;
   2977 	return -1;
   2978 }
   2979 void
   2980 nfs3rreaddirprint(Fmt *fmt, Nfs3RReadDir *x)
   2981 {
   2982 	fmtprint(fmt, "%s\n", "Nfs3RReadDir");
   2983 	fmtprint(fmt, "\t%s=", "status");
   2984 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   2985 	fmtprint(fmt, "\n");
   2986 	fmtprint(fmt, "\t%s=", "haveAttr");
   2987 	fmtprint(fmt, "%d", x->haveAttr);
   2988 	fmtprint(fmt, "\n");
   2989 	switch(x->haveAttr){
   2990 	case 1:
   2991 		fmtprint(fmt, "\t%s=", "attr");
   2992 		nfs3attrprint(fmt, &x->attr);
   2993 		fmtprint(fmt, "\n");
   2994 		break;
   2995 	}
   2996 	switch(x->status){
   2997 	case Nfs3Ok:
   2998 		fmtprint(fmt, "\t%s=", "verf");
   2999 		fmtprint(fmt, "%.*H", Nfs3CookieVerfSize, x->verf);
   3000 		fmtprint(fmt, "\n");
   3001 		fmtprint(fmt, "\t%s=%ud\n", "count", x->count);
   3002 		fmtprint(fmt, "\t%s=", "eof");
   3003 		fmtprint(fmt, "%d", x->eof);
   3004 		fmtprint(fmt, "\n");
   3005 		break;
   3006 	}
   3007 }
   3008 uint
   3009 nfs3rreaddirsize(Nfs3RReadDir *x)
   3010 {
   3011 	uint a;
   3012 	USED(x);
   3013 	a = 0 + 4 + 4;
   3014 	switch(x->haveAttr){
   3015 	case 1:
   3016 		a = a + nfs3attrsize(&x->attr);
   3017 		break;
   3018 	}
   3019 	switch(x->status){
   3020 	case Nfs3Ok:
   3021 		a = a + Nfs3CookieVerfSize;
   3022 		a += x->count;
   3023 		a += 4 + 4;
   3024 		break;
   3025 	}
   3026 	return a;
   3027 }
   3028 int
   3029 nfs3rreaddirpack(uchar *a, uchar *ea, uchar **pa, Nfs3RReadDir *x)
   3030 {
   3031 	int i;
   3032 	u1int zero;
   3033 
   3034 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   3035 	if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3036 	switch(x->haveAttr){
   3037 	case 1:
   3038 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   3039 		break;
   3040 	}
   3041 	switch(x->status){
   3042 	case Nfs3Ok:
   3043 		if(sunfixedopaquepack(a, ea, &a, x->verf, Nfs3CookieVerfSize) < 0) goto Err;
   3044 		if(sunfixedopaquepack(a, ea, &a, x->data, x->count) < 0) goto Err;
   3045 		zero = 0;
   3046 		if(sunuint1pack(a, ea, &a, &zero) < 0) goto Err;
   3047 		if(sunuint1pack(a, ea, &a, &x->eof) < 0) goto Err;
   3048 		break;
   3049 	}
   3050 	*pa = a;
   3051 	return 0;
   3052 Err:
   3053 	*pa = ea;
   3054 	return -1;
   3055 }
   3056 static int
   3057 countEntry(uchar *a, uchar *ea, uchar **pa, u32int *n)
   3058 {
   3059 	uchar *oa;
   3060 	u64int u64;
   3061 	u32int u32;
   3062 	u1int u1;
   3063 
   3064 	oa = a;
   3065 	for(;;){
   3066 		if(sunuint1unpack(a, ea, &a, &u1) < 0)
   3067 			return -1;
   3068 		if(u1 == 0)
   3069 			break;
   3070 		if(sunuint64unpack(a, ea, &a, &u64) < 0
   3071 		|| sunuint32unpack(a, ea, &a, &u32) < 0)
   3072 			return -1;
   3073 		a += (u32+3)&~3;
   3074 		if(a >= ea)
   3075 			return -1;
   3076 		if(sunuint64unpack(a, ea, &a, &u64) < 0)
   3077 			return -1;
   3078 	}
   3079 	*n = (a-4) - oa;
   3080 	*pa = a;
   3081 	return 0;
   3082 }
   3083 int
   3084 nfs3rreaddirunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RReadDir *x)
   3085 {
   3086 	int i;
   3087 
   3088 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   3089 	if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3090 	switch(x->haveAttr){
   3091 	case 1:
   3092 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   3093 		break;
   3094 	}
   3095 	if(x->status == Nfs3Ok){
   3096 		if(sunfixedopaqueunpack(a, ea, &a, x->verf, Nfs3CookieVerfSize) < 0) goto Err;
   3097 		x->data = a;
   3098 		if(countEntry(a, ea, &a, &x->count) < 0) goto Err;
   3099 		if(sunuint1unpack(a, ea, &a, &x->eof) < 0) goto Err;
   3100 	}
   3101 	*pa = a;
   3102 	return 0;
   3103 Err:
   3104 	*pa = ea;
   3105 	return -1;
   3106 }
   3107 void
   3108 nfs3treaddirplusprint(Fmt *fmt, Nfs3TReadDirPlus *x)
   3109 {
   3110 	fmtprint(fmt, "%s\n", "Nfs3TReadDirPlus");
   3111 	fmtprint(fmt, "\t%s=", "handle");
   3112 	nfs3handleprint(fmt, &x->handle);
   3113 	fmtprint(fmt, "\n");
   3114 	fmtprint(fmt, "\t%s=", "cookie");
   3115 	fmtprint(fmt, "%llud", x->cookie);
   3116 	fmtprint(fmt, "\n");
   3117 	fmtprint(fmt, "\t%s=", "verf");
   3118 	fmtprint(fmt, "%.*H", Nfs3CookieVerfSize, x->verf);
   3119 	fmtprint(fmt, "\n");
   3120 	fmtprint(fmt, "\t%s=", "dirCount");
   3121 	fmtprint(fmt, "%ud", x->dirCount);
   3122 	fmtprint(fmt, "\n");
   3123 	fmtprint(fmt, "\t%s=", "maxCount");
   3124 	fmtprint(fmt, "%ud", x->maxCount);
   3125 	fmtprint(fmt, "\n");
   3126 }
   3127 uint
   3128 nfs3treaddirplussize(Nfs3TReadDirPlus *x)
   3129 {
   3130 	uint a;
   3131 	USED(x);
   3132 	a = 0 + nfs3handlesize(&x->handle) + 8 + Nfs3CookieVerfSize + 4 + 4;
   3133 	return a;
   3134 }
   3135 int
   3136 nfs3treaddirpluspack(uchar *a, uchar *ea, uchar **pa, Nfs3TReadDirPlus *x)
   3137 {
   3138 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   3139 	if(sunuint64pack(a, ea, &a, &x->cookie) < 0) goto Err;
   3140 	if(sunfixedopaquepack(a, ea, &a, x->verf, Nfs3CookieVerfSize) < 0) goto Err;
   3141 	if(sunuint32pack(a, ea, &a, &x->dirCount) < 0) goto Err;
   3142 	if(sunuint32pack(a, ea, &a, &x->maxCount) < 0) goto Err;
   3143 	*pa = a;
   3144 	return 0;
   3145 Err:
   3146 	*pa = ea;
   3147 	return -1;
   3148 }
   3149 int
   3150 nfs3treaddirplusunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TReadDirPlus *x)
   3151 {
   3152 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   3153 	if(sunuint64unpack(a, ea, &a, &x->cookie) < 0) goto Err;
   3154 	if(sunfixedopaqueunpack(a, ea, &a, x->verf, Nfs3CookieVerfSize) < 0) goto Err;
   3155 	if(sunuint32unpack(a, ea, &a, &x->dirCount) < 0) goto Err;
   3156 	if(sunuint32unpack(a, ea, &a, &x->maxCount) < 0) goto Err;
   3157 	*pa = a;
   3158 	return 0;
   3159 Err:
   3160 	*pa = ea;
   3161 	return -1;
   3162 }
   3163 void
   3164 nfs3entryplusprint(Fmt *fmt, Nfs3Entry *x)
   3165 {
   3166 	fmtprint(fmt, "%s\n", "Nfs3EntryPlus");
   3167 	fmtprint(fmt, "\t%s=", "fileid");
   3168 	fmtprint(fmt, "%llud", x->fileid);
   3169 	fmtprint(fmt, "\n");
   3170 	fmtprint(fmt, "\t%s=", "name");
   3171 	fmtprint(fmt, "\"%s\"", x->name);
   3172 	fmtprint(fmt, "\n");
   3173 	fmtprint(fmt, "\t%s=", "cookie");
   3174 	fmtprint(fmt, "%llud", x->cookie);
   3175 	fmtprint(fmt, "\n");
   3176 	fmtprint(fmt, "\t%s=", "haveAttr");
   3177 	fmtprint(fmt, "%d", x->haveAttr);
   3178 	fmtprint(fmt, "\n");
   3179 	switch(x->haveAttr){
   3180 	case 1:
   3181 		fmtprint(fmt, "\t%s=", "attr");
   3182 		nfs3attrprint(fmt, &x->attr);
   3183 		fmtprint(fmt, "\n");
   3184 		break;
   3185 	}
   3186 	fmtprint(fmt, "\t%s=", "haveHandle");
   3187 	fmtprint(fmt, "%d", x->haveHandle);
   3188 	fmtprint(fmt, "\n");
   3189 	switch(x->haveHandle){
   3190 	case 1:
   3191 		fmtprint(fmt, "\t%s=", "handle");
   3192 		nfs3handleprint(fmt, &x->handle);
   3193 		fmtprint(fmt, "\n");
   3194 		break;
   3195 	}
   3196 }
   3197 uint
   3198 nfs3entryplussize(Nfs3Entry *x)
   3199 {
   3200 	uint a;
   3201 	USED(x);
   3202 	a = 0 + 8 + sunstringsize(x->name) + 8 + 4;
   3203 	switch(x->haveAttr){
   3204 	case 1:
   3205 		a = a + nfs3attrsize(&x->attr);
   3206 		break;
   3207 	}
   3208 	a = a + 4;
   3209 	switch(x->haveHandle){
   3210 	case 1:
   3211 		a = a + nfs3handlesize(&x->handle);
   3212 		break;
   3213 	}
   3214 	return a;
   3215 }
   3216 int
   3217 nfs3entrypluspack(uchar *a, uchar *ea, uchar **pa, Nfs3Entry *x)
   3218 {
   3219 	u1int u1;
   3220 
   3221 	if(sunuint1pack(a, ea, &a, &u1) < 0) goto Err;
   3222 	if(sunuint64pack(a, ea, &a, &x->fileid) < 0) goto Err;
   3223 	if(sunstringpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   3224 	if(sunuint64pack(a, ea, &a, &x->cookie) < 0) goto Err;
   3225 	if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3226 	switch(x->haveAttr){
   3227 	case 1:
   3228 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   3229 		break;
   3230 	}
   3231 	if(sunuint1pack(a, ea, &a, &x->haveHandle) < 0) goto Err;
   3232 	switch(x->haveHandle){
   3233 	case 1:
   3234 		if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   3235 		break;
   3236 	}
   3237 	*pa = a;
   3238 	return 0;
   3239 Err:
   3240 	*pa = ea;
   3241 	return -1;
   3242 }
   3243 int
   3244 nfs3entryplusunpack(uchar *a, uchar *ea, uchar **pa, Nfs3Entry *x)
   3245 {
   3246 	u1int u1;
   3247 
   3248 	if(sunuint1unpack(a, ea, &a, &u1) < 0 || u1 != 1) goto Err;
   3249 	if(sunuint64unpack(a, ea, &a, &x->fileid) < 0) goto Err;
   3250 	if(sunstringunpack(a, ea, &a, &x->name, -1) < 0) goto Err;
   3251 	if(sunuint64unpack(a, ea, &a, &x->cookie) < 0) goto Err;
   3252 	if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3253 	switch(x->haveAttr){
   3254 	case 1:
   3255 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   3256 		break;
   3257 	}
   3258 	if(sunuint1unpack(a, ea, &a, &x->haveHandle) < 0) goto Err;
   3259 	switch(x->haveHandle){
   3260 	case 1:
   3261 		if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   3262 		break;
   3263 	}
   3264 	*pa = a;
   3265 	return 0;
   3266 Err:
   3267 	*pa = ea;
   3268 	return -1;
   3269 }
   3270 void
   3271 nfs3rreaddirplusprint(Fmt *fmt, Nfs3RReadDirPlus *x)
   3272 {
   3273 	fmtprint(fmt, "%s\n", "Nfs3RReadDirPlus");
   3274 	fmtprint(fmt, "\t%s=", "status");
   3275 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   3276 	fmtprint(fmt, "\n");
   3277 	fmtprint(fmt, "\t%s=", "haveAttr");
   3278 	fmtprint(fmt, "%d", x->haveAttr);
   3279 	fmtprint(fmt, "\n");
   3280 	switch(x->haveAttr){
   3281 	case 1:
   3282 		fmtprint(fmt, "\t%s=", "attr");
   3283 		nfs3attrprint(fmt, &x->attr);
   3284 		fmtprint(fmt, "\n");
   3285 		break;
   3286 	}
   3287 	switch(x->status){
   3288 	case Nfs3Ok:
   3289 		fmtprint(fmt, "\t%s=", "verf");
   3290 		fmtprint(fmt, "%.*H", Nfs3CookieVerfSize, x->verf);
   3291 		fmtprint(fmt, "\n");
   3292 		fmtprint(fmt, "\tcount=%ud\n", x->count);
   3293 		fmtprint(fmt, "\t%s=", "eof");
   3294 		fmtprint(fmt, "%d", x->eof);
   3295 		fmtprint(fmt, "\n");
   3296 		break;
   3297 	}
   3298 }
   3299 uint
   3300 nfs3rreaddirplussize(Nfs3RReadDirPlus *x)
   3301 {
   3302 	uint a;
   3303 	USED(x);
   3304 	a = 0 + 4 + 4;
   3305 	switch(x->haveAttr){
   3306 	case 1:
   3307 		a = a + nfs3attrsize(&x->attr);
   3308 		break;
   3309 	}
   3310 	switch(x->status){
   3311 	case Nfs3Ok:
   3312 		a = a + Nfs3CookieVerfSize;
   3313 		a += x->count;
   3314 		a += 4 + 4;
   3315 		break;
   3316 	}
   3317 	return a;
   3318 }
   3319 int
   3320 nfs3rreaddirpluspack(uchar *a, uchar *ea, uchar **pa, Nfs3RReadDirPlus *x)
   3321 {
   3322 	int i;
   3323 	u1int zero;
   3324 
   3325 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   3326 	if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3327 	switch(x->haveAttr){
   3328 	case 1:
   3329 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   3330 		break;
   3331 	}
   3332 	switch(x->status){
   3333 	case Nfs3Ok:
   3334 		if(sunfixedopaquepack(a, ea, &a, x->verf, Nfs3CookieVerfSize) < 0) goto Err;
   3335 		if(sunfixedopaquepack(a, ea, &a, x->data, x->count) < 0) goto Err;
   3336 		zero = 0;
   3337 		if(sunuint1pack(a, ea, &a, &zero) < 0) goto Err;
   3338 		if(sunuint1pack(a, ea, &a, &x->eof) < 0) goto Err;
   3339 		break;
   3340 	}
   3341 	*pa = a;
   3342 	return 0;
   3343 Err:
   3344 	*pa = ea;
   3345 	return -1;
   3346 }
   3347 static int
   3348 countEntryPlus(uchar *a, uchar *ea, uchar **pa, u32int *n)
   3349 {
   3350 	uchar *oa;
   3351 	u64int u64;
   3352 	u32int u32;
   3353 	u1int u1;
   3354 	Nfs3Handle h;
   3355 	Nfs3Attr attr;
   3356 
   3357 	oa = a;
   3358 	for(;;){
   3359 		if(sunuint1unpack(a, ea, &a, &u1) < 0)
   3360 			return -1;
   3361 		if(u1 == 0)
   3362 			break;
   3363 		if(sunuint64unpack(a, ea, &a, &u64) < 0
   3364 		|| sunuint32unpack(a, ea, &a, &u32) < 0)
   3365 			return -1;
   3366 		a += (u32+3)&~3;
   3367 		if(a >= ea)
   3368 			return -1;
   3369 		if(sunuint64unpack(a, ea, &a, &u64) < 0
   3370 		|| sunuint1unpack(a, ea, &a, &u1) < 0
   3371 		|| (u1 && nfs3attrunpack(a, ea, &a, &attr) < 0)
   3372 		|| sunuint1unpack(a, ea, &a, &u1) < 0
   3373 		|| (u1 && nfs3handleunpack(a, ea, &a, &h) < 0))
   3374 			return -1;
   3375 	}
   3376 	*n = (a-4) - oa;
   3377 	*pa = a;
   3378 	return 0;
   3379 }
   3380 
   3381 int
   3382 nfs3rreaddirplusunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RReadDirPlus *x)
   3383 {
   3384 	int i;
   3385 
   3386 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   3387 	if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3388 	switch(x->haveAttr){
   3389 	case 1:
   3390 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   3391 		break;
   3392 	}
   3393 	if(x->status == Nfs3Ok){
   3394 		if(sunfixedopaqueunpack(a, ea, &a, x->verf, Nfs3CookieVerfSize) < 0) goto Err;
   3395 		x->data = a;
   3396 		if(countEntryPlus(a, ea, &a, &x->count) < 0) goto Err;
   3397 		if(sunuint1unpack(a, ea, &a, &x->eof) < 0) goto Err;
   3398 	}
   3399 	*pa = a;
   3400 	return 0;
   3401 Err:
   3402 	*pa = ea;
   3403 	return -1;
   3404 }
   3405 void
   3406 nfs3tfsstatprint(Fmt *fmt, Nfs3TFsStat *x)
   3407 {
   3408 	fmtprint(fmt, "%s\n", "Nfs3TFsStat");
   3409 	fmtprint(fmt, "\t%s=", "handle");
   3410 	nfs3handleprint(fmt, &x->handle);
   3411 	fmtprint(fmt, "\n");
   3412 }
   3413 uint
   3414 nfs3tfsstatsize(Nfs3TFsStat *x)
   3415 {
   3416 	uint a;
   3417 	USED(x);
   3418 	a = 0 + nfs3handlesize(&x->handle);
   3419 	return a;
   3420 }
   3421 int
   3422 nfs3tfsstatpack(uchar *a, uchar *ea, uchar **pa, Nfs3TFsStat *x)
   3423 {
   3424 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   3425 	*pa = a;
   3426 	return 0;
   3427 Err:
   3428 	*pa = ea;
   3429 	return -1;
   3430 }
   3431 int
   3432 nfs3tfsstatunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TFsStat *x)
   3433 {
   3434 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   3435 	*pa = a;
   3436 	return 0;
   3437 Err:
   3438 	*pa = ea;
   3439 	return -1;
   3440 }
   3441 void
   3442 nfs3rfsstatprint(Fmt *fmt, Nfs3RFsStat *x)
   3443 {
   3444 	fmtprint(fmt, "%s\n", "Nfs3RFsStat");
   3445 	fmtprint(fmt, "\t%s=", "status");
   3446 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   3447 	fmtprint(fmt, "\n");
   3448 	fmtprint(fmt, "\t%s=", "haveAttr");
   3449 	fmtprint(fmt, "%d", x->haveAttr);
   3450 	fmtprint(fmt, "\n");
   3451 	switch(x->haveAttr){
   3452 	case 1:
   3453 		fmtprint(fmt, "\t%s=", "attr");
   3454 		nfs3attrprint(fmt, &x->attr);
   3455 		fmtprint(fmt, "\n");
   3456 		break;
   3457 	}
   3458 	switch(x->status){
   3459 	case Nfs3Ok:
   3460 		fmtprint(fmt, "\t%s=", "totalBytes");
   3461 		fmtprint(fmt, "%llud", x->totalBytes);
   3462 		fmtprint(fmt, "\n");
   3463 		fmtprint(fmt, "\t%s=", "freeBytes");
   3464 		fmtprint(fmt, "%llud", x->freeBytes);
   3465 		fmtprint(fmt, "\n");
   3466 		fmtprint(fmt, "\t%s=", "availBytes");
   3467 		fmtprint(fmt, "%llud", x->availBytes);
   3468 		fmtprint(fmt, "\n");
   3469 		fmtprint(fmt, "\t%s=", "totalFiles");
   3470 		fmtprint(fmt, "%llud", x->totalFiles);
   3471 		fmtprint(fmt, "\n");
   3472 		fmtprint(fmt, "\t%s=", "freeFiles");
   3473 		fmtprint(fmt, "%llud", x->freeFiles);
   3474 		fmtprint(fmt, "\n");
   3475 		fmtprint(fmt, "\t%s=", "availFiles");
   3476 		fmtprint(fmt, "%llud", x->availFiles);
   3477 		fmtprint(fmt, "\n");
   3478 		fmtprint(fmt, "\t%s=", "invarSec");
   3479 		fmtprint(fmt, "%ud", x->invarSec);
   3480 		fmtprint(fmt, "\n");
   3481 		break;
   3482 	}
   3483 }
   3484 uint
   3485 nfs3rfsstatsize(Nfs3RFsStat *x)
   3486 {
   3487 	uint a;
   3488 	USED(x);
   3489 	a = 0 + 4 + 4;
   3490 	switch(x->haveAttr){
   3491 	case 1:
   3492 		a = a + nfs3attrsize(&x->attr);
   3493 		break;
   3494 	}
   3495 	switch(x->status){
   3496 	case Nfs3Ok:
   3497 		a = a + 8 + 8 + 8 + 8 + 8 + 8 + 4;
   3498 		break;
   3499 	}
   3500 	return a;
   3501 }
   3502 int
   3503 nfs3rfsstatpack(uchar *a, uchar *ea, uchar **pa, Nfs3RFsStat *x)
   3504 {
   3505 	int i;
   3506 
   3507 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   3508 	if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3509 	switch(x->haveAttr){
   3510 	case 1:
   3511 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   3512 		break;
   3513 	}
   3514 	switch(x->status){
   3515 	case Nfs3Ok:
   3516 		if(sunuint64pack(a, ea, &a, &x->totalBytes) < 0) goto Err;
   3517 		if(sunuint64pack(a, ea, &a, &x->freeBytes) < 0) goto Err;
   3518 		if(sunuint64pack(a, ea, &a, &x->availBytes) < 0) goto Err;
   3519 		if(sunuint64pack(a, ea, &a, &x->totalFiles) < 0) goto Err;
   3520 		if(sunuint64pack(a, ea, &a, &x->freeFiles) < 0) goto Err;
   3521 		if(sunuint64pack(a, ea, &a, &x->availFiles) < 0) goto Err;
   3522 		if(sunuint32pack(a, ea, &a, &x->invarSec) < 0) goto Err;
   3523 		break;
   3524 	}
   3525 	*pa = a;
   3526 	return 0;
   3527 Err:
   3528 	*pa = ea;
   3529 	return -1;
   3530 }
   3531 int
   3532 nfs3rfsstatunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RFsStat *x)
   3533 {
   3534 	int i;
   3535 
   3536 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   3537 	if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3538 	switch(x->haveAttr){
   3539 	case 1:
   3540 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   3541 		break;
   3542 	}
   3543 	switch(x->status){
   3544 	case Nfs3Ok:
   3545 		if(sunuint64unpack(a, ea, &a, &x->totalBytes) < 0) goto Err;
   3546 		if(sunuint64unpack(a, ea, &a, &x->freeBytes) < 0) goto Err;
   3547 		if(sunuint64unpack(a, ea, &a, &x->availBytes) < 0) goto Err;
   3548 		if(sunuint64unpack(a, ea, &a, &x->totalFiles) < 0) goto Err;
   3549 		if(sunuint64unpack(a, ea, &a, &x->freeFiles) < 0) goto Err;
   3550 		if(sunuint64unpack(a, ea, &a, &x->availFiles) < 0) goto Err;
   3551 		if(sunuint32unpack(a, ea, &a, &x->invarSec) < 0) goto Err;
   3552 		break;
   3553 	}
   3554 	*pa = a;
   3555 	return 0;
   3556 Err:
   3557 	*pa = ea;
   3558 	return -1;
   3559 }
   3560 void
   3561 nfs3tfsinfoprint(Fmt *fmt, Nfs3TFsInfo *x)
   3562 {
   3563 	fmtprint(fmt, "%s\n", "Nfs3TFsInfo");
   3564 	fmtprint(fmt, "\t%s=", "handle");
   3565 	nfs3handleprint(fmt, &x->handle);
   3566 	fmtprint(fmt, "\n");
   3567 }
   3568 uint
   3569 nfs3tfsinfosize(Nfs3TFsInfo *x)
   3570 {
   3571 	uint a;
   3572 	USED(x);
   3573 	a = 0 + nfs3handlesize(&x->handle);
   3574 	return a;
   3575 }
   3576 int
   3577 nfs3tfsinfopack(uchar *a, uchar *ea, uchar **pa, Nfs3TFsInfo *x)
   3578 {
   3579 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   3580 	*pa = a;
   3581 	return 0;
   3582 Err:
   3583 	*pa = ea;
   3584 	return -1;
   3585 }
   3586 int
   3587 nfs3tfsinfounpack(uchar *a, uchar *ea, uchar **pa, Nfs3TFsInfo *x)
   3588 {
   3589 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   3590 	*pa = a;
   3591 	return 0;
   3592 Err:
   3593 	*pa = ea;
   3594 	return -1;
   3595 }
   3596 void
   3597 nfs3rfsinfoprint(Fmt *fmt, Nfs3RFsInfo *x)
   3598 {
   3599 	fmtprint(fmt, "%s\n", "Nfs3RFsInfo");
   3600 	fmtprint(fmt, "\t%s=", "status");
   3601 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   3602 	fmtprint(fmt, "\n");
   3603 	fmtprint(fmt, "\t%s=", "haveAttr");
   3604 	fmtprint(fmt, "%d", x->haveAttr);
   3605 	fmtprint(fmt, "\n");
   3606 	switch(x->haveAttr){
   3607 	case 1:
   3608 		fmtprint(fmt, "\t%s=", "attr");
   3609 		nfs3attrprint(fmt, &x->attr);
   3610 		fmtprint(fmt, "\n");
   3611 		break;
   3612 	}
   3613 	switch(x->status){
   3614 	case Nfs3Ok:
   3615 		fmtprint(fmt, "\t%s=", "readMax");
   3616 		fmtprint(fmt, "%ud", x->readMax);
   3617 		fmtprint(fmt, "\n");
   3618 		fmtprint(fmt, "\t%s=", "readPref");
   3619 		fmtprint(fmt, "%ud", x->readPref);
   3620 		fmtprint(fmt, "\n");
   3621 		fmtprint(fmt, "\t%s=", "readMult");
   3622 		fmtprint(fmt, "%ud", x->readMult);
   3623 		fmtprint(fmt, "\n");
   3624 		fmtprint(fmt, "\t%s=", "writeMax");
   3625 		fmtprint(fmt, "%ud", x->writeMax);
   3626 		fmtprint(fmt, "\n");
   3627 		fmtprint(fmt, "\t%s=", "writePref");
   3628 		fmtprint(fmt, "%ud", x->writePref);
   3629 		fmtprint(fmt, "\n");
   3630 		fmtprint(fmt, "\t%s=", "writeMult");
   3631 		fmtprint(fmt, "%ud", x->writeMult);
   3632 		fmtprint(fmt, "\n");
   3633 		fmtprint(fmt, "\t%s=", "readDirPref");
   3634 		fmtprint(fmt, "%ud", x->readDirPref);
   3635 		fmtprint(fmt, "\n");
   3636 		fmtprint(fmt, "\t%s=", "maxFileSize");
   3637 		fmtprint(fmt, "%llud", x->maxFileSize);
   3638 		fmtprint(fmt, "\n");
   3639 		fmtprint(fmt, "\t%s=", "timePrec");
   3640 		nfs3timeprint(fmt, &x->timePrec);
   3641 		fmtprint(fmt, "\n");
   3642 		fmtprint(fmt, "\t%s=", "flags");
   3643 		fmtprint(fmt, "%ud", x->flags);
   3644 		fmtprint(fmt, "\n");
   3645 		break;
   3646 	}
   3647 }
   3648 uint
   3649 nfs3rfsinfosize(Nfs3RFsInfo *x)
   3650 {
   3651 	uint a;
   3652 	USED(x);
   3653 	a = 0 + 4 + 4;
   3654 	switch(x->haveAttr){
   3655 	case 1:
   3656 		a = a + nfs3attrsize(&x->attr);
   3657 		break;
   3658 	}
   3659 	switch(x->status){
   3660 	case Nfs3Ok:
   3661 		a = a + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 8 + nfs3timesize(&x->timePrec) + 4;
   3662 		break;
   3663 	}
   3664 	return a;
   3665 }
   3666 int
   3667 nfs3rfsinfopack(uchar *a, uchar *ea, uchar **pa, Nfs3RFsInfo *x)
   3668 {
   3669 	int i;
   3670 
   3671 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   3672 	if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3673 	switch(x->haveAttr){
   3674 	case 1:
   3675 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   3676 		break;
   3677 	}
   3678 	switch(x->status){
   3679 	case Nfs3Ok:
   3680 		if(sunuint32pack(a, ea, &a, &x->readMax) < 0) goto Err;
   3681 		if(sunuint32pack(a, ea, &a, &x->readPref) < 0) goto Err;
   3682 		if(sunuint32pack(a, ea, &a, &x->readMult) < 0) goto Err;
   3683 		if(sunuint32pack(a, ea, &a, &x->writeMax) < 0) goto Err;
   3684 		if(sunuint32pack(a, ea, &a, &x->writePref) < 0) goto Err;
   3685 		if(sunuint32pack(a, ea, &a, &x->writeMult) < 0) goto Err;
   3686 		if(sunuint32pack(a, ea, &a, &x->readDirPref) < 0) goto Err;
   3687 		if(sunuint64pack(a, ea, &a, &x->maxFileSize) < 0) goto Err;
   3688 		if(nfs3timepack(a, ea, &a, &x->timePrec) < 0) goto Err;
   3689 		if(sunuint32pack(a, ea, &a, &x->flags) < 0) goto Err;
   3690 		break;
   3691 	}
   3692 	*pa = a;
   3693 	return 0;
   3694 Err:
   3695 	*pa = ea;
   3696 	return -1;
   3697 }
   3698 int
   3699 nfs3rfsinfounpack(uchar *a, uchar *ea, uchar **pa, Nfs3RFsInfo *x)
   3700 {
   3701 	int i;
   3702 
   3703 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   3704 	if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3705 	switch(x->haveAttr){
   3706 	case 1:
   3707 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   3708 		break;
   3709 	}
   3710 	switch(x->status){
   3711 	case Nfs3Ok:
   3712 		if(sunuint32unpack(a, ea, &a, &x->readMax) < 0) goto Err;
   3713 		if(sunuint32unpack(a, ea, &a, &x->readPref) < 0) goto Err;
   3714 		if(sunuint32unpack(a, ea, &a, &x->readMult) < 0) goto Err;
   3715 		if(sunuint32unpack(a, ea, &a, &x->writeMax) < 0) goto Err;
   3716 		if(sunuint32unpack(a, ea, &a, &x->writePref) < 0) goto Err;
   3717 		if(sunuint32unpack(a, ea, &a, &x->writeMult) < 0) goto Err;
   3718 		if(sunuint32unpack(a, ea, &a, &x->readDirPref) < 0) goto Err;
   3719 		if(sunuint64unpack(a, ea, &a, &x->maxFileSize) < 0) goto Err;
   3720 		if(nfs3timeunpack(a, ea, &a, &x->timePrec) < 0) goto Err;
   3721 		if(sunuint32unpack(a, ea, &a, &x->flags) < 0) goto Err;
   3722 		break;
   3723 	}
   3724 	*pa = a;
   3725 	return 0;
   3726 Err:
   3727 	*pa = ea;
   3728 	return -1;
   3729 }
   3730 void
   3731 nfs3tpathconfprint(Fmt *fmt, Nfs3TPathconf *x)
   3732 {
   3733 	fmtprint(fmt, "%s\n", "Nfs3TPathconf");
   3734 	fmtprint(fmt, "\t%s=", "handle");
   3735 	nfs3handleprint(fmt, &x->handle);
   3736 	fmtprint(fmt, "\n");
   3737 }
   3738 uint
   3739 nfs3tpathconfsize(Nfs3TPathconf *x)
   3740 {
   3741 	uint a;
   3742 	USED(x);
   3743 	a = 0 + nfs3handlesize(&x->handle);
   3744 	return a;
   3745 }
   3746 int
   3747 nfs3tpathconfpack(uchar *a, uchar *ea, uchar **pa, Nfs3TPathconf *x)
   3748 {
   3749 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   3750 	*pa = a;
   3751 	return 0;
   3752 Err:
   3753 	*pa = ea;
   3754 	return -1;
   3755 }
   3756 int
   3757 nfs3tpathconfunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TPathconf *x)
   3758 {
   3759 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   3760 	*pa = a;
   3761 	return 0;
   3762 Err:
   3763 	*pa = ea;
   3764 	return -1;
   3765 }
   3766 void
   3767 nfs3rpathconfprint(Fmt *fmt, Nfs3RPathconf *x)
   3768 {
   3769 	fmtprint(fmt, "%s\n", "Nfs3RPathconf");
   3770 	fmtprint(fmt, "\t%s=", "status");
   3771 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   3772 	fmtprint(fmt, "\n");
   3773 	fmtprint(fmt, "\t%s=", "haveAttr");
   3774 	fmtprint(fmt, "%d", x->haveAttr);
   3775 	fmtprint(fmt, "\n");
   3776 	switch(x->haveAttr){
   3777 	case 1:
   3778 		fmtprint(fmt, "\t%s=", "attr");
   3779 		nfs3attrprint(fmt, &x->attr);
   3780 		fmtprint(fmt, "\n");
   3781 		break;
   3782 	}
   3783 	switch(x->status){
   3784 	case Nfs3Ok:
   3785 		fmtprint(fmt, "\t%s=", "maxLink");
   3786 		fmtprint(fmt, "%ud", x->maxLink);
   3787 		fmtprint(fmt, "\n");
   3788 		fmtprint(fmt, "\t%s=", "maxName");
   3789 		fmtprint(fmt, "%ud", x->maxName);
   3790 		fmtprint(fmt, "\n");
   3791 		fmtprint(fmt, "\t%s=", "noTrunc");
   3792 		fmtprint(fmt, "%d", x->noTrunc);
   3793 		fmtprint(fmt, "\n");
   3794 		fmtprint(fmt, "\t%s=", "chownRestricted");
   3795 		fmtprint(fmt, "%d", x->chownRestricted);
   3796 		fmtprint(fmt, "\n");
   3797 		fmtprint(fmt, "\t%s=", "caseInsensitive");
   3798 		fmtprint(fmt, "%d", x->caseInsensitive);
   3799 		fmtprint(fmt, "\n");
   3800 		fmtprint(fmt, "\t%s=", "casePreserving");
   3801 		fmtprint(fmt, "%d", x->casePreserving);
   3802 		fmtprint(fmt, "\n");
   3803 		break;
   3804 	}
   3805 }
   3806 uint
   3807 nfs3rpathconfsize(Nfs3RPathconf *x)
   3808 {
   3809 	uint a;
   3810 	USED(x);
   3811 	a = 0 + 4 + 4;
   3812 	switch(x->haveAttr){
   3813 	case 1:
   3814 		a = a + nfs3attrsize(&x->attr);
   3815 		break;
   3816 	}
   3817 	switch(x->status){
   3818 	case Nfs3Ok:
   3819 		a = a + 4 + 4 + 4 + 4 + 4 + 4;
   3820 		break;
   3821 	}
   3822 	return a;
   3823 }
   3824 int
   3825 nfs3rpathconfpack(uchar *a, uchar *ea, uchar **pa, Nfs3RPathconf *x)
   3826 {
   3827 	int i;
   3828 
   3829 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   3830 	if(sunuint1pack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3831 	switch(x->haveAttr){
   3832 	case 1:
   3833 		if(nfs3attrpack(a, ea, &a, &x->attr) < 0) goto Err;
   3834 		break;
   3835 	}
   3836 	switch(x->status){
   3837 	case Nfs3Ok:
   3838 		if(sunuint32pack(a, ea, &a, &x->maxLink) < 0) goto Err;
   3839 		if(sunuint32pack(a, ea, &a, &x->maxName) < 0) goto Err;
   3840 		if(sunuint1pack(a, ea, &a, &x->noTrunc) < 0) goto Err;
   3841 		if(sunuint1pack(a, ea, &a, &x->chownRestricted) < 0) goto Err;
   3842 		if(sunuint1pack(a, ea, &a, &x->caseInsensitive) < 0) goto Err;
   3843 		if(sunuint1pack(a, ea, &a, &x->casePreserving) < 0) goto Err;
   3844 		break;
   3845 	}
   3846 	*pa = a;
   3847 	return 0;
   3848 Err:
   3849 	*pa = ea;
   3850 	return -1;
   3851 }
   3852 int
   3853 nfs3rpathconfunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RPathconf *x)
   3854 {
   3855 	int i;
   3856 
   3857 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   3858 	if(sunuint1unpack(a, ea, &a, &x->haveAttr) < 0) goto Err;
   3859 	switch(x->haveAttr){
   3860 	case 1:
   3861 		if(nfs3attrunpack(a, ea, &a, &x->attr) < 0) goto Err;
   3862 		break;
   3863 	}
   3864 	switch(x->status){
   3865 	case Nfs3Ok:
   3866 		if(sunuint32unpack(a, ea, &a, &x->maxLink) < 0) goto Err;
   3867 		if(sunuint32unpack(a, ea, &a, &x->maxName) < 0) goto Err;
   3868 		if(sunuint1unpack(a, ea, &a, &x->noTrunc) < 0) goto Err;
   3869 		if(sunuint1unpack(a, ea, &a, &x->chownRestricted) < 0) goto Err;
   3870 		if(sunuint1unpack(a, ea, &a, &x->caseInsensitive) < 0) goto Err;
   3871 		if(sunuint1unpack(a, ea, &a, &x->casePreserving) < 0) goto Err;
   3872 		break;
   3873 	}
   3874 	*pa = a;
   3875 	return 0;
   3876 Err:
   3877 	*pa = ea;
   3878 	return -1;
   3879 }
   3880 void
   3881 nfs3tcommitprint(Fmt *fmt, Nfs3TCommit *x)
   3882 {
   3883 	fmtprint(fmt, "%s\n", "Nfs3TCommit");
   3884 	fmtprint(fmt, "\t%s=", "handle");
   3885 	nfs3handleprint(fmt, &x->handle);
   3886 	fmtprint(fmt, "\n");
   3887 	fmtprint(fmt, "\t%s=", "offset");
   3888 	fmtprint(fmt, "%llud", x->offset);
   3889 	fmtprint(fmt, "\n");
   3890 	fmtprint(fmt, "\t%s=", "count");
   3891 	fmtprint(fmt, "%ud", x->count);
   3892 	fmtprint(fmt, "\n");
   3893 }
   3894 uint
   3895 nfs3tcommitsize(Nfs3TCommit *x)
   3896 {
   3897 	uint a;
   3898 	USED(x);
   3899 	a = 0 + nfs3handlesize(&x->handle) + 8 + 4;
   3900 	return a;
   3901 }
   3902 int
   3903 nfs3tcommitpack(uchar *a, uchar *ea, uchar **pa, Nfs3TCommit *x)
   3904 {
   3905 	if(nfs3handlepack(a, ea, &a, &x->handle) < 0) goto Err;
   3906 	if(sunuint64pack(a, ea, &a, &x->offset) < 0) goto Err;
   3907 	if(sunuint32pack(a, ea, &a, &x->count) < 0) goto Err;
   3908 	*pa = a;
   3909 	return 0;
   3910 Err:
   3911 	*pa = ea;
   3912 	return -1;
   3913 }
   3914 int
   3915 nfs3tcommitunpack(uchar *a, uchar *ea, uchar **pa, Nfs3TCommit *x)
   3916 {
   3917 	if(nfs3handleunpack(a, ea, &a, &x->handle) < 0) goto Err;
   3918 	if(sunuint64unpack(a, ea, &a, &x->offset) < 0) goto Err;
   3919 	if(sunuint32unpack(a, ea, &a, &x->count) < 0) goto Err;
   3920 	*pa = a;
   3921 	return 0;
   3922 Err:
   3923 	*pa = ea;
   3924 	return -1;
   3925 }
   3926 void
   3927 nfs3rcommitprint(Fmt *fmt, Nfs3RCommit *x)
   3928 {
   3929 	fmtprint(fmt, "%s\n", "Nfs3RCommit");
   3930 	fmtprint(fmt, "\t%s=", "status");
   3931 	fmtprint(fmt, "%s", nfs3statusstr(x->status));
   3932 	fmtprint(fmt, "\n");
   3933 	fmtprint(fmt, "\t%s=", "wcc");
   3934 	nfs3wccprint(fmt, &x->wcc);
   3935 	fmtprint(fmt, "\n");
   3936 	switch(x->status){
   3937 	case Nfs3Ok:
   3938 		fmtprint(fmt, "\t%s=", "verf");
   3939 		fmtprint(fmt, "%.*H", Nfs3WriteVerfSize, x->verf);
   3940 		fmtprint(fmt, "\n");
   3941 		break;
   3942 	}
   3943 }
   3944 uint
   3945 nfs3rcommitsize(Nfs3RCommit *x)
   3946 {
   3947 	uint a;
   3948 	USED(x);
   3949 	a = 0 + 4 + nfs3wccsize(&x->wcc);
   3950 	switch(x->status){
   3951 	case Nfs3Ok:
   3952 		a = a + Nfs3WriteVerfSize;
   3953 		break;
   3954 	}
   3955 	return a;
   3956 }
   3957 int
   3958 nfs3rcommitpack(uchar *a, uchar *ea, uchar **pa, Nfs3RCommit *x)
   3959 {
   3960 	int i;
   3961 
   3962 	if(i=x->status, sunenumpack(a, ea, &a, &i) < 0) goto Err;
   3963 	if(nfs3wccpack(a, ea, &a, &x->wcc) < 0) goto Err;
   3964 	switch(x->status){
   3965 	case Nfs3Ok:
   3966 		if(sunfixedopaquepack(a, ea, &a, x->verf, Nfs3WriteVerfSize) < 0) goto Err;
   3967 		break;
   3968 	}
   3969 	*pa = a;
   3970 	return 0;
   3971 Err:
   3972 	*pa = ea;
   3973 	return -1;
   3974 }
   3975 int
   3976 nfs3rcommitunpack(uchar *a, uchar *ea, uchar **pa, Nfs3RCommit *x)
   3977 {
   3978 	int i;
   3979 
   3980 	if(sunenumunpack(a, ea, &a, &i) < 0) goto Err; x->status = i;
   3981 	if(nfs3wccunpack(a, ea, &a, &x->wcc) < 0) goto Err;
   3982 	switch(x->status){
   3983 	case Nfs3Ok:
   3984 		if(sunfixedopaqueunpack(a, ea, &a, x->verf, Nfs3WriteVerfSize) < 0) goto Err;
   3985 		break;
   3986 	}
   3987 	*pa = a;
   3988 	return 0;
   3989 Err:
   3990 	*pa = ea;
   3991 	return -1;
   3992 }
   3993 
   3994 typedef int (*P)(uchar*, uchar*, uchar**, SunCall*);
   3995 typedef void (*F)(Fmt*, SunCall*);
   3996 typedef uint (*S)(SunCall*);
   3997 
   3998 static SunProc proc[] = {
   3999 	(P)nfs3tnullpack, (P)nfs3tnullunpack, (S)nfs3tnullsize, (F)nfs3tnullprint, sizeof(Nfs3TNull),
   4000 	(P)nfs3rnullpack, (P)nfs3rnullunpack, (S)nfs3rnullsize, (F)nfs3rnullprint, sizeof(Nfs3RNull),
   4001 	(P)nfs3tgetattrpack, (P)nfs3tgetattrunpack, (S)nfs3tgetattrsize, (F)nfs3tgetattrprint, sizeof(Nfs3TGetattr),
   4002 	(P)nfs3rgetattrpack, (P)nfs3rgetattrunpack, (S)nfs3rgetattrsize, (F)nfs3rgetattrprint, sizeof(Nfs3RGetattr),
   4003 	(P)nfs3tsetattrpack, (P)nfs3tsetattrunpack, (S)nfs3tsetattrsize, (F)nfs3tsetattrprint, sizeof(Nfs3TSetattr),
   4004 	(P)nfs3rsetattrpack, (P)nfs3rsetattrunpack, (S)nfs3rsetattrsize, (F)nfs3rsetattrprint, sizeof(Nfs3RSetattr),
   4005 	(P)nfs3tlookuppack, (P)nfs3tlookupunpack, (S)nfs3tlookupsize, (F)nfs3tlookupprint, sizeof(Nfs3TLookup),
   4006 	(P)nfs3rlookuppack, (P)nfs3rlookupunpack, (S)nfs3rlookupsize, (F)nfs3rlookupprint, sizeof(Nfs3RLookup),
   4007 	(P)nfs3taccesspack, (P)nfs3taccessunpack, (S)nfs3taccesssize, (F)nfs3taccessprint, sizeof(Nfs3TAccess),
   4008 	(P)nfs3raccesspack, (P)nfs3raccessunpack, (S)nfs3raccesssize, (F)nfs3raccessprint, sizeof(Nfs3RAccess),
   4009 	(P)nfs3treadlinkpack, (P)nfs3treadlinkunpack, (S)nfs3treadlinksize, (F)nfs3treadlinkprint, sizeof(Nfs3TReadlink),
   4010 	(P)nfs3rreadlinkpack, (P)nfs3rreadlinkunpack, (S)nfs3rreadlinksize, (F)nfs3rreadlinkprint, sizeof(Nfs3RReadlink),
   4011 	(P)nfs3treadpack, (P)nfs3treadunpack, (S)nfs3treadsize, (F)nfs3treadprint, sizeof(Nfs3TRead),
   4012 	(P)nfs3rreadpack, (P)nfs3rreadunpack, (S)nfs3rreadsize, (F)nfs3rreadprint, sizeof(Nfs3RRead),
   4013 	(P)nfs3twritepack, (P)nfs3twriteunpack, (S)nfs3twritesize, (F)nfs3twriteprint, sizeof(Nfs3TWrite),
   4014 	(P)nfs3rwritepack, (P)nfs3rwriteunpack, (S)nfs3rwritesize, (F)nfs3rwriteprint, sizeof(Nfs3RWrite),
   4015 	(P)nfs3tcreatepack, (P)nfs3tcreateunpack, (S)nfs3tcreatesize, (F)nfs3tcreateprint, sizeof(Nfs3TCreate),
   4016 	(P)nfs3rcreatepack, (P)nfs3rcreateunpack, (S)nfs3rcreatesize, (F)nfs3rcreateprint, sizeof(Nfs3RCreate),
   4017 	(P)nfs3tmkdirpack, (P)nfs3tmkdirunpack, (S)nfs3tmkdirsize, (F)nfs3tmkdirprint, sizeof(Nfs3TMkdir),
   4018 	(P)nfs3rmkdirpack, (P)nfs3rmkdirunpack, (S)nfs3rmkdirsize, (F)nfs3rmkdirprint, sizeof(Nfs3RMkdir),
   4019 	(P)nfs3tsymlinkpack, (P)nfs3tsymlinkunpack, (S)nfs3tsymlinksize, (F)nfs3tsymlinkprint, sizeof(Nfs3TSymlink),
   4020 	(P)nfs3rsymlinkpack, (P)nfs3rsymlinkunpack, (S)nfs3rsymlinksize, (F)nfs3rsymlinkprint, sizeof(Nfs3RSymlink),
   4021 	(P)nfs3tmknodpack, (P)nfs3tmknodunpack, (S)nfs3tmknodsize, (F)nfs3tmknodprint, sizeof(Nfs3TMknod),
   4022 	(P)nfs3rmknodpack, (P)nfs3rmknodunpack, (S)nfs3rmknodsize, (F)nfs3rmknodprint, sizeof(Nfs3RMknod),
   4023 	(P)nfs3tremovepack, (P)nfs3tremoveunpack, (S)nfs3tremovesize, (F)nfs3tremoveprint, sizeof(Nfs3TRemove),
   4024 	(P)nfs3rremovepack, (P)nfs3rremoveunpack, (S)nfs3rremovesize, (F)nfs3rremoveprint, sizeof(Nfs3RRemove),
   4025 	(P)nfs3trmdirpack, (P)nfs3trmdirunpack, (S)nfs3trmdirsize, (F)nfs3trmdirprint, sizeof(Nfs3TRmdir),
   4026 	(P)nfs3rrmdirpack, (P)nfs3rrmdirunpack, (S)nfs3rrmdirsize, (F)nfs3rrmdirprint, sizeof(Nfs3RRmdir),
   4027 	(P)nfs3trenamepack, (P)nfs3trenameunpack, (S)nfs3trenamesize, (F)nfs3trenameprint, sizeof(Nfs3TRename),
   4028 	(P)nfs3rrenamepack, (P)nfs3rrenameunpack, (S)nfs3rrenamesize, (F)nfs3rrenameprint, sizeof(Nfs3RRename),
   4029 	(P)nfs3tlinkpack, (P)nfs3tlinkunpack, (S)nfs3tlinksize, (F)nfs3tlinkprint, sizeof(Nfs3TLink),
   4030 	(P)nfs3rlinkpack, (P)nfs3rlinkunpack, (S)nfs3rlinksize, (F)nfs3rlinkprint, sizeof(Nfs3RLink),
   4031 	(P)nfs3treaddirpack, (P)nfs3treaddirunpack, (S)nfs3treaddirsize, (F)nfs3treaddirprint, sizeof(Nfs3TReadDir),
   4032 	(P)nfs3rreaddirpack, (P)nfs3rreaddirunpack, (S)nfs3rreaddirsize, (F)nfs3rreaddirprint, sizeof(Nfs3RReadDir),
   4033 	(P)nfs3treaddirpluspack, (P)nfs3treaddirplusunpack, (S)nfs3treaddirplussize, (F)nfs3treaddirplusprint, sizeof(Nfs3TReadDirPlus),
   4034 	(P)nfs3rreaddirpluspack, (P)nfs3rreaddirplusunpack, (S)nfs3rreaddirplussize, (F)nfs3rreaddirplusprint, sizeof(Nfs3RReadDirPlus),
   4035 	(P)nfs3tfsstatpack, (P)nfs3tfsstatunpack, (S)nfs3tfsstatsize, (F)nfs3tfsstatprint, sizeof(Nfs3TFsStat),
   4036 	(P)nfs3rfsstatpack, (P)nfs3rfsstatunpack, (S)nfs3rfsstatsize, (F)nfs3rfsstatprint, sizeof(Nfs3RFsStat),
   4037 	(P)nfs3tfsinfopack, (P)nfs3tfsinfounpack, (S)nfs3tfsinfosize, (F)nfs3tfsinfoprint, sizeof(Nfs3TFsInfo),
   4038 	(P)nfs3rfsinfopack, (P)nfs3rfsinfounpack, (S)nfs3rfsinfosize, (F)nfs3rfsinfoprint, sizeof(Nfs3RFsInfo),
   4039 	(P)nfs3tpathconfpack, (P)nfs3tpathconfunpack, (S)nfs3tpathconfsize, (F)nfs3tpathconfprint, sizeof(Nfs3TPathconf),
   4040 	(P)nfs3rpathconfpack, (P)nfs3rpathconfunpack, (S)nfs3rpathconfsize, (F)nfs3rpathconfprint, sizeof(Nfs3RPathconf),
   4041 	(P)nfs3tcommitpack, (P)nfs3tcommitunpack, (S)nfs3tcommitsize, (F)nfs3tcommitprint, sizeof(Nfs3TCommit),
   4042 	(P)nfs3rcommitpack, (P)nfs3rcommitunpack, (S)nfs3rcommitsize, (F)nfs3rcommitprint, sizeof(Nfs3RCommit)
   4043 };
   4044 
   4045 SunProg nfs3prog =
   4046 {
   4047 	Nfs3Program,
   4048 	Nfs3Version,
   4049 	proc,
   4050 	nelem(proc),
   4051 };