summaryrefslogtreecommitdiffstats
path: root/contrib/tcpdump/print-nfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tcpdump/print-nfs.c')
-rw-r--r--contrib/tcpdump/print-nfs.c815
1 files changed, 495 insertions, 320 deletions
diff --git a/contrib/tcpdump/print-nfs.c b/contrib/tcpdump/print-nfs.c
index bfaf438..289535e 100644
--- a/contrib/tcpdump/print-nfs.c
+++ b/contrib/tcpdump/print-nfs.c
@@ -17,24 +17,27 @@
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $FreeBSD$
*/
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: print-nfs.c,v 1.65 97/08/17 13:24:22 leres Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-nfs.c,v 1.87 2000/10/07 05:53:12 itojun Exp $ (LBL)";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
#endif
#include <sys/param.h>
#include <sys/time.h>
#include <sys/socket.h>
-#include <net/if.h>
+struct mbuf;
+struct rtentry;
#include <netinet/in.h>
-#include <net/ethernet.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/ip_var.h>
#include <rpc/rpc.h>
@@ -45,19 +48,24 @@ static const char rcsid[] =
#include "interface.h"
#include "addrtoname.h"
-#include "extract.h" /* must come after interface.h */
#include "nfs.h"
#include "nfsfh.h"
-static void nfs_printfh(const u_int32_t *, const int);
-static void xid_map_enter(const struct rpc_msg *, const struct ip *);
-static int32_t xid_map_find(const struct rpc_msg *, const struct ip *, u_int32_t *,
- u_int32_t *);
+#include "ip.h"
+#ifdef INET6
+#include "ip6.h"
+#endif
+
+static void nfs_printfh(const u_int32_t *, const u_int);
+static void xid_map_enter(const struct rpc_msg *, const u_char *);
+static int32_t xid_map_find(const struct rpc_msg *, const u_char *,
+ u_int32_t *, u_int32_t *);
static void interp_reply(const struct rpc_msg *, u_int32_t, u_int32_t, int);
static const u_int32_t *parse_post_op_attr(const u_int32_t *, int);
-
-static int nfserr; /* true if we error rather than trunc */
+static void print_sattr3(const struct nfsv3_sattr *sa3, int verbose);
+static int print_int64(const u_int32_t *dp, int how);
+static void print_nfsaddr(const u_char *, const char *, const char *);
/*
* Mapping of old NFS Version 2 RPC numbers to generic numbers.
@@ -91,10 +99,60 @@ u_int32_t nfsv3_procid[NFS_NPROCS] = {
NFSPROC_NOOP
};
-const char *nfsv3_writemodes[NFSV3WRITE_NMODES] = {
- "unstable",
- "datasync",
- "filesync"
+/*
+ * NFS V2 and V3 status values.
+ *
+ * Some of these come from the RFCs for NFS V2 and V3, with the message
+ * strings taken from the FreeBSD C library "errlst.c".
+ *
+ * Others are errors that are not in the RFC but that I suspect some
+ * NFS servers could return; the values are FreeBSD errno values, as
+ * the first NFS server was the SunOS 2.0 one, and until 5.0 SunOS
+ * was primarily BSD-derived.
+ */
+static struct tok status2str[] = {
+ { 1, "Operation not permitted" }, /* EPERM */
+ { 2, "No such file or directory" }, /* ENOENT */
+ { 5, "Input/output error" }, /* EIO */
+ { 6, "Device not configured" }, /* ENXIO */
+ { 11, "Resource deadlock avoided" }, /* EDEADLK */
+ { 12, "Cannot allocate memory" }, /* ENOMEM */
+ { 13, "Permission denied" }, /* EACCES */
+ { 17, "File exists" }, /* EEXIST */
+ { 18, "Cross-device link" }, /* EXDEV */
+ { 19, "Operation not supported by device" }, /* ENODEV */
+ { 20, "Not a directory" }, /* ENOTDIR */
+ { 21, "Is a directory" }, /* EISDIR */
+ { 22, "Invalid argument" }, /* EINVAL */
+ { 26, "Text file busy" }, /* ETXTBSY */
+ { 27, "File too large" }, /* EFBIG */
+ { 28, "No space left on device" }, /* ENOSPC */
+ { 30, "Read-only file system" }, /* EROFS */
+ { 31, "Too many links" }, /* EMLINK */
+ { 45, "Operation not supported" }, /* EOPNOTSUPP */
+ { 62, "Too many levels of symbolic links" }, /* ELOOP */
+ { 63, "File name too long" }, /* ENAMETOOLONG */
+ { 66, "Directory not empty" }, /* ENOTEMPTY */
+ { 69, "Disc quota exceeded" }, /* EDQUOT */
+ { 70, "Stale NFS file handle" }, /* ESTALE */
+ { 71, "Too many levels of remote in path" }, /* EREMOTE */
+ { 99, "Write cache flushed to disk" }, /* NFSERR_WFLUSH (not used) */
+ { 10001, "Illegal NFS file handle" }, /* NFS3ERR_BADHANDLE */
+ { 10002, "Update synchronization mismatch" }, /* NFS3ERR_NOT_SYNC */
+ { 10003, "READDIR/READDIRPLUS cookie is stale" }, /* NFS3ERR_BAD_COOKIE */
+ { 10004, "Operation not supported" }, /* NFS3ERR_NOTSUPP */
+ { 10005, "Buffer or request is too small" }, /* NFS3ERR_TOOSMALL */
+ { 10006, "Unspecified error on server" }, /* NFS3ERR_SERVERFAULT */
+ { 10007, "Object of that type not supported" }, /* NFS3ERR_BADTYPE */
+ { 10008, "Request couldn't be completed in time" }, /* NFS3ERR_JUKEBOX */
+ { 0, NULL }
+};
+
+static struct tok nfsv3_writemodes[] = {
+ { 0, "unstable" },
+ { 1, "datasync" },
+ { 2, "filesync" },
+ { 0, NULL }
};
static struct tok type2str[] = {
@@ -121,11 +179,7 @@ static struct tok type2str[] = {
#define SIGNED 1
#define HEX 2
-#define INT64_FORMAT "%qd"
-#define U_INT64_FORMAT "%qu"
-#define HEX_INT64_FORMAT "%qx"
-
-int print_int64(const u_int32_t *dp, int how)
+static int print_int64(const u_int32_t *dp, int how)
{
#ifdef INT64_FORMAT
u_int64_t res;
@@ -145,77 +199,108 @@ int print_int64(const u_int32_t *dp, int how)
return (0);
}
#else
- /*
- * XXX - throw upper 32 bits away.
- * Could also go for hex: printf("0x%x%x", dp[0], dp[1]);
- */
- if (how == SIGNED)
- printf("%ld", (int)dp[1]);
- else
- printf("%lu", (unsigned int)dp[1]);
+ switch (how) {
+ case SIGNED:
+ case UNSIGNED:
+ case HEX:
+ printf("0x%x%08x", (u_int32_t)ntohl(dp[0]),
+ (u_int32_t)ntohl(dp[1]));
+ break;
+ default:
+ return (0);
+ }
#endif
return 1;
}
+static void
+print_nfsaddr(const u_char *bp, const char *s, const char *d)
+{
+ struct ip *ip;
+#ifdef INET6
+ struct ip6_hdr *ip6;
+ char srcaddr[INET6_ADDRSTRLEN], dstaddr[INET6_ADDRSTRLEN];
+#else
+#ifndef INET_ADDRSTRLEN
+#define INET_ADDRSTRLEN 16
+#endif
+ char srcaddr[INET_ADDRSTRLEN], dstaddr[INET_ADDRSTRLEN];
+#endif
+
+ srcaddr[0] = dstaddr[0] = '\0';
+ switch (IP_V((struct ip *)bp)) {
+ case 4:
+ ip = (struct ip *)bp;
+ strlcpy(srcaddr, ipaddr_string(&ip->ip_src), sizeof(srcaddr));
+ strlcpy(dstaddr, ipaddr_string(&ip->ip_dst), sizeof(dstaddr));
+ break;
+#ifdef INET6
+ case 6:
+ ip6 = (struct ip6_hdr *)bp;
+ strlcpy(srcaddr, ip6addr_string(&ip6->ip6_src),
+ sizeof(srcaddr));
+ strlcpy(dstaddr, ip6addr_string(&ip6->ip6_dst),
+ sizeof(dstaddr));
+ break;
+#endif
+ default:
+ strlcpy(srcaddr, "?", sizeof(srcaddr));
+ strlcpy(dstaddr, "?", sizeof(dstaddr));
+ break;
+ }
+
+ (void)printf("%s.%s > %s.%s: ", srcaddr, s, dstaddr, d);
+}
+
static const u_int32_t *
parse_sattr3(const u_int32_t *dp, struct nfsv3_sattr *sa3)
{
- register const u_int32_t *ep = (u_int32_t *)snapend;
-
- if (dp + 1 > ep)
- return (NULL);
+ TCHECK(dp[0]);
if ((sa3->sa_modeset = ntohl(*dp++))) {
- if (dp + 1 > ep)
- return (NULL);
+ TCHECK(dp[0]);
sa3->sa_mode = ntohl(*dp++);
}
- if (dp + 1 > ep)
- return (NULL);
+ TCHECK(dp[0]);
if ((sa3->sa_uidset = ntohl(*dp++))) {
- if (dp + 1 > ep)
- return (NULL);
+ TCHECK(dp[0]);
sa3->sa_uid = ntohl(*dp++);
}
- if (dp + 1 > ep)
- return (NULL);
+ TCHECK(dp[0]);
if ((sa3->sa_gidset = ntohl(*dp++))) {
- if (dp + 1 > ep)
- return (NULL);
+ TCHECK(dp[0]);
sa3->sa_gid = ntohl(*dp++);
}
- if (dp + 1 > ep)
- return (NULL);
+ TCHECK(dp[0]);
if ((sa3->sa_sizeset = ntohl(*dp++))) {
- if (dp + 1 > ep)
- return (NULL);
+ TCHECK(dp[0]);
sa3->sa_size = ntohl(*dp++);
}
- if (dp + 1 > ep)
- return (NULL);
+ TCHECK(dp[0]);
if ((sa3->sa_atimetype = ntohl(*dp++)) == NFSV3SATTRTIME_TOCLIENT) {
- if (dp + 2 > ep)
- return (NULL);
+ TCHECK(dp[1]);
sa3->sa_atime.nfsv3_sec = ntohl(*dp++);
sa3->sa_atime.nfsv3_nsec = ntohl(*dp++);
}
- if (dp + 1 > ep)
- return (NULL);
+ TCHECK(dp[0]);
if ((sa3->sa_mtimetype = ntohl(*dp++)) == NFSV3SATTRTIME_TOCLIENT) {
- if (dp + 2 > ep)
- return (NULL);
+ TCHECK(dp[1]);
sa3->sa_mtime.nfsv3_sec = ntohl(*dp++);
sa3->sa_mtime.nfsv3_nsec = ntohl(*dp++);
}
return dp;
+trunc:
+ return NULL;
}
-void
+static int nfserr; /* true if we error rather than trunc */
+
+static void
print_sattr3(const struct nfsv3_sattr *sa3, int verbose)
{
if (sa3->sa_modeset)
@@ -239,41 +324,37 @@ nfsreply_print(register const u_char *bp, u_int length,
register const u_char *bp2)
{
register const struct rpc_msg *rp;
- register const struct ip *ip;
u_int32_t proc, vers;
+ char srcid[20], dstid[20]; /*fits 32bit*/
nfserr = 0; /* assume no error */
rp = (const struct rpc_msg *)bp;
- ip = (const struct ip *)bp2;
-
- if (!nflag)
- (void)printf("%s.nfs > %s.%u: reply %s %d",
- ipaddr_string(&ip->ip_src),
- ipaddr_string(&ip->ip_dst),
- (u_int32_t)ntohl(rp->rm_xid),
- ntohl(rp->rm_reply.rp_stat) == MSG_ACCEPTED?
- "ok":"ERR",
- length);
- else
- (void)printf("%s.%u > %s.%u: reply %s %d",
- ipaddr_string(&ip->ip_src),
- NFS_PORT,
- ipaddr_string(&ip->ip_dst),
- (u_int32_t)ntohl(rp->rm_xid),
- ntohl(rp->rm_reply.rp_stat) == MSG_ACCEPTED?
- "ok":"ERR",
+
+ if (!nflag) {
+ strlcpy(srcid, "nfs", sizeof(srcid));
+ snprintf(dstid, sizeof(dstid), "%u",
+ (u_int32_t)ntohl(rp->rm_xid));
+ } else {
+ snprintf(srcid, sizeof(srcid), "%u", NFS_PORT);
+ snprintf(dstid, sizeof(dstid), "%u",
+ (u_int32_t)ntohl(rp->rm_xid));
+ }
+ print_nfsaddr(bp2, srcid, dstid);
+ (void)printf("reply %s %d",
+ ntohl(rp->rm_reply.rp_stat) == MSG_ACCEPTED?
+ "ok":"ERR",
length);
- if (xid_map_find(rp, ip, &proc, &vers) >= 0)
+ if (xid_map_find(rp, bp2, &proc, &vers) >= 0)
interp_reply(rp, proc, vers, length);
}
/*
* Return a pointer to the first file handle in the packet.
- * If the packet was truncated, return NULL.
+ * If the packet was truncated, return 0.
*/
static const u_int32_t *
-parsereq(register const struct rpc_msg *rp, register int length)
+parsereq(register const struct rpc_msg *rp, register u_int length)
{
register const u_int32_t *dp;
register u_int len;
@@ -300,7 +381,7 @@ trunc:
/*
* Print out an NFS file handle and return a pointer to following word.
- * If packet was truncated, return NULL.
+ * If packet was truncated, return 0.
*/
static const u_int32_t *
parsefh(register const u_int32_t *dp, int v3)
@@ -324,7 +405,7 @@ trunc:
/*
* Print out a file name and return pointer to 32-bit word past it.
- * If packet was truncated, return NULL.
+ * If packet was truncated, return 0.
*/
static const u_int32_t *
parsefn(register const u_int32_t *dp)
@@ -333,30 +414,31 @@ parsefn(register const u_int32_t *dp)
register const u_char *cp;
/* Bail if we don't have the string length */
- if ((u_char *)dp > snapend - sizeof(*dp))
- return (NULL);
+ TCHECK(*dp);
/* Fetch string length; convert to host order */
len = *dp++;
NTOHL(len);
+ TCHECK2(*dp, ((len + 3) & ~3));
+
cp = (u_char *)dp;
/* Update 32-bit pointer (NFS filenames padded to 32-bit boundaries) */
dp += ((len + 3) & ~3) / sizeof(*dp);
- if ((u_char *)dp > snapend)
- return (NULL);
/* XXX seems like we should be checking the length */
putchar('"');
(void) fn_printn(cp, len, NULL);
putchar('"');
return (dp);
+trunc:
+ return NULL;
}
/*
* Print out file handle and file name.
* Return pointer to 32-bit word past file name.
- * If packet was truncated (or there was some other error), return NULL.
+ * If packet was truncated (or there was some other error), return 0.
*/
static const u_int32_t *
parsefhn(register const u_int32_t *dp, int v3)
@@ -373,30 +455,28 @@ nfsreq_print(register const u_char *bp, u_int length,
register const u_char *bp2)
{
register const struct rpc_msg *rp;
- register const struct ip *ip;
register const u_int32_t *dp;
- nfstype type;
- int proc, v3;
+ nfs_type type;
+ int v3;
+ u_int32_t proc;
struct nfsv3_sattr sa3;
+ char srcid[20], dstid[20]; /*fits 32bit*/
nfserr = 0; /* assume no error */
rp = (const struct rpc_msg *)bp;
- ip = (const struct ip *)bp2;
- if (!nflag)
- (void)printf("%s.%u > %s.nfs: %d",
- ipaddr_string(&ip->ip_src),
- (u_int32_t)ntohl(rp->rm_xid),
- ipaddr_string(&ip->ip_dst),
- length);
- else
- (void)printf("%s.%u > %s.%u: %d",
- ipaddr_string(&ip->ip_src),
- (u_int32_t)ntohl(rp->rm_xid),
- ipaddr_string(&ip->ip_dst),
- NFS_PORT,
- length);
+ if (!nflag) {
+ snprintf(srcid, sizeof(srcid), "%u",
+ (u_int32_t)ntohl(rp->rm_xid));
+ strlcpy(dstid, "nfs", sizeof(dstid));
+ } else {
+ snprintf(srcid, sizeof(srcid), "%u",
+ (u_int32_t)ntohl(rp->rm_xid));
+ snprintf(dstid, sizeof(dstid), "%u", NFS_PORT);
+ }
+ print_nfsaddr(bp2, srcid, dstid);
+ (void)printf("%d", length);
- xid_map_enter(rp, ip); /* record proc number for later on */
+ xid_map_enter(rp, bp2); /* record proc number for later on */
v3 = (ntohl(rp->rm_call.cb_vers) == NFS_VER3);
proc = ntohl(rp->rm_call.cb_proc);
@@ -414,19 +494,22 @@ nfsreq_print(register const u_char *bp, u_int length,
case NFSPROC_GETATTR:
printf(" getattr");
- if ((dp = parsereq(rp, length)) != NULL && parsefh(dp, v3) != NULL)
+ if ((dp = parsereq(rp, length)) != NULL &&
+ parsefh(dp, v3) != NULL)
return;
break;
case NFSPROC_SETATTR:
printf(" setattr");
- if ((dp = parsereq(rp, length)) != NULL && parsefh(dp, v3) != NULL)
+ if ((dp = parsereq(rp, length)) != NULL &&
+ parsefh(dp, v3) != NULL)
return;
break;
case NFSPROC_LOOKUP:
printf(" lookup");
- if ((dp = parsereq(rp, length)) != NULL && parsefhn(dp, v3) != NULL)
+ if ((dp = parsereq(rp, length)) != NULL &&
+ parsefhn(dp, v3) != NULL)
return;
break;
@@ -434,15 +517,16 @@ nfsreq_print(register const u_char *bp, u_int length,
printf(" access");
if ((dp = parsereq(rp, length)) != NULL &&
(dp = parsefh(dp, v3)) != NULL) {
- TCHECK(*dp);
- printf(" %04lx", ntohl(dp[0]));
+ TCHECK(dp[0]);
+ printf(" %04x", (u_int32_t)ntohl(dp[0]));
return;
}
break;
case NFSPROC_READLINK:
printf(" readlink");
- if ((dp = parsereq(rp, length)) != NULL && parsefh(dp, v3) != NULL)
+ if ((dp = parsereq(rp, length)) != NULL &&
+ parsefh(dp, v3) != NULL)
return;
break;
@@ -451,13 +535,15 @@ nfsreq_print(register const u_char *bp, u_int length,
if ((dp = parsereq(rp, length)) != NULL &&
(dp = parsefh(dp, v3)) != NULL) {
if (v3) {
- TCHECK2(*dp, 3 * sizeof(*dp));
- printf(" %lu bytes @ ", ntohl(dp[2]));
+ TCHECK(dp[2]);
+ printf(" %u bytes @ ",
+ (u_int32_t) ntohl(dp[2]));
print_int64(dp, UNSIGNED);
} else {
- TCHECK2(*dp, 2 * sizeof(*dp));
- printf(" %lu bytes @ %lu",
- ntohl(dp[1]), ntohl(dp[0]));
+ TCHECK(dp[1]);
+ printf(" %u bytes @ %u",
+ (u_int32_t)ntohl(dp[1]),
+ (u_int32_t)ntohl(dp[0]));
}
return;
}
@@ -468,20 +554,24 @@ nfsreq_print(register const u_char *bp, u_int length,
if ((dp = parsereq(rp, length)) != NULL &&
(dp = parsefh(dp, v3)) != NULL) {
if (v3) {
- TCHECK2(*dp, 3 * sizeof(*dp));
- printf(" %lu bytes @ ", ntohl(dp[4]));
+ TCHECK(dp[4]);
+ printf(" %u bytes @ ",
+ (u_int32_t) ntohl(dp[4]));
print_int64(dp, UNSIGNED);
if (vflag) {
dp += 3;
- TCHECK2(*dp, sizeof(*dp));
+ TCHECK(dp[0]);
printf(" <%s>",
- nfsv3_writemodes[ntohl(*dp)]);
+ tok2str(nfsv3_writemodes,
+ NULL, ntohl(*dp)));
}
} else {
- TCHECK2(*dp, 4 * sizeof(*dp));
- printf(" %lu (%lu) bytes @ %lu (%lu)",
- ntohl(dp[3]), ntohl(dp[2]),
- ntohl(dp[1]), ntohl(dp[0]));
+ TCHECK(dp[3]);
+ printf(" %u (%u) bytes @ %u (%u)",
+ (u_int32_t)ntohl(dp[3]),
+ (u_int32_t)ntohl(dp[2]),
+ (u_int32_t)ntohl(dp[1]),
+ (u_int32_t)ntohl(dp[0]));
}
return;
}
@@ -489,24 +579,25 @@ nfsreq_print(register const u_char *bp, u_int length,
case NFSPROC_CREATE:
printf(" create");
- if ((dp = parsereq(rp, length)) != NULL && parsefhn(dp, v3) != NULL)
+ if ((dp = parsereq(rp, length)) != NULL &&
+ parsefhn(dp, v3) != NULL)
return;
break;
case NFSPROC_MKDIR:
printf(" mkdir");
- if ((dp = parsereq(rp, length)) != NULL && parsefhn(dp, v3) != NULL)
+ if ((dp = parsereq(rp, length)) != 0 && parsefhn(dp, v3) != 0)
return;
break;
case NFSPROC_SYMLINK:
printf(" symlink");
- if ((dp = parsereq(rp, length)) != NULL &&
- (dp = parsefhn(dp, v3)) != NULL) {
- fputs(" -> ", stdout);
- if (v3 && (dp = parse_sattr3(dp, &sa3)) == NULL)
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefhn(dp, v3)) != 0) {
+ fputs(" ->", stdout);
+ if (v3 && (dp = parse_sattr3(dp, &sa3)) == 0)
break;
- if (parsefn(dp) == NULL)
+ if (parsefn(dp) == 0)
break;
if (v3 && vflag)
print_sattr3(&sa3, vflag);
@@ -516,18 +607,18 @@ nfsreq_print(register const u_char *bp, u_int length,
case NFSPROC_MKNOD:
printf(" mknod");
- if ((dp = parsereq(rp, length)) != NULL &&
- (dp = parsefhn(dp, v3)) != NULL) {
- if (dp + 1 > (u_int32_t *)snapend)
- break;
- type = (nfstype)ntohl(*dp++);
- if ((dp = parse_sattr3(dp, &sa3)) == NULL)
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefhn(dp, v3)) != 0) {
+ TCHECK(*dp);
+ type = (nfs_type)ntohl(*dp++);
+ if ((dp = parse_sattr3(dp, &sa3)) == 0)
break;
printf(" %s", tok2str(type2str, "unk-ft %d", type));
if (vflag && (type == NFCHR || type == NFBLK)) {
- if (dp + 2 > (u_int32_t *)snapend)
- break;
- printf(" %lu/%lu", ntohl(dp[0]), ntohl(dp[1]));
+ TCHECK(dp[1]);
+ printf(" %u/%u",
+ (u_int32_t)ntohl(dp[0]),
+ (u_int32_t)ntohl(dp[1]));
dp += 2;
}
if (vflag)
@@ -538,13 +629,15 @@ nfsreq_print(register const u_char *bp, u_int length,
case NFSPROC_REMOVE:
printf(" remove");
- if ((dp = parsereq(rp, length)) != NULL && parsefhn(dp, v3) != NULL)
+ if ((dp = parsereq(rp, length)) != NULL &&
+ parsefhn(dp, v3) != NULL)
return;
break;
case NFSPROC_RMDIR:
printf(" rmdir");
- if ((dp = parsereq(rp, length)) != NULL && parsefhn(dp, v3) != NULL)
+ if ((dp = parsereq(rp, length)) != NULL &&
+ parsefhn(dp, v3) != NULL)
return;
break;
@@ -573,24 +666,26 @@ nfsreq_print(register const u_char *bp, u_int length,
if ((dp = parsereq(rp, length)) != NULL &&
(dp = parsefh(dp, v3)) != NULL) {
if (v3) {
- TCHECK2(*dp, 20);
+ TCHECK(dp[4]);
/*
* We shouldn't really try to interpret the
* offset cookie here.
*/
- printf(" %lu bytes @ ", ntohl(dp[4]));
+ printf(" %u bytes @ ",
+ (u_int32_t) ntohl(dp[4]));
print_int64(dp, SIGNED);
if (vflag)
printf(" verf %08x%08x", dp[2],
dp[3]);
} else {
- TCHECK2(*dp, 2 * sizeof(*dp));
+ TCHECK(dp[1]);
/*
* Print the offset as signed, since -1 is
* common, but offsets > 2^31 aren't.
*/
- printf(" %lu bytes @ %ld", ntohl(dp[1]),
- ntohl(dp[0]));
+ printf(" %u bytes @ %d",
+ (u_int32_t)ntohl(dp[1]),
+ (u_int32_t)ntohl(dp[0]));
}
return;
}
@@ -600,23 +695,24 @@ nfsreq_print(register const u_char *bp, u_int length,
printf(" readdirplus");
if ((dp = parsereq(rp, length)) != NULL &&
(dp = parsefh(dp, v3)) != NULL) {
- TCHECK2(*dp, 20);
+ TCHECK(dp[4]);
/*
* We don't try to interpret the offset
* cookie here.
*/
- printf(" %lu bytes @ ", ntohl(dp[4]));
+ printf(" %u bytes @ ", (u_int32_t) ntohl(dp[4]));
print_int64(dp, SIGNED);
if (vflag)
- printf(" max %lu verf %08x%08x",
- ntohl(dp[5]), dp[2], dp[3]);
+ printf(" max %u verf %08x%08x",
+ (u_int32_t) ntohl(dp[5]), dp[2], dp[3]);
return;
}
break;
case NFSPROC_FSSTAT:
printf(" fsstat");
- if ((dp = parsereq(rp, length)) != NULL && parsefh(dp, v3) != NULL)
+ if ((dp = parsereq(rp, length)) != NULL &&
+ parsefh(dp, v3) != NULL)
return;
break;
@@ -632,16 +728,17 @@ nfsreq_print(register const u_char *bp, u_int length,
printf(" commit");
if ((dp = parsereq(rp, length)) != NULL &&
(dp = parsefh(dp, v3)) != NULL) {
- printf(" %lu bytes @ ", ntohl(dp[2]));
+ printf(" %u bytes @ ", (u_int32_t) ntohl(dp[2]));
print_int64(dp, UNSIGNED);
return;
}
break;
default:
- printf(" proc-%lu", ntohl(rp->rm_call.cb_proc));
+ printf(" proc-%u", (u_int32_t)ntohl(rp->rm_call.cb_proc));
return;
}
+
trunc:
if (!nfserr)
fputs(" [|nfs]", stdout);
@@ -657,13 +754,13 @@ trunc:
* additional hacking on the parser code.
*/
static void
-nfs_printfh(register const u_int32_t *dp, const int len)
+nfs_printfh(register const u_int32_t *dp, const u_int len)
{
my_fsid fsid;
ino_t ino;
char *sfsname = NULL;
- Parse_fh((caddr_t *)dp, len, &fsid, &ino, NULL, &sfsname, 0);
+ Parse_fh((caddr_t*)dp, len, &fsid, &ino, NULL, &sfsname, 0);
if (sfsname) {
/* file system ID is ASCII, not numeric, for this server OS */
@@ -671,16 +768,23 @@ nfs_printfh(register const u_int32_t *dp, const int len)
/* Make sure string is null-terminated */
strncpy(temp, sfsname, NFSX_V3FHMAX);
+ temp[sizeof(temp) - 1] = '\0';
/* Remove trailing spaces */
sfsname = strchr(temp, ' ');
if (sfsname)
*sfsname = 0;
- (void)printf(" fh %s/%u", temp, (u_int32_t)ino);
+ (void)printf(" fh %s/", temp);
} else {
- (void)printf(" fh %u,%u/%u",
- fsid.Fsid_dev.Major, fsid.Fsid_dev.Minor, (u_int32_t)ino);
+ (void)printf(" fh %d,%d/",
+ fsid.Fsid_dev.Major, fsid.Fsid_dev.Minor);
}
+
+ if(fsid.Fsid_dev.Minor == 257 && uflag)
+ /* Print the undecoded handle */
+ (void)printf("%s", fsid.Opaque_Handle);
+ else
+ (void)printf("%ld", (long) ino);
}
/*
@@ -690,11 +794,17 @@ nfs_printfh(register const u_int32_t *dp, const int len)
*/
struct xid_map_entry {
- u_int32_t xid; /* transaction ID (net order) */
+ u_int32_t xid; /* transaction ID (net order) */
+ int ipver; /* IP version (4 or 6) */
+#ifdef INET6
+ struct in6_addr client; /* client IP address (net order) */
+ struct in6_addr server; /* server IP address (net order) */
+#else
struct in_addr client; /* client IP address (net order) */
struct in_addr server; /* server IP address (net order) */
- u_int32_t proc; /* call proc number (host order) */
- u_int32_t vers; /* program version (host order) */
+#endif
+ u_int32_t proc; /* call proc number (host order) */
+ u_int32_t vers; /* program version (host order) */
};
/*
@@ -711,18 +821,45 @@ int xid_map_next = 0;
int xid_map_hint = 0;
static void
-xid_map_enter(const struct rpc_msg *rp, const struct ip *ip)
+xid_map_enter(const struct rpc_msg *rp, const u_char *bp)
{
+ struct ip *ip = NULL;
+#ifdef INET6
+ struct ip6_hdr *ip6 = NULL;
+#endif
struct xid_map_entry *xmep;
+ switch (IP_V((struct ip *)bp)) {
+ case 4:
+ ip = (struct ip *)bp;
+ break;
+#ifdef INET6
+ case 6:
+ ip6 = (struct ip6_hdr *)bp;
+ break;
+#endif
+ default:
+ return;
+ }
+
xmep = &xid_map[xid_map_next];
if (++xid_map_next >= XIDMAPSIZE)
xid_map_next = 0;
xmep->xid = rp->rm_xid;
- xmep->client = ip->ip_src;
- xmep->server = ip->ip_dst;
+ if (ip) {
+ xmep->ipver = 4;
+ memcpy(&xmep->client, &ip->ip_src, sizeof(ip->ip_src));
+ memcpy(&xmep->server, &ip->ip_dst, sizeof(ip->ip_dst));
+ }
+#ifdef INET6
+ else if (ip6) {
+ xmep->ipver = 6;
+ memcpy(&xmep->client, &ip6->ip6_src, sizeof(ip6->ip6_src));
+ memcpy(&xmep->server, &ip6->ip6_dst, sizeof(ip6->ip6_dst));
+ }
+#endif
xmep->proc = ntohl(rp->rm_call.cb_proc);
xmep->vers = ntohl(rp->rm_call.cb_vers);
}
@@ -732,33 +869,62 @@ xid_map_enter(const struct rpc_msg *rp, const struct ip *ip)
* version in vers return, or returns -1 on failure
*/
static int
-xid_map_find(const struct rpc_msg *rp, const struct ip *ip, u_int32_t *proc,
+xid_map_find(const struct rpc_msg *rp, const u_char *bp, u_int32_t *proc,
u_int32_t *vers)
{
int i;
struct xid_map_entry *xmep;
u_int32_t xid = rp->rm_xid;
- u_int32_t clip = ip->ip_dst.s_addr;
- u_int32_t sip = ip->ip_src.s_addr;
+ struct ip *ip = (struct ip *)bp;
+#ifdef INET6
+ struct ip6_hdr *ip6 = (struct ip6_hdr *)bp;
+#endif
+ int cmp;
/* Start searching from where we last left off */
- i = xid_map_hint;
+ i = xid_map_hint;
do {
xmep = &xid_map[i];
- if (xmep->xid == xid && xmep->client.s_addr == clip &&
- xmep->server.s_addr == sip) {
+ cmp = 1;
+ if (xmep->ipver != IP_V(ip) || xmep->xid != xid)
+ goto nextitem;
+ switch (xmep->ipver) {
+ case 4:
+ if (memcmp(&ip->ip_src, &xmep->server,
+ sizeof(ip->ip_src)) != 0 ||
+ memcmp(&ip->ip_dst, &xmep->client,
+ sizeof(ip->ip_dst)) != 0) {
+ cmp = 0;
+ }
+ break;
+#ifdef INET6
+ case 6:
+ if (memcmp(&ip6->ip6_src, &xmep->server,
+ sizeof(ip6->ip6_src)) != 0 ||
+ memcmp(&ip6->ip6_dst, &xmep->client,
+ sizeof(ip6->ip6_dst)) != 0) {
+ cmp = 0;
+ }
+ break;
+#endif
+ default:
+ cmp = 0;
+ break;
+ }
+ if (cmp) {
/* match */
xid_map_hint = i;
*proc = xmep->proc;
*vers = xmep->vers;
return 0;
}
+ nextitem:
if (++i >= XIDMAPSIZE)
i = 0;
} while (i != xid_map_hint);
/* search failed */
- return (0);
+ return (-1);
}
/*
@@ -767,13 +933,13 @@ xid_map_find(const struct rpc_msg *rp, const struct ip *ip, u_int32_t *proc,
/*
* Return a pointer to the beginning of the actual results.
- * If the packet was truncated, return NULL.
+ * If the packet was truncated, return 0.
*/
static const u_int32_t *
-parserep(register const struct rpc_msg *rp, register int length)
+parserep(register const struct rpc_msg *rp, register u_int length)
{
register const u_int32_t *dp;
- int len;
+ u_int len;
enum accept_stat astat;
/*
@@ -792,7 +958,7 @@ parserep(register const struct rpc_msg *rp, register int length)
* which is an "enum" and so occupies one 32-bit word.
*/
dp = ((const u_int32_t *)&rp->rm_reply) + 1;
- TCHECK2(dp[0], 1);
+ TCHECK(dp[1]);
len = ntohl(dp[1]);
if (len >= length)
return (NULL);
@@ -842,32 +1008,32 @@ parserep(register const struct rpc_msg *rp, register int length)
return (NULL);
}
/* successful return */
- if ((sizeof(astat) + ((u_char *)dp)) < snapend)
- return ((u_int32_t *) (sizeof(astat) + ((char *)dp)));
-
+ TCHECK2(*dp, sizeof(astat));
+ return ((u_int32_t *) (sizeof(astat) + ((char *)dp)));
trunc:
- return (NULL);
+ return (0);
}
-
static const u_int32_t *
parsestatus(const u_int32_t *dp, int *er)
{
- register int errnum;
+ int errnum;
TCHECK(dp[0]);
+
errnum = ntohl(dp[0]);
if (er)
*er = errnum;
if (errnum != 0) {
if (!qflag)
- printf(" ERROR: %s", pcap_strerror(errnum));
+ printf(" ERROR: %s",
+ tok2str(status2str, "unk %d", errnum));
nfserr = 1;
return (NULL);
}
return (dp + 1);
trunc:
- return (NULL);
+ return NULL;
}
static const u_int32_t *
@@ -878,10 +1044,12 @@ parsefattr(const u_int32_t *dp, int verbose, int v3)
fap = (const struct nfs_fattr *)dp;
TCHECK(fap->fa_gid);
if (verbose) {
- printf(" %s %lo ids %ld/%ld",
- tok2str(type2str, "unk-ft %d ", ntohl(fap->fa_type)),
- ntohl(fap->fa_mode), ntohl(fap->fa_uid),
- ntohl(fap->fa_gid));
+ printf(" %s %o ids %d/%d",
+ tok2str(type2str, "unk-ft %d ",
+ (u_int32_t)ntohl(fap->fa_type)),
+ (u_int32_t)ntohl(fap->fa_mode),
+ (u_int32_t)ntohl(fap->fa_uid),
+ (u_int32_t) ntohl(fap->fa_gid));
if (v3) {
TCHECK(fap->fa3_size);
printf(" sz ");
@@ -889,44 +1057,46 @@ parsefattr(const u_int32_t *dp, int verbose, int v3)
putchar(' ');
} else {
TCHECK(fap->fa2_size);
- printf(" sz %ld ", ntohl(fap->fa2_size));
+ printf(" sz %d ", (u_int32_t) ntohl(fap->fa2_size));
}
}
/* print lots more stuff */
if (verbose > 1) {
if (v3) {
TCHECK(fap->fa3_ctime);
- printf("nlink %ld rdev %ld/%ld ",
- ntohl(fap->fa_nlink),
- ntohl(fap->fa3_rdev.specdata1),
- ntohl(fap->fa3_rdev.specdata2));
+ printf("nlink %d rdev %d/%d ",
+ (u_int32_t)ntohl(fap->fa_nlink),
+ (u_int32_t) ntohl(fap->fa3_rdev.specdata1),
+ (u_int32_t) ntohl(fap->fa3_rdev.specdata2));
printf("fsid ");
print_int64((u_int32_t *)&fap->fa2_fsid, HEX);
printf(" nodeid ");
print_int64((u_int32_t *)&fap->fa2_fileid, HEX);
- printf(" a/m/ctime %lu.%06lu ",
- ntohl(fap->fa3_atime.nfsv3_sec),
- ntohl(fap->fa3_atime.nfsv3_nsec));
- printf("%lu.%06lu ",
- ntohl(fap->fa3_mtime.nfsv3_sec),
- ntohl(fap->fa3_mtime.nfsv3_nsec));
- printf("%lu.%06lu ",
- ntohl(fap->fa3_ctime.nfsv3_sec),
- ntohl(fap->fa3_ctime.nfsv3_nsec));
+ printf(" a/m/ctime %u.%06u ",
+ (u_int32_t) ntohl(fap->fa3_atime.nfsv3_sec),
+ (u_int32_t) ntohl(fap->fa3_atime.nfsv3_nsec));
+ printf("%u.%06u ",
+ (u_int32_t) ntohl(fap->fa3_mtime.nfsv3_sec),
+ (u_int32_t) ntohl(fap->fa3_mtime.nfsv3_nsec));
+ printf("%u.%06u ",
+ (u_int32_t) ntohl(fap->fa3_ctime.nfsv3_sec),
+ (u_int32_t) ntohl(fap->fa3_ctime.nfsv3_nsec));
} else {
TCHECK(fap->fa2_ctime);
- printf("nlink %ld rdev %lx fsid %lx nodeid %lx a/m/ctime ",
- ntohl(fap->fa_nlink), ntohl(fap->fa2_rdev),
- ntohl(fap->fa2_fsid), ntohl(fap->fa2_fileid));
- printf("%lu.%06lu ",
- ntohl(fap->fa2_atime.nfsv2_sec),
- ntohl(fap->fa2_atime.nfsv2_usec));
- printf("%lu.%06lu ",
- ntohl(fap->fa2_mtime.nfsv2_sec),
- ntohl(fap->fa2_mtime.nfsv2_usec));
- printf("%lu.%06lu ",
- ntohl(fap->fa2_ctime.nfsv2_sec),
- ntohl(fap->fa2_ctime.nfsv2_usec));
+ printf("nlink %d rdev %x fsid %x nodeid %x a/m/ctime ",
+ (u_int32_t) ntohl(fap->fa_nlink),
+ (u_int32_t) ntohl(fap->fa2_rdev),
+ (u_int32_t) ntohl(fap->fa2_fsid),
+ (u_int32_t) ntohl(fap->fa2_fileid));
+ printf("%u.%06u ",
+ (u_int32_t) ntohl(fap->fa2_atime.nfsv2_sec),
+ (u_int32_t) ntohl(fap->fa2_atime.nfsv2_usec));
+ printf("%u.%06u ",
+ (u_int32_t) ntohl(fap->fa2_mtime.nfsv2_sec),
+ (u_int32_t) ntohl(fap->fa2_mtime.nfsv2_usec));
+ printf("%u.%06u ",
+ (u_int32_t) ntohl(fap->fa2_ctime.nfsv2_sec),
+ (u_int32_t) ntohl(fap->fa2_ctime.nfsv2_usec));
}
}
return ((const u_int32_t *)((unsigned char *)dp +
@@ -952,8 +1122,7 @@ parsediropres(const u_int32_t *dp)
{
int er;
- dp = parsestatus(dp, &er);
- if (dp == NULL || er)
+ if (!(dp = parsestatus(dp, &er)) || er)
return (0);
dp = parsefh(dp, 0);
@@ -971,10 +1140,8 @@ parselinkres(const u_int32_t *dp, int v3)
dp = parsestatus(dp, &er);
if (dp == NULL || er)
return(0);
-
- if (v3 && ((dp = parse_post_op_attr(dp, vflag)) != NULL))
+ if (v3 && !(dp = parse_post_op_attr(dp, vflag)))
return (0);
-
putchar(' ');
return (parsefn(dp) != NULL);
}
@@ -987,7 +1154,7 @@ parsestatfs(const u_int32_t *dp, int v3)
dp = parsestatus(dp, &er);
if (dp == NULL || (!v3 && er))
- return(0);
+ return (0);
if (qflag)
return(1);
@@ -995,7 +1162,7 @@ parsestatfs(const u_int32_t *dp, int v3)
if (v3) {
if (vflag)
printf(" POST:");
- if ((dp = parse_post_op_attr(dp, vflag)) == NULL)
+ if (!(dp = parse_post_op_attr(dp, vflag)))
return (0);
}
@@ -1017,13 +1184,16 @@ parsestatfs(const u_int32_t *dp, int v3)
print_int64((u_int32_t *)&sfsp->sf_ffiles, UNSIGNED);
printf(" afiles ");
print_int64((u_int32_t *)&sfsp->sf_afiles, UNSIGNED);
- printf(" invar %lu", ntohl(sfsp->sf_invarsec));
+ printf(" invar %u",
+ (u_int32_t) ntohl(sfsp->sf_invarsec));
}
} else {
- printf(" tsize %ld bsize %ld blocks %ld bfree %ld bavail %ld",
- ntohl(sfsp->sf_tsize), ntohl(sfsp->sf_bsize),
- ntohl(sfsp->sf_blocks), ntohl(sfsp->sf_bfree),
- ntohl(sfsp->sf_bavail));
+ printf(" tsize %d bsize %d blocks %d bfree %d bavail %d",
+ (u_int32_t)ntohl(sfsp->sf_tsize),
+ (u_int32_t)ntohl(sfsp->sf_bsize),
+ (u_int32_t)ntohl(sfsp->sf_blocks),
+ (u_int32_t)ntohl(sfsp->sf_bfree),
+ (u_int32_t)ntohl(sfsp->sf_bavail));
}
return (1);
@@ -1037,15 +1207,16 @@ parserddires(const u_int32_t *dp)
int er;
dp = parsestatus(dp, &er);
- if (dp == NULL || er)
+ if (dp == 0 || er)
return (0);
if (qflag)
return (1);
TCHECK(dp[2]);
- printf(" offset %lx size %ld ", ntohl(dp[0]), ntohl(dp[1]));
+ printf(" offset %x size %d ",
+ (u_int32_t)ntohl(dp[0]), (u_int32_t)ntohl(dp[1]));
if (dp[2] != 0)
- printf("eof");
+ printf(" eof");
return (1);
trunc:
@@ -1057,8 +1228,9 @@ parse_wcc_attr(const u_int32_t *dp)
{
printf(" sz ");
print_int64(dp, UNSIGNED);
- printf(" mtime %lu.%06lu ctime %lu.%06lu", ntohl(dp[2]), ntohl(dp[3]),
- ntohl(dp[4]), ntohl(dp[5]));
+ printf(" mtime %u.%06u ctime %u.%06u",
+ (u_int32_t)ntohl(dp[2]), (u_int32_t)ntohl(dp[3]),
+ (u_int32_t)ntohl(dp[4]), (u_int32_t)ntohl(dp[5]));
return (dp + 6);
}
@@ -1106,8 +1278,8 @@ parse_wcc_data(const u_int32_t *dp, int verbose)
{
if (verbose > 1)
printf(" PRE:");
- if ((dp = parse_pre_op_attr(dp, verbose)) == NULL)
- return (NULL);
+ if (!(dp = parse_pre_op_attr(dp, verbose)))
+ return (0);
if (verbose)
printf(" POST:");
@@ -1119,8 +1291,8 @@ parsecreateopres(const u_int32_t *dp, int verbose)
{
int er;
- if ((dp = parsestatus(dp, &er)) == NULL)
- return (NULL);
+ if (!(dp = parsestatus(dp, &er)))
+ return (0);
if (er)
dp = parse_wcc_data(dp, verbose);
else {
@@ -1128,11 +1300,11 @@ parsecreateopres(const u_int32_t *dp, int verbose)
if (!ntohl(dp[0]))
return (dp + 1);
dp++;
- if ((dp = parsefh(dp, 1)) == NULL)
- return (NULL);
+ if (!(dp = parsefh(dp, 1)))
+ return (0);
if (verbose) {
- if ((dp = parse_post_op_attr(dp, verbose)) == NULL)
- return (NULL);
+ if (!(dp = parse_post_op_attr(dp, verbose)))
+ return (0);
if (vflag > 1) {
printf("dir attr:");
dp = parse_wcc_data(dp, verbose);
@@ -1149,9 +1321,9 @@ parsewccres(const u_int32_t *dp, int verbose)
{
int er;
- if ((dp = parsestatus(dp, &er)) == NULL)
+ if (!(dp = parsestatus(dp, &er)))
return (0);
- return parse_wcc_data(dp, verbose) != NULL;
+ return parse_wcc_data(dp, verbose) != 0;
}
static const u_int32_t *
@@ -1159,12 +1331,12 @@ parsev3rddirres(const u_int32_t *dp, int verbose)
{
int er;
- if ((dp = parsestatus(dp, &er)) == NULL)
- return (NULL);
+ if (!(dp = parsestatus(dp, &er)))
+ return (0);
if (vflag)
printf(" POST:");
- if ((dp = parse_post_op_attr(dp, verbose)) == NULL)
- return (NULL);
+ if (!(dp = parse_post_op_attr(dp, verbose)))
+ return (0);
if (er)
return dp;
if (vflag) {
@@ -1183,31 +1355,35 @@ parsefsinfo(const u_int32_t *dp)
struct nfsv3_fsinfo *sfp;
int er;
- if ((dp = parsestatus(dp, &er)) == NULL)
+ if (!(dp = parsestatus(dp, &er)))
return (0);
if (vflag)
printf(" POST:");
- if ((dp = parse_post_op_attr(dp, vflag)) == NULL)
+ if (!(dp = parse_post_op_attr(dp, vflag)))
return (0);
if (er)
return (1);
sfp = (struct nfsv3_fsinfo *)dp;
TCHECK(*sfp);
- printf(" rtmax %lu rtpref %lu wtmax %lu wtpref %lu dtpref %lu",
- ntohl(sfp->fs_rtmax), ntohl(sfp->fs_rtpref),
- ntohl(sfp->fs_wtmax), ntohl(sfp->fs_wtpref),
- ntohl(sfp->fs_dtpref));
+ printf(" rtmax %u rtpref %u wtmax %u wtpref %u dtpref %u",
+ (u_int32_t) ntohl(sfp->fs_rtmax),
+ (u_int32_t) ntohl(sfp->fs_rtpref),
+ (u_int32_t) ntohl(sfp->fs_wtmax),
+ (u_int32_t) ntohl(sfp->fs_wtpref),
+ (u_int32_t) ntohl(sfp->fs_dtpref));
if (vflag) {
- printf(" rtmult %lu wtmult %lu maxfsz ",
- ntohl(sfp->fs_rtmult), ntohl(sfp->fs_wtmult));
+ printf(" rtmult %u wtmult %u maxfsz ",
+ (u_int32_t) ntohl(sfp->fs_rtmult),
+ (u_int32_t) ntohl(sfp->fs_wtmult));
print_int64((u_int32_t *)&sfp->fs_maxfilesize, UNSIGNED);
- printf(" delta %lu.%06lu ", ntohl(sfp->fs_timedelta.nfsv3_sec),
- ntohl(sfp->fs_timedelta.nfsv3_nsec));
+ printf(" delta %u.%06u ",
+ (u_int32_t) ntohl(sfp->fs_timedelta.nfsv3_sec),
+ (u_int32_t) ntohl(sfp->fs_timedelta.nfsv3_nsec));
}
- return (1);
-trunc:
return (0);
+trunc:
+ return (1);
}
static int
@@ -1216,11 +1392,11 @@ parsepathconf(const u_int32_t *dp)
int er;
struct nfsv3_pathconf *spp;
- if ((dp = parsestatus(dp, &er)) == NULL)
+ if (!(dp = parsestatus(dp, &er)))
return (0);
if (vflag)
printf(" POST:");
- if ((dp = parse_post_op_attr(dp, vflag)) == NULL)
+ if (!(dp = parse_post_op_attr(dp, vflag)))
return (0);
if (er)
return (1);
@@ -1228,24 +1404,23 @@ parsepathconf(const u_int32_t *dp)
spp = (struct nfsv3_pathconf *)dp;
TCHECK(*spp);
- printf(" linkmax %lu namemax %lu %s %s %s %s",
- ntohl(spp->pc_linkmax),
- ntohl(spp->pc_namemax),
+ printf(" linkmax %u namemax %u %s %s %s %s",
+ (u_int32_t) ntohl(spp->pc_linkmax),
+ (u_int32_t) ntohl(spp->pc_namemax),
ntohl(spp->pc_notrunc) ? "notrunc" : "",
ntohl(spp->pc_chownrestricted) ? "chownres" : "",
ntohl(spp->pc_caseinsensitive) ? "igncase" : "",
ntohl(spp->pc_casepreserving) ? "keepcase" : "");
- return (1);
-trunc:
return (0);
+trunc:
+ return (1);
}
-
+
static void
interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int length)
{
register const u_int32_t *dp;
register int v3;
-
int er;
v3 = (vers == NFS_VER3);
@@ -1272,10 +1447,10 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
case NFSPROC_SETATTR:
printf(" setattr");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
return;
if (v3) {
- if (parsewccres(dp, vflag) != 0)
+ if (parsewccres(dp, vflag))
return;
} else {
if (parseattrstat(dp, !qflag, 0) != 0)
@@ -1285,10 +1460,10 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
case NFSPROC_LOOKUP:
printf(" lookup");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
if (v3) {
- if ((dp = parsestatus(dp, &er)) == NULL)
+ if (!(dp = parsestatus(dp, &er)))
break;
if (er) {
if (vflag > 1) {
@@ -1296,15 +1471,15 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
dp = parse_post_op_attr(dp, vflag);
}
} else {
- if ((dp = parsefh(dp, v3)) == NULL)
+ if (!(dp = parsefh(dp, v3)))
break;
- if (((dp = parse_post_op_attr(dp, vflag)) != NULL) &&
- (vflag > 1)) {
+ if ((dp = parse_post_op_attr(dp, vflag)) &&
+ vflag > 1) {
printf(" post dattr:");
dp = parse_post_op_attr(dp, vflag);
}
}
- if (dp != NULL)
+ if (dp)
return;
} else {
if (parsediropres(dp) != 0)
@@ -1315,14 +1490,14 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
case NFSPROC_ACCESS:
printf(" access");
dp = parserep(rp, length);
- if ((dp = parsestatus(dp, &er)) == NULL)
+ if (!(dp = parsestatus(dp, &er)))
break;
if (vflag)
printf(" attr:");
- if ((dp = parse_post_op_attr(dp, vflag)) == NULL)
+ if (!(dp = parse_post_op_attr(dp, vflag)))
break;
if (!er)
- printf(" c %04lx", ntohl(dp[0]));
+ printf(" c %04x", (u_int32_t)ntohl(dp[0]));
return;
case NFSPROC_READLINK:
@@ -1334,18 +1509,18 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
case NFSPROC_READ:
printf(" read");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
if (v3) {
- if ((dp = parsestatus(dp, &er)) == NULL)
+ if (!(dp = parsestatus(dp, &er)))
break;
- if ((dp = parse_post_op_attr(dp, vflag)) == NULL)
+ if (!(dp = parse_post_op_attr(dp, vflag)))
break;
if (er)
return;
if (vflag) {
- TCHECK2(*dp, 8);
- printf("%lu bytes", ntohl(dp[0]));
+ TCHECK(dp[1]);
+ printf("%u bytes", (u_int32_t) ntohl(dp[0]));
if (ntohl(dp[1]))
printf(" EOF");
}
@@ -1358,22 +1533,23 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
case NFSPROC_WRITE:
printf(" write");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
if (v3) {
- if ((dp = parsestatus(dp, &er)) == NULL)
+ if (!(dp = parsestatus(dp, &er)))
break;
- if ((dp = parse_wcc_data(dp, vflag)) == NULL)
+ if (!(dp = parse_wcc_data(dp, vflag)))
break;
if (er)
return;
if (vflag) {
- TCHECK2(*dp, 4);
- printf("%lu bytes", ntohl(dp[0]));
+ TCHECK(dp[0]);
+ printf("%u bytes", (u_int32_t) ntohl(dp[0]));
if (vflag > 1) {
- TCHECK2(*dp, 4);
+ TCHECK(dp[1]);
printf(" <%s>",
- nfsv3_writemodes[ntohl(dp[1])]);
+ tok2str(nfsv3_writemodes,
+ NULL, ntohl(dp[1])));
}
return;
}
@@ -1385,10 +1561,10 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
case NFSPROC_CREATE:
printf(" create");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
if (v3) {
- if (parsecreateopres(dp, vflag) != NULL)
+ if (parsecreateopres(dp, vflag) != 0)
return;
} else {
if (parsediropres(dp) != 0)
@@ -1398,10 +1574,10 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
case NFSPROC_MKDIR:
printf(" mkdir");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
if (v3) {
- if (parsecreateopres(dp, vflag) != NULL)
+ if (parsecreateopres(dp, vflag) != 0)
return;
} else {
if (parsediropres(dp) != 0)
@@ -1411,101 +1587,101 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
case NFSPROC_SYMLINK:
printf(" symlink");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
if (v3) {
- if (parsecreateopres(dp, vflag) != NULL)
+ if (parsecreateopres(dp, vflag) != 0)
return;
} else {
- if (parsestatus(dp, &er) != NULL)
+ if (parsestatus(dp, &er) != 0)
return;
}
break;
case NFSPROC_MKNOD:
printf(" mknod");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
- if (parsecreateopres(dp, vflag) != NULL)
+ if (parsecreateopres(dp, vflag) != 0)
return;
break;
case NFSPROC_REMOVE:
printf(" remove");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
if (v3) {
- if (parsewccres(dp, vflag) != 0)
+ if (parsewccres(dp, vflag))
return;
} else {
- if (parsestatus(dp, &er) != NULL)
+ if (parsestatus(dp, &er) != 0)
return;
}
break;
case NFSPROC_RMDIR:
printf(" rmdir");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
if (v3) {
- if (parsewccres(dp, vflag) != 0)
+ if (parsewccres(dp, vflag))
return;
} else {
- if (parsestatus(dp, &er) != NULL)
+ if (parsestatus(dp, &er) != 0)
return;
}
break;
case NFSPROC_RENAME:
printf(" rename");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
if (v3) {
- if ((dp = parsestatus(dp, &er)) == NULL)
+ if (!(dp = parsestatus(dp, &er)))
break;
if (vflag) {
printf(" from:");
- if ((dp = parse_wcc_data(dp, vflag)) == NULL)
+ if (!(dp = parse_wcc_data(dp, vflag)))
break;
printf(" to:");
- if ((dp = parse_wcc_data(dp, vflag)) == NULL)
+ if (!(dp = parse_wcc_data(dp, vflag)))
break;
}
return;
} else {
- if (parsestatus(dp, &er) != NULL)
+ if (parsestatus(dp, &er) != 0)
return;
}
break;
case NFSPROC_LINK:
printf(" link");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
if (v3) {
- if ((dp = parsestatus(dp, &er)) == NULL)
+ if (!(dp = parsestatus(dp, &er)))
break;
if (vflag) {
printf(" file POST:");
- if ((dp = parse_post_op_attr(dp, vflag)) == NULL)
+ if (!(dp = parse_post_op_attr(dp, vflag)))
break;
printf(" dir:");
- if ((dp = parse_wcc_data(dp, vflag)) == NULL)
+ if (!(dp = parse_wcc_data(dp, vflag)))
break;
return;
}
} else {
- if (parsestatus(dp, &er) != NULL)
+ if (parsestatus(dp, &er) != 0)
return;
}
break;
case NFSPROC_READDIR:
printf(" readdir");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
if (v3) {
- if (parsev3rddirres(dp, vflag) != NULL)
+ if (parsev3rddirres(dp, vflag))
return;
} else {
if (parserddires(dp) != 0)
@@ -1515,23 +1691,23 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
case NFSPROC_READDIRPLUS:
printf(" readdirplus");
- if ((dp = parserep(rp, length)) == NULL)
+ if (!(dp = parserep(rp, length)))
break;
- if (parsev3rddirres(dp, vflag) != NULL)
+ if (parsev3rddirres(dp, vflag))
return;
break;
case NFSPROC_FSSTAT:
printf(" fsstat");
dp = parserep(rp, length);
- if (dp != NULL && parsestatfs(dp, v3) != NULL)
+ if (dp != NULL && parsestatfs(dp, v3) != 0)
return;
break;
case NFSPROC_FSINFO:
printf(" fsinfo");
dp = parserep(rp, length);
- if (dp != NULL && parsefsinfo(dp) != NULL)
+ if (dp != NULL && parsefsinfo(dp) != 0)
return;
break;
@@ -1553,7 +1729,6 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int lengt
printf(" proc-%u", proc);
return;
}
-
trunc:
if (!nfserr)
fputs(" [|nfs]", stdout);
OpenPOWER on IntegriCloud