diff options
author | fenner <fenner@FreeBSD.org> | 2001-04-03 07:50:46 +0000 |
---|---|---|
committer | fenner <fenner@FreeBSD.org> | 2001-04-03 07:50:46 +0000 |
commit | 2877f5b6133ecd5a0574b61880855776ec518278 (patch) | |
tree | 133b57ac128ee361805e9c2bedbcb790324dac62 /contrib/tcpdump/print-nfs.c | |
parent | f7d9a5e270bfcbb075a637a52416185441d33d8d (diff) | |
download | FreeBSD-src-2877f5b6133ecd5a0574b61880855776ec518278.zip FreeBSD-src-2877f5b6133ecd5a0574b61880855776ec518278.tar.gz |
Merge tcpdump 3.6.2
Diffstat (limited to 'contrib/tcpdump/print-nfs.c')
-rw-r--r-- | contrib/tcpdump/print-nfs.c | 815 |
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); |