12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement:
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California,
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission.
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-nfs.c,v 1.106.2.4 2007/06/15 23:17:40 guy Exp $ (LBL)";
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h>
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "nfs.h"
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "nfsfh.h"
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h"
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip6.h"
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "rpc_auth.h"
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "rpc_msg.h"
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void nfs_printfh(const u_int32_t *, const u_int);
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void xid_map_enter(const struct sunrpc_msg *, const u_char *);
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int32_t xid_map_find(const struct sunrpc_msg *, const u_char *,
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    u_int32_t *, u_int32_t *);
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void interp_reply(const struct sunrpc_msg *, u_int32_t, u_int32_t, int);
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *parse_post_op_attr(const u_int32_t *, int);
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void print_sattr3(const struct nfsv3_sattr *sa3, int verbose);
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void print_nfsaddr(const u_char *, const char *, const char *);
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Mapping of old NFS Version 2 RPC numbers to generic numbers.
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int32_t nfsv3_procid[NFS_NPROCS] = {
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_NULL,
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_GETATTR,
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_SETATTR,
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_NOOP,
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_LOOKUP,
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_READLINK,
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_READ,
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_NOOP,
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_WRITE,
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_CREATE,
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_REMOVE,
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_RENAME,
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_LINK,
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_SYMLINK,
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_MKDIR,
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_RMDIR,
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_READDIR,
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_FSSTAT,
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_NOOP,
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_NOOP,
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_NOOP,
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_NOOP,
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_NOOP,
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_NOOP,
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_NOOP,
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NFSPROC_NOOP
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * NFS V2 and V3 status values.
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Some of these come from the RFCs for NFS V2 and V3, with the message
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * strings taken from the FreeBSD C library "errlst.c".
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Others are errors that are not in the RFC but that I suspect some
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * NFS servers could return; the values are FreeBSD errno values, as
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the first NFS server was the SunOS 2.0 one, and until 5.0 SunOS
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * was primarily BSD-derived.
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok status2str[] = {
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 1,     "Operation not permitted" },	/* EPERM */
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 2,     "No such file or directory" },	/* ENOENT */
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 5,     "Input/output error" },	/* EIO */
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 6,     "Device not configured" },	/* ENXIO */
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 11,    "Resource deadlock avoided" },	/* EDEADLK */
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 12,    "Cannot allocate memory" },	/* ENOMEM */
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 13,    "Permission denied" },		/* EACCES */
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 17,    "File exists" },		/* EEXIST */
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 18,    "Cross-device link" },		/* EXDEV */
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 19,    "Operation not supported by device" }, /* ENODEV */
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 20,    "Not a directory" },		/* ENOTDIR */
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 21,    "Is a directory" },		/* EISDIR */
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 22,    "Invalid argument" },		/* EINVAL */
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 26,    "Text file busy" },		/* ETXTBSY */
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 27,    "File too large" },		/* EFBIG */
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 28,    "No space left on device" },	/* ENOSPC */
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 30,    "Read-only file system" },	/* EROFS */
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 31,    "Too many links" },		/* EMLINK */
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 45,    "Operation not supported" },	/* EOPNOTSUPP */
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 62,    "Too many levels of symbolic links" }, /* ELOOP */
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 63,    "File name too long" },	/* ENAMETOOLONG */
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 66,    "Directory not empty" },	/* ENOTEMPTY */
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 69,    "Disc quota exceeded" },	/* EDQUOT */
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 70,    "Stale NFS file handle" },	/* ESTALE */
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 71,    "Too many levels of remote in path" }, /* EREMOTE */
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 99,    "Write cache flushed to disk" }, /* NFSERR_WFLUSH (not used) */
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10001, "Illegal NFS file handle" },	/* NFS3ERR_BADHANDLE */
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10002, "Update synchronization mismatch" }, /* NFS3ERR_NOT_SYNC */
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10003, "READDIR/READDIRPLUS cookie is stale" }, /* NFS3ERR_BAD_COOKIE */
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10004, "Operation not supported" },	/* NFS3ERR_NOTSUPP */
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10005, "Buffer or request is too small" }, /* NFS3ERR_TOOSMALL */
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10006, "Unspecified error on server" }, /* NFS3ERR_SERVERFAULT */
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10007, "Object of that type not supported" }, /* NFS3ERR_BADTYPE */
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 10008, "Request couldn't be completed in time" }, /* NFS3ERR_JUKEBOX */
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,     NULL }
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok nfsv3_writemodes[] = {
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		"unstable" },
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 1,		"datasync" },
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 2,		"filesync" },
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL }
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok type2str[] = {
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NFNON,	"NON" },
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NFREG,	"REG" },
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NFDIR,	"DIR" },
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NFBLK,	"BLK" },
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NFCHR,	"CHR" },
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NFLNK,	"LNK" },
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NFFIFO,	"FIFO" },
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL }
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_nfsaddr(const u_char *bp, const char *s, const char *d)
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip *ip;
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip6_hdr *ip6;
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char srcaddr[INET6_ADDRSTRLEN], dstaddr[INET6_ADDRSTRLEN];
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef INET_ADDRSTRLEN
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define INET_ADDRSTRLEN	16
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char srcaddr[INET_ADDRSTRLEN], dstaddr[INET_ADDRSTRLEN];
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	srcaddr[0] = dstaddr[0] = '\0';
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (IP_V((struct ip *)bp)) {
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4:
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip = (struct ip *)bp;
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		strlcpy(srcaddr, ipaddr_string(&ip->ip_src), sizeof(srcaddr));
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		strlcpy(dstaddr, ipaddr_string(&ip->ip_dst), sizeof(dstaddr));
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 6:
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip6 = (struct ip6_hdr *)bp;
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		strlcpy(srcaddr, ip6addr_string(&ip6->ip6_src),
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    sizeof(srcaddr));
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		strlcpy(dstaddr, ip6addr_string(&ip6->ip6_dst),
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    sizeof(dstaddr));
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		strlcpy(srcaddr, "?", sizeof(srcaddr));
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		strlcpy(dstaddr, "?", sizeof(dstaddr));
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("%s.%s > %s.%s: ", srcaddr, s, dstaddr, d);
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparse_sattr3(const u_int32_t *dp, struct nfsv3_sattr *sa3)
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[0]);
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sa3->sa_modeset = EXTRACT_32BITS(dp);
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp++;
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sa3->sa_modeset) {
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(dp[0]);
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sa3->sa_mode = EXTRACT_32BITS(dp);
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp++;
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[0]);
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sa3->sa_uidset = EXTRACT_32BITS(dp);
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp++;
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sa3->sa_uidset) {
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(dp[0]);
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sa3->sa_uid = EXTRACT_32BITS(dp);
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp++;
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[0]);
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sa3->sa_gidset = EXTRACT_32BITS(dp);
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp++;
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sa3->sa_gidset) {
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(dp[0]);
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sa3->sa_gid = EXTRACT_32BITS(dp);
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp++;
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[0]);
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sa3->sa_sizeset = EXTRACT_32BITS(dp);
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp++;
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sa3->sa_sizeset) {
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(dp[0]);
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sa3->sa_size = EXTRACT_32BITS(dp);
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp++;
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[0]);
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sa3->sa_atimetype = EXTRACT_32BITS(dp);
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp++;
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sa3->sa_atimetype == NFSV3SATTRTIME_TOCLIENT) {
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(dp[1]);
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sa3->sa_atime.nfsv3_sec = EXTRACT_32BITS(dp);
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp++;
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sa3->sa_atime.nfsv3_nsec = EXTRACT_32BITS(dp);
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp++;
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[0]);
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sa3->sa_mtimetype = EXTRACT_32BITS(dp);
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp++;
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sa3->sa_mtimetype == NFSV3SATTRTIME_TOCLIENT) {
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(dp[1]);
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sa3->sa_mtime.nfsv3_sec = EXTRACT_32BITS(dp);
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp++;
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sa3->sa_mtime.nfsv3_nsec = EXTRACT_32BITS(dp);
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp++;
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return dp;
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int nfserr;		/* true if we error rather than trunc */
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_sattr3(const struct nfsv3_sattr *sa3, int verbose)
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sa3->sa_modeset)
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" mode %o", sa3->sa_mode);
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sa3->sa_uidset)
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" uid %u", sa3->sa_uid);
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sa3->sa_gidset)
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" gid %u", sa3->sa_gid);
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (verbose > 1) {
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sa3->sa_atimetype == NFSV3SATTRTIME_TOCLIENT)
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" atime %u.%06u", sa3->sa_atime.nfsv3_sec,
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       sa3->sa_atime.nfsv3_nsec);
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (sa3->sa_mtimetype == NFSV3SATTRTIME_TOCLIENT)
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" mtime %u.%06u", sa3->sa_mtime.nfsv3_sec,
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       sa3->sa_mtime.nfsv3_nsec);
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnfsreply_print(register const u_char *bp, u_int length,
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       register const u_char *bp2)
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct sunrpc_msg *rp;
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t proc, vers, reply_stat;
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char srcid[20], dstid[20];	/*fits 32bit*/
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	enum sunrpc_reject_stat rstat;
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t rlow;
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t rhigh;
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	enum sunrpc_auth_stat rwhy;
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	nfserr = 0;		/* assume no error */
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rp = (const struct sunrpc_msg *)bp;
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!nflag) {
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		strlcpy(srcid, "nfs", sizeof(srcid));
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snprintf(dstid, sizeof(dstid), "%u",
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    EXTRACT_32BITS(&rp->rm_xid));
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snprintf(srcid, sizeof(srcid), "%u", NFS_PORT);
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snprintf(dstid, sizeof(dstid), "%u",
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    EXTRACT_32BITS(&rp->rm_xid));
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	print_nfsaddr(bp2, srcid, dstid);
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	reply_stat = EXTRACT_32BITS(&rp->rm_reply.rp_stat);
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (reply_stat) {
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SUNRPC_MSG_ACCEPTED:
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("reply ok %u", length);
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (xid_map_find(rp, bp2, &proc, &vers) >= 0)
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			interp_reply(rp, proc, vers, length);
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SUNRPC_MSG_DENIED:
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("reply ERR %u: ", length);
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		rstat = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_stat);
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (rstat) {
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case SUNRPC_RPC_MISMATCH:
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			rlow = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_vers.low);
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			rhigh = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_vers.high);
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("RPC Version mismatch (%u-%u)",
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    rlow, rhigh);
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case SUNRPC_AUTH_ERROR:
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			rwhy = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_why);
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("Auth ");
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			switch (rwhy) {
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case SUNRPC_AUTH_OK:
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("OK");
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case SUNRPC_AUTH_BADCRED:
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("Bogus Credentials (seal broken)");
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case SUNRPC_AUTH_REJECTEDCRED:
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("Rejected Credentials (client should begin new session)");
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case SUNRPC_AUTH_BADVERF:
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("Bogus Verifier (seal broken)");
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case SUNRPC_AUTH_REJECTEDVERF:
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("Verifier expired or was replayed");
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case SUNRPC_AUTH_TOOWEAK:
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("Credentials are too weak");
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case SUNRPC_AUTH_INVALIDRESP:
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("Bogus response verifier");
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			case SUNRPC_AUTH_FAILED:
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("Unknown failure");
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default:
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("Invalid failure code %u",
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    (unsigned int)rwhy);
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("Unknown reason for rejecting rpc message %u",
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (unsigned int)rstat);
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("reply Unknown rpc response code=%u %u",
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    reply_stat, length);
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Return a pointer to the first file handle in the packet.
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If the packet was truncated, return 0.
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsereq(register const struct sunrpc_msg *rp, register u_int length)
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_int32_t *dp;
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int len;
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * find the start of the req data (if we captured it)
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp = (u_int32_t *)&rp->rm_call.cb_cred;
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[1]);
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	len = EXTRACT_32BITS(&dp[1]);
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (len < length) {
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp += (len + (2 * sizeof(*dp) + 3)) / sizeof(*dp);
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(dp[1]);
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len = EXTRACT_32BITS(&dp[1]);
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (len < length) {
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			dp += (len + (2 * sizeof(*dp) + 3)) / sizeof(*dp);
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(dp[0], 0);
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (dp);
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (NULL);
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print out an NFS file handle and return a pointer to following word.
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If packet was truncated, return 0.
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsefh(register const u_int32_t *dp, int v3)
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int len;
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (v3) {
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(dp[0]);
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len = EXTRACT_32BITS(dp) / 4;
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp++;
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		len = NFSX_V2FH / 4;
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (TTEST2(*dp, len * sizeof(*dp))) {
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nfs_printfh(dp, len);
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (dp + len);
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (NULL);
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print out a file name and return pointer to 32-bit word past it.
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If packet was truncated, return 0.
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsefn(register const u_int32_t *dp)
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_int32_t len;
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_char *cp;
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Bail if we don't have the string length */
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*dp);
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Fetch string length; convert to host order */
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	len = *dp++;
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	NTOHL(len);
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(*dp, ((len + 3) & ~3));
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cp = (u_char *)dp;
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Update 32-bit pointer (NFS filenames padded to 32-bit boundaries) */
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp += ((len + 3) & ~3) / sizeof(*dp);
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	putchar('"');
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (fn_printn(cp, len, snapend)) {
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		putchar('"');
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		goto trunc;
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	putchar('"');
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (dp);
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print out file handle and file name.
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Return pointer to 32-bit word past file name.
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If packet was truncated (or there was some other error), return 0.
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsefhn(register const u_int32_t *dp, int v3)
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp = parsefh(dp, v3);
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (dp == NULL)
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (NULL);
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	putchar(' ');
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (parsefn(dp));
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnfsreq_print(register const u_char *bp, u_int length,
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    register const u_char *bp2)
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct sunrpc_msg *rp;
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_int32_t *dp;
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	nfs_type type;
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int v3;
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t proc;
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct nfsv3_sattr sa3;
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char srcid[20], dstid[20];	/*fits 32bit*/
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	nfserr = 0;		/* assume no error */
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	rp = (const struct sunrpc_msg *)bp;
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!nflag) {
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snprintf(srcid, sizeof(srcid), "%u",
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    EXTRACT_32BITS(&rp->rm_xid));
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		strlcpy(dstid, "nfs", sizeof(dstid));
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snprintf(srcid, sizeof(srcid), "%u",
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    EXTRACT_32BITS(&rp->rm_xid));
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		snprintf(dstid, sizeof(dstid), "%u", NFS_PORT);
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	print_nfsaddr(bp2, srcid, dstid);
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("%d", length);
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	xid_map_enter(rp, bp2);	/* record proc number for later on */
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	v3 = (EXTRACT_32BITS(&rp->rm_call.cb_vers) == NFS_VER3);
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	proc = EXTRACT_32BITS(&rp->rm_call.cb_proc);
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!v3 && proc < NFS_NPROCS)
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		proc =  nfsv3_procid[proc];
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (proc) {
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_NOOP:
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" nop");
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_NULL:
5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" null");
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_GETATTR:
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" getattr");
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    parsefh(dp, v3) != NULL)
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_SETATTR:
5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" setattr");
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    parsefh(dp, v3) != NULL)
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_LOOKUP:
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" lookup");
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    parsefhn(dp, v3) != NULL)
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_ACCESS:
5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" access");
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (dp = parsefh(dp, v3)) != NULL) {
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(dp[0]);
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %04x", EXTRACT_32BITS(&dp[0]));
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_READLINK:
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" readlink");
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    parsefh(dp, v3) != NULL)
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_READ:
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" read");
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (dp = parsefh(dp, v3)) != NULL) {
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (v3) {
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(dp[2]);
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" %u bytes @ %" PRIu64,
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				       EXTRACT_32BITS(&dp[2]),
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				       EXTRACT_64BITS(&dp[0]));
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			} else {
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(dp[1]);
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" %u bytes @ %u",
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    EXTRACT_32BITS(&dp[1]),
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    EXTRACT_32BITS(&dp[0]));
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_WRITE:
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" write");
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (dp = parsefh(dp, v3)) != NULL) {
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (v3) {
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(dp[2]);
5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" %u (%u) bytes @ %" PRIu64,
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						EXTRACT_32BITS(&dp[4]),
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						EXTRACT_32BITS(&dp[2]),
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						EXTRACT_64BITS(&dp[0]));
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (vflag) {
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					dp += 3;
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					TCHECK(dp[0]);
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" <%s>",
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						tok2str(nfsv3_writemodes,
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project							NULL, EXTRACT_32BITS(dp)));
6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			} else {
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(dp[3]);
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" %u (%u) bytes @ %u (%u)",
6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						EXTRACT_32BITS(&dp[3]),
6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						EXTRACT_32BITS(&dp[2]),
6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						EXTRACT_32BITS(&dp[1]),
6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						EXTRACT_32BITS(&dp[0]));
6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_CREATE:
6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" create");
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    parsefhn(dp, v3) != NULL)
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_MKDIR:
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" mkdir");
6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != 0 && parsefhn(dp, v3) != 0)
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_SYMLINK:
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" symlink");
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != 0 &&
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (dp = parsefhn(dp, v3)) != 0) {
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fputs(" ->", stdout);
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (v3 && (dp = parse_sattr3(dp, &sa3)) == 0)
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsefn(dp) == 0)
6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (v3 && vflag)
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				print_sattr3(&sa3, vflag);
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_MKNOD:
6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" mknod");
6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != 0 &&
6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (dp = parsefhn(dp, v3)) != 0) {
6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(*dp);
6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			type = (nfs_type)EXTRACT_32BITS(dp);
6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			dp++;
6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((dp = parse_sattr3(dp, &sa3)) == 0)
6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %s", tok2str(type2str, "unk-ft %d", type));
6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (vflag && (type == NFCHR || type == NFBLK)) {
6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(dp[1]);
6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" %u/%u",
6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				       EXTRACT_32BITS(&dp[0]),
6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				       EXTRACT_32BITS(&dp[1]));
6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				dp += 2;
6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (vflag)
6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				print_sattr3(&sa3, vflag);
6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_REMOVE:
6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" remove");
6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    parsefhn(dp, v3) != NULL)
6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_RMDIR:
6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" rmdir");
6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    parsefhn(dp, v3) != NULL)
6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_RENAME:
6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" rename");
6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (dp = parsefhn(dp, v3)) != NULL) {
6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fputs(" ->", stdout);
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsefhn(dp, v3) != NULL)
6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_LINK:
6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" link");
6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (dp = parsefh(dp, v3)) != NULL) {
6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fputs(" ->", stdout);
7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsefhn(dp, v3) != NULL)
7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_READDIR:
7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" readdir");
7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (dp = parsefh(dp, v3)) != NULL) {
7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (v3) {
7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(dp[4]);
7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/*
7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * We shouldn't really try to interpret the
7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * offset cookie here.
7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 */
7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" %u bytes @ %" PRId64,
7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    EXTRACT_32BITS(&dp[4]),
7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    EXTRACT_64BITS(&dp[0]));
7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (vflag)
7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" verf %08x%08x", dp[2],
7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					       dp[3]);
7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			} else {
7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(dp[1]);
7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/*
7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * Print the offset as signed, since -1 is
7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 * common, but offsets > 2^31 aren't.
7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				 */
7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" %u bytes @ %d",
7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    EXTRACT_32BITS(&dp[1]),
7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    EXTRACT_32BITS(&dp[0]));
7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_READDIRPLUS:
7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" readdirplus");
7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (dp = parsefh(dp, v3)) != NULL) {
7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(dp[4]);
7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * We don't try to interpret the offset
7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * cookie here.
7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %u bytes @ %" PRId64,
7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				EXTRACT_32BITS(&dp[4]),
7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				EXTRACT_64BITS(&dp[0]));
7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (vflag) {
7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(dp[5]);
7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" max %u verf %08x%08x",
7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				       EXTRACT_32BITS(&dp[5]), dp[2], dp[3]);
7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_FSSTAT:
7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" fsstat");
7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    parsefh(dp, v3) != NULL)
7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_FSINFO:
7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" fsinfo");
7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    parsefh(dp, v3) != NULL)
7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_PATHCONF:
7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" pathconf");
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    parsefh(dp, v3) != NULL)
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_COMMIT:
7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" commit");
7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((dp = parsereq(rp, length)) != NULL &&
7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    (dp = parsefh(dp, v3)) != NULL) {
7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(dp[2]);
7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %u bytes @ %" PRIu64,
7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				EXTRACT_32BITS(&dp[2]),
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				EXTRACT_64BITS(&dp[0]));
7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" proc-%u", EXTRACT_32BITS(&rp->rm_call.cb_proc));
7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!nfserr)
7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fputs(" [|nfs]", stdout);
7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print out an NFS file handle.
8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * We assume packet was not truncated before the end of the
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * file handle pointed to by dp.
8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Note: new version (using portable file-handle parser) doesn't produce
8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * generation number.  It probably could be made to do that, with some
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * additional hacking on the parser code.
8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnfs_printfh(register const u_int32_t *dp, const u_int len)
8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	my_fsid fsid;
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ino_t ino;
8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *sfsname = NULL;
8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char *spacep;
8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (uflag) {
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		u_int i;
8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		char const *sep = "";
8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" fh[");
8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (i=0; i<len; i++) {
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("%s%x", sep, dp[i]);
8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sep = ":";
8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("]");
8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	Parse_fh((const u_char *)dp, len, &fsid, &ino, NULL, &sfsname, 0);
8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (sfsname) {
8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* file system ID is ASCII, not numeric, for this server OS */
8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		static char temp[NFSX_V3FHMAX+1];
8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Make sure string is null-terminated */
8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		strncpy(temp, sfsname, NFSX_V3FHMAX);
8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		temp[sizeof(temp) - 1] = '\0';
8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Remove trailing spaces */
8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		spacep = strchr(temp, ' ');
8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (spacep)
8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			*spacep = '\0';
8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" fh %s/", temp);
8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf(" fh %d,%d/",
8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     fsid.Fsid_dev.Major, fsid.Fsid_dev.Minor);
8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if(fsid.Fsid_dev.Minor == 257)
8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Print the undecoded handle */
8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("%s", fsid.Opaque_Handle);
8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("%ld", (long) ino);
8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Maintain a small cache of recent client.XID.server/proc pairs, to allow
8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * us to match up replies with requests and thus to know how to parse
8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the reply.
8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct xid_map_entry {
8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	xid;		/* transaction ID (net order) */
8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int ipver;			/* IP version (4 or 6) */
8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in6_addr	client;		/* client IP address (net order) */
8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in6_addr	server;		/* server IP address (net order) */
8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	client;		/* client IP address (net order) */
8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	server;		/* server IP address (net order) */
8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	proc;		/* call proc number (host order) */
8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	vers;		/* program version (host order) */
8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Map entries are kept in an array that we manage as a ring;
8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * new entries are always added at the tail of the ring.  Initially,
8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * all the entries are zero and hence don't match anything.
8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define	XIDMAPSIZE	64
8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct xid_map_entry xid_map[XIDMAPSIZE];
8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint	xid_map_next = 0;
8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint	xid_map_hint = 0;
8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectxid_map_enter(const struct sunrpc_msg *rp, const u_char *bp)
8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip *ip = NULL;
8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip6_hdr *ip6 = NULL;
8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct xid_map_entry *xmep;
8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (IP_V((struct ip *)bp)) {
8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4:
9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip = (struct ip *)bp;
9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 6:
9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip6 = (struct ip6_hdr *)bp;
9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	xmep = &xid_map[xid_map_next];
9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (++xid_map_next >= XIDMAPSIZE)
9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		xid_map_next = 0;
9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	xmep->xid = rp->rm_xid;
9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ip) {
9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		xmep->ipver = 4;
9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memcpy(&xmep->client, &ip->ip_src, sizeof(ip->ip_src));
9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memcpy(&xmep->server, &ip->ip_dst, sizeof(ip->ip_dst));
9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (ip6) {
9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		xmep->ipver = 6;
9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memcpy(&xmep->client, &ip6->ip6_src, sizeof(ip6->ip6_src));
9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		memcpy(&xmep->server, &ip6->ip6_dst, sizeof(ip6->ip6_dst));
9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	xmep->proc = EXTRACT_32BITS(&rp->rm_call.cb_proc);
9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	xmep->vers = EXTRACT_32BITS(&rp->rm_call.cb_vers);
9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Returns 0 and puts NFSPROC_xxx in proc return and
9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * version in vers return, or returns -1 on failure
9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectxid_map_find(const struct sunrpc_msg *rp, const u_char *bp, u_int32_t *proc,
9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	     u_int32_t *vers)
9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int i;
9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct xid_map_entry *xmep;
9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t xid = rp->rm_xid;
9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip *ip = (struct ip *)bp;
9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ip6_hdr *ip6 = (struct ip6_hdr *)bp;
9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int cmp;
9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Start searching from where we last left off */
9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	i = xid_map_hint;
9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	do {
9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		xmep = &xid_map[i];
9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cmp = 1;
9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (xmep->ipver != IP_V(ip) || xmep->xid != xid)
9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			goto nextitem;
9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (xmep->ipver) {
9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 4:
9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (memcmp(&ip->ip_src, &xmep->server,
9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				   sizeof(ip->ip_src)) != 0 ||
9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    memcmp(&ip->ip_dst, &xmep->client,
9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				   sizeof(ip->ip_dst)) != 0) {
9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				cmp = 0;
9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef INET6
9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 6:
9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (memcmp(&ip6->ip6_src, &xmep->server,
9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				   sizeof(ip6->ip6_src)) != 0 ||
9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    memcmp(&ip6->ip6_dst, &xmep->client,
9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				   sizeof(ip6->ip6_dst)) != 0) {
9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				cmp = 0;
9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			cmp = 0;
9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (cmp) {
9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* match */
9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			xid_map_hint = i;
9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			*proc = xmep->proc;
9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			*vers = xmep->vers;
9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 0;
9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	nextitem:
9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (++i >= XIDMAPSIZE)
9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			i = 0;
9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} while (i != xid_map_hint);
9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* search failed */
9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (-1);
9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Routines for parsing reply packets
9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Return a pointer to the beginning of the actual results.
10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * If the packet was truncated, return 0.
10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparserep(register const struct sunrpc_msg *rp, register u_int length)
10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_int32_t *dp;
10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int len;
10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	enum sunrpc_accept_stat astat;
10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Portability note:
10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Here we find the address of the ar_verf credentials.
10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Originally, this calculation was
10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 *	dp = (u_int32_t *)&rp->rm_reply.rp_acpt.ar_verf
10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * On the wire, the rp_acpt field starts immediately after
10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * the (32 bit) rp_stat field.  However, rp_acpt (which is a
10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * "struct accepted_reply") contains a "struct opaque_auth",
10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * whose internal representation contains a pointer, so on a
10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * 64-bit machine the compiler inserts 32 bits of padding
10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * before rp->rm_reply.rp_acpt.ar_verf.  So, we cannot use
10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * the internal representation to parse the on-the-wire
10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * representation.  Instead, we skip past the rp_stat field,
10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * which is an "enum" and so occupies one 32-bit word.
10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp = ((const u_int32_t *)&rp->rm_reply) + 1;
10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[1]);
10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	len = EXTRACT_32BITS(&dp[1]);
10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (len >= length)
10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (NULL);
10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * skip past the ar_verf credentials.
10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp += (len + (2*sizeof(u_int32_t) + 3)) / sizeof(u_int32_t);
10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(dp[0], 0);
10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * now we can check the ar_stat field
10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	astat = (enum sunrpc_accept_stat) EXTRACT_32BITS(dp);
10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (astat) {
10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SUNRPC_SUCCESS:
10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SUNRPC_PROG_UNAVAIL:
10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" PROG_UNAVAIL");
10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nfserr = 1;		/* suppress trunc string */
10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (NULL);
10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SUNRPC_PROG_MISMATCH:
10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" PROG_MISMATCH");
10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nfserr = 1;		/* suppress trunc string */
10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (NULL);
10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SUNRPC_PROC_UNAVAIL:
10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" PROC_UNAVAIL");
10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nfserr = 1;		/* suppress trunc string */
10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (NULL);
10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SUNRPC_GARBAGE_ARGS:
10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" GARBAGE_ARGS");
10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nfserr = 1;		/* suppress trunc string */
10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (NULL);
10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case SUNRPC_SYSTEM_ERR:
10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" SYSTEM_ERR");
10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nfserr = 1;		/* suppress trunc string */
10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (NULL);
10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" ar_stat %d", astat);
10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nfserr = 1;		/* suppress trunc string */
10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (NULL);
10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* successful return */
10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(*dp, sizeof(astat));
10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return ((u_int32_t *) (sizeof(astat) + ((char *)dp)));
10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsestatus(const u_int32_t *dp, int *er)
10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int errnum;
10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[0]);
10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	errnum = EXTRACT_32BITS(&dp[0]);
10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (er)
10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		*er = errnum;
10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (errnum != 0) {
10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!qflag)
10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" ERROR: %s",
10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    tok2str(status2str, "unk %d", errnum));
10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		nfserr = 1;
10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (dp + 1);
11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsefattr(const u_int32_t *dp, int verbose, int v3)
11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct nfs_fattr *fap;
11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	fap = (const struct nfs_fattr *)dp;
11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(fap->fa_gid);
11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (verbose) {
11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" %s %o ids %d/%d",
11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    tok2str(type2str, "unk-ft %d ",
11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    EXTRACT_32BITS(&fap->fa_type)),
11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    EXTRACT_32BITS(&fap->fa_mode),
11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    EXTRACT_32BITS(&fap->fa_uid),
11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    EXTRACT_32BITS(&fap->fa_gid));
11182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
11192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(fap->fa3_size);
11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" sz %" PRIu64,
11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				EXTRACT_64BITS((u_int32_t *)&fap->fa3_size));
11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(fap->fa2_size);
11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" sz %d", EXTRACT_32BITS(&fap->fa2_size));
11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* print lots more stuff */
11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (verbose > 1) {
11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(fap->fa3_ctime);
11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" nlink %d rdev %d/%d",
11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa_nlink),
11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa3_rdev.specdata1),
11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa3_rdev.specdata2));
11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" fsid %" PRIx64,
11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				EXTRACT_64BITS((u_int32_t *)&fap->fa3_fsid));
11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" fileid %" PRIx64,
11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				EXTRACT_64BITS((u_int32_t *)&fap->fa3_fileid));
11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" a/m/ctime %u.%06u",
11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa3_atime.nfsv3_sec),
11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa3_atime.nfsv3_nsec));
11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %u.%06u",
11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa3_mtime.nfsv3_sec),
11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa3_mtime.nfsv3_nsec));
11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %u.%06u",
11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa3_ctime.nfsv3_sec),
11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa3_ctime.nfsv3_nsec));
11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK(fap->fa2_ctime);
11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" nlink %d rdev %x fsid %x nodeid %x a/m/ctime",
11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa_nlink),
11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa2_rdev),
11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa2_fsid),
11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa2_fileid));
11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %u.%06u",
11562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa2_atime.nfsv2_sec),
11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa2_atime.nfsv2_usec));
11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %u.%06u",
11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa2_mtime.nfsv2_sec),
11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa2_mtime.nfsv2_usec));
11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" %u.%06u",
11622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa2_ctime.nfsv2_sec),
11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&fap->fa2_ctime.nfsv2_usec));
11642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
11652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return ((const u_int32_t *)((unsigned char *)dp +
11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(v3 ? NFSX_V3FATTR : NFSX_V2FATTR)));
11682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (NULL);
11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparseattrstat(const u_int32_t *dp, int verbose, int v3)
11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int er;
11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp = parsestatus(dp, &er);
11782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (dp == NULL)
11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (er)
11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (parsefattr(dp, verbose, v3) != NULL);
11842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsediropres(const u_int32_t *dp)
11882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int er;
11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!(dp = parsestatus(dp, &er)))
11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (er)
11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp = parsefh(dp, 0);
11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (dp == NULL)
11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (parsefattr(dp, vflag, 0) != NULL);
12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparselinkres(const u_int32_t *dp, int v3)
12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int er;
12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp = parsestatus(dp, &er);
12092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (dp == NULL)
12102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return(0);
12112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (er)
12122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return(1);
12132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (v3 && !(dp = parse_post_op_attr(dp, vflag)))
12142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
12152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	putchar(' ');
12162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (parsefn(dp) != NULL);
12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
12202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsestatfs(const u_int32_t *dp, int v3)
12212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct nfs_statfs *sfsp;
12232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int er;
12242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp = parsestatus(dp, &er);
12262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (dp == NULL)
12272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
12282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!v3 && er)
12292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
12302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (qflag)
12322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return(1);
12332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (v3) {
12352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag)
12362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" POST:");
12372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parse_post_op_attr(dp, vflag)))
12382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (0);
12392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(*dp, (v3 ? NFSX_V3STATFS : NFSX_V2STATFS));
12422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sfsp = (const struct nfs_statfs *)dp;
12442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (v3) {
12462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" tbytes %" PRIu64 " fbytes %" PRIu64 " abytes %" PRIu64,
12472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_64BITS((u_int32_t *)&sfsp->sf_tbytes),
12482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_64BITS((u_int32_t *)&sfsp->sf_fbytes),
12492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_64BITS((u_int32_t *)&sfsp->sf_abytes));
12502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
12512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" tfiles %" PRIu64 " ffiles %" PRIu64 " afiles %" PRIu64 " invar %u",
12522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_64BITS((u_int32_t *)&sfsp->sf_tfiles),
12532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_64BITS((u_int32_t *)&sfsp->sf_ffiles),
12542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_64BITS((u_int32_t *)&sfsp->sf_afiles),
12552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       EXTRACT_32BITS(&sfsp->sf_invarsec));
12562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
12582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" tsize %d bsize %d blocks %d bfree %d bavail %d",
12592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&sfsp->sf_tsize),
12602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&sfsp->sf_bsize),
12612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&sfsp->sf_blocks),
12622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&sfsp->sf_bfree),
12632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			EXTRACT_32BITS(&sfsp->sf_bavail));
12642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
12652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
12672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
12682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
12692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
12722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparserddires(const u_int32_t *dp)
12732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int er;
12752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp = parsestatus(dp, &er);
12772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (dp == NULL)
12782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
12792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (er)
12802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
12812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (qflag)
12822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
12832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[2]);
12852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" offset %x size %d ",
12862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&dp[0]), EXTRACT_32BITS(&dp[1]));
12872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (dp[2] != 0)
12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" eof");
12892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
12912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
12922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
12932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
12962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparse_wcc_attr(const u_int32_t *dp)
12972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" sz %" PRIu64, EXTRACT_64BITS(&dp[0]));
12992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" mtime %u.%06u ctime %u.%06u",
13002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&dp[2]), EXTRACT_32BITS(&dp[3]),
13012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&dp[4]), EXTRACT_32BITS(&dp[5]));
13022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (dp + 6);
13032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
13062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Pre operation attributes. Print only if vflag > 1.
13072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
13082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
13092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparse_pre_op_attr(const u_int32_t *dp, int verbose)
13102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[0]);
13122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!EXTRACT_32BITS(&dp[0]))
13132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (dp + 1);
13142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp++;
13152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(*dp, 24);
13162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (verbose > 1) {
13172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return parse_wcc_attr(dp);
13182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
13192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* If not verbose enough, just skip over wcc_attr */
13202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (dp + 6);
13212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
13232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (NULL);
13242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
13272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Post operation attributes are printed if vflag >= 1
13282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
13292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
13302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparse_post_op_attr(const u_int32_t *dp, int verbose)
13312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(dp[0]);
13332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!EXTRACT_32BITS(&dp[0]))
13342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (dp + 1);
13352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dp++;
13362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (verbose) {
13372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return parsefattr(dp, verbose, 1);
13382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else
13392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (dp + (NFSX_V3FATTR / sizeof (u_int32_t)));
13402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
13412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (NULL);
13422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
13452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparse_wcc_data(const u_int32_t *dp, int verbose)
13462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (verbose > 1)
13482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" PRE:");
13492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!(dp = parse_pre_op_attr(dp, verbose)))
13502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
13512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (verbose)
13532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" POST:");
13542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return parse_post_op_attr(dp, verbose);
13552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
13582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsecreateopres(const u_int32_t *dp, int verbose)
13592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int er;
13612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!(dp = parsestatus(dp, &er)))
13632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
13642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (er)
13652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp = parse_wcc_data(dp, verbose);
13662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else {
13672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(dp[0]);
13682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!EXTRACT_32BITS(&dp[0]))
13692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (dp + 1);
13702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp++;
13712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parsefh(dp, 1)))
13722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (0);
13732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (verbose) {
13742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!(dp = parse_post_op_attr(dp, verbose)))
13752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return (0);
13762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (vflag > 1) {
13772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" dir attr:");
13782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				dp = parse_wcc_data(dp, verbose);
13792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
13802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
13812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (dp);
13832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
13842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (NULL);
13852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
13882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsewccres(const u_int32_t *dp, int verbose)
13892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int er;
13912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!(dp = parsestatus(dp, &er)))
13932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
13942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return parse_wcc_data(dp, verbose) != 0;
13952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const u_int32_t *
13982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsev3rddirres(const u_int32_t *dp, int verbose)
13992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
14002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int er;
14012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!(dp = parsestatus(dp, &er)))
14032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
14042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag)
14052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" POST:");
14062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!(dp = parse_post_op_attr(dp, verbose)))
14072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
14082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (er)
14092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return dp;
14102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag) {
14112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		TCHECK(dp[1]);
14122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" verf %08x%08x", dp[0], dp[1]);
14132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp += 2;
14142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return dp;
14162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
14172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (NULL);
14182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
14192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
14212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsefsinfo(const u_int32_t *dp)
14222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
14232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct nfsv3_fsinfo *sfp;
14242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int er;
14252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!(dp = parsestatus(dp, &er)))
14272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
14282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag)
14292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" POST:");
14302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!(dp = parse_post_op_attr(dp, vflag)))
14312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
14322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (er)
14332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
14342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sfp = (struct nfsv3_fsinfo *)dp;
14362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*sfp);
14372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" rtmax %u rtpref %u wtmax %u wtpref %u dtpref %u",
14382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&sfp->fs_rtmax),
14392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&sfp->fs_rtpref),
14402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&sfp->fs_wtmax),
14412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&sfp->fs_wtpref),
14422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&sfp->fs_dtpref));
14432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag) {
14442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" rtmult %u wtmult %u maxfsz %" PRIu64,
14452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&sfp->fs_rtmult),
14462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&sfp->fs_wtmult),
14472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_64BITS((u_int32_t *)&sfp->fs_maxfilesize));
14482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" delta %u.%06u ",
14492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&sfp->fs_timedelta.nfsv3_sec),
14502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&sfp->fs_timedelta.nfsv3_nsec));
14512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
14532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
14542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
14552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
14562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
14582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectparsepathconf(const u_int32_t *dp)
14592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
14602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int er;
14612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct nfsv3_pathconf *spp;
14622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!(dp = parsestatus(dp, &er)))
14642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
14652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag)
14662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" POST:");
14672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!(dp = parse_post_op_attr(dp, vflag)))
14682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (0);
14692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (er)
14702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
14712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	spp = (struct nfsv3_pathconf *)dp;
14732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK(*spp);
14742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	printf(" linkmax %u namemax %u %s %s %s %s",
14762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&spp->pc_linkmax),
14772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&spp->pc_namemax),
14782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&spp->pc_notrunc) ? "notrunc" : "",
14792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&spp->pc_chownrestricted) ? "chownres" : "",
14802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&spp->pc_caseinsensitive) ? "igncase" : "",
14812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&spp->pc_casepreserving) ? "keepcase" : "");
14822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
14832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
14842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
14852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
14862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
14882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinterp_reply(const struct sunrpc_msg *rp, u_int32_t proc, u_int32_t vers, int length)
14892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
14902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const u_int32_t *dp;
14912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int v3;
14922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int er;
14932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	v3 = (vers == NFS_VER3);
14952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!v3 && proc < NFS_NPROCS)
14972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		proc = nfsv3_procid[proc];
14982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (proc) {
15002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_NOOP:
15022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" nop");
15032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
15042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_NULL:
15062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" null");
15072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
15082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_GETATTR:
15102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" getattr");
15112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp = parserep(rp, length);
15122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dp != NULL && parseattrstat(dp, !qflag, v3) != 0)
15132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
15142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
15152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_SETATTR:
15172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" setattr");
15182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
15192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
15202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
15212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsewccres(dp, vflag))
15222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
15232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
15242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parseattrstat(dp, !qflag, 0) != 0)
15252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
15262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
15272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
15282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_LOOKUP:
15302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" lookup");
15312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
15322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
15332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
15342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!(dp = parsestatus(dp, &er)))
15352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
15362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (er) {
15372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (vflag > 1) {
15382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" post dattr:");
15392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					dp = parse_post_op_attr(dp, vflag);
15402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
15412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			} else {
15422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (!(dp = parsefh(dp, v3)))
15432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					break;
15442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if ((dp = parse_post_op_attr(dp, vflag)) &&
15452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    vflag > 1) {
15462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" post dattr:");
15472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					dp = parse_post_op_attr(dp, vflag);
15482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
15492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
15502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (dp)
15512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
15522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
15532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsediropres(dp) != 0)
15542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
15552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
15562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
15572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_ACCESS:
15592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" access");
15602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
15612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
15622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parsestatus(dp, &er)))
15632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
15642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag)
15652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" attr:");
15662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parse_post_op_attr(dp, vflag)))
15672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
15682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!er)
15692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(" c %04x", EXTRACT_32BITS(&dp[0]));
15702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
15712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_READLINK:
15732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" readlink");
15742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp = parserep(rp, length);
15752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dp != NULL && parselinkres(dp, v3) != 0)
15762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
15772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
15782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_READ:
15802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" read");
15812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
15822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
15832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
15842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!(dp = parsestatus(dp, &er)))
15852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
15862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!(dp = parse_post_op_attr(dp, vflag)))
15872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
15882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (er)
15892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
15902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (vflag) {
15912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(dp[1]);
15922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" %u bytes", EXTRACT_32BITS(&dp[0]));
15932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (EXTRACT_32BITS(&dp[1]))
15942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" EOF");
15952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
15962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
15972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
15982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parseattrstat(dp, vflag, 0) != 0)
15992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
16012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
16022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_WRITE:
16042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" write");
16052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
16062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
16072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
16082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!(dp = parsestatus(dp, &er)))
16092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
16102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!(dp = parse_wcc_data(dp, vflag)))
16112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
16122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (er)
16132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (vflag) {
16152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				TCHECK(dp[0]);
16162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" %u bytes", EXTRACT_32BITS(&dp[0]));
16172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (vflag > 1) {
16182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					TCHECK(dp[1]);
16192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf(" <%s>",
16202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						tok2str(nfsv3_writemodes,
16212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project							NULL, EXTRACT_32BITS(&dp[1])));
16222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
16232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
16252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
16262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parseattrstat(dp, vflag, v3) != 0)
16272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
16292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
16302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_CREATE:
16322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" create");
16332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
16342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
16352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
16362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsecreateopres(dp, vflag) != 0)
16372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
16392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsediropres(dp) != 0)
16402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
16422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
16432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_MKDIR:
16452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" mkdir");
16462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
16472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
16482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
16492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsecreateopres(dp, vflag) != 0)
16502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
16522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsediropres(dp) != 0)
16532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
16552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
16562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_SYMLINK:
16582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" symlink");
16592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
16602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
16612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
16622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsecreateopres(dp, vflag) != 0)
16632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
16652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsestatus(dp, &er) != 0)
16662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
16682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
16692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_MKNOD:
16712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" mknod");
16722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
16732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
16742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (parsecreateopres(dp, vflag) != 0)
16752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
16762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
16772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_REMOVE:
16792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" remove");
16802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
16812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
16822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
16832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsewccres(dp, vflag))
16842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
16862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsestatus(dp, &er) != 0)
16872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
16892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
16902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_RMDIR:
16922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" rmdir");
16932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
16942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
16952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
16962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsewccres(dp, vflag))
16972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
16982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
16992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsestatus(dp, &er) != 0)
17002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
17012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
17022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
17032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_RENAME:
17052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" rename");
17062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
17072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
17082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
17092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!(dp = parsestatus(dp, &er)))
17102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
17112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (vflag) {
17122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" from:");
17132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (!(dp = parse_wcc_data(dp, vflag)))
17142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					break;
17152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" to:");
17162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (!(dp = parse_wcc_data(dp, vflag)))
17172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					break;
17182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
17192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
17202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
17212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsestatus(dp, &er) != 0)
17222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
17232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
17242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
17252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_LINK:
17272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" link");
17282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
17292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
17302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
17312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!(dp = parsestatus(dp, &er)))
17322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
17332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (vflag) {
17342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" file POST:");
17352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (!(dp = parse_post_op_attr(dp, vflag)))
17362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					break;
17372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" dir:");
17382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (!(dp = parse_wcc_data(dp, vflag)))
17392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					break;
17402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
17412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
17422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
17432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsestatus(dp, &er) != 0)
17442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
17452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
17462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
17472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_READDIR:
17492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" readdir");
17502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
17512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
17522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (v3) {
17532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parsev3rddirres(dp, vflag))
17542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
17552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
17562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (parserddires(dp) != 0)
17572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return;
17582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
17592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
17602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_READDIRPLUS:
17622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" readdirplus");
17632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!(dp = parserep(rp, length)))
17642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
17652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (parsev3rddirres(dp, vflag))
17662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
17672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
17682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_FSSTAT:
17702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" fsstat");
17712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp = parserep(rp, length);
17722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dp != NULL && parsestatfs(dp, v3) != 0)
17732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
17742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
17752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_FSINFO:
17772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" fsinfo");
17782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp = parserep(rp, length);
17792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dp != NULL && parsefsinfo(dp) != 0)
17802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
17812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
17822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_PATHCONF:
17842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" pathconf");
17852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp = parserep(rp, length);
17862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dp != NULL && parsepathconf(dp) != 0)
17872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
17882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
17892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case NFSPROC_COMMIT:
17912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" commit");
17922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dp = parserep(rp, length);
17932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dp != NULL && parsewccres(dp, vflag) != 0)
17942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return;
17952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
17962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default:
17982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" proc-%u", proc);
17992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
18002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
18012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
18022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!nfserr)
18032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fputs(" [|nfs]", stdout);
18042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1805