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