]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-nfs.c
More UNALIGNED_MEM{CPY,CMP} on IP addresses.
[tcpdump] / print-nfs.c
index 4d17757f311457e72a5e12eb7847c67fdc52229f..4ec55e8c513c28fb0144eacfdb54691ff6a04bb4 100644 (file)
  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#ifndef lint
-static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-nfs.c,v 1.111 2007-12-22 03:08:04 guy Exp $ (LBL)";
-#endif
-
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -48,9 +43,11 @@ static const char rcsid[] _U_ =
 #include "rpc_auth.h"
 #include "rpc_msg.h"
 
+static const char tstr[] = " [|nfs]";
+
 static void nfs_printfh(const u_int32_t *, const u_int);
 static int xid_map_enter(const struct sunrpc_msg *, const u_char *);
-static int32_t xid_map_find(const struct sunrpc_msg *, const u_char *,
+static int xid_map_find(const struct sunrpc_msg *, const u_char *,
                            u_int32_t *, u_int32_t *);
 static void interp_reply(const struct sunrpc_msg *, u_int32_t, u_int32_t, int);
 static const u_int32_t *parse_post_op_attr(const u_int32_t *, int);
@@ -100,7 +97,7 @@ u_int32_t nfsv3_procid[NFS_NPROCS] = {
  * the first NFS server was the SunOS 2.0 one, and until 5.0 SunOS
  * was primarily BSD-derived.
  */
-static struct tok status2str[] = {
+static const struct tok status2str[] = {
        { 1,     "Operation not permitted" },   /* EPERM */
        { 2,     "No such file or directory" }, /* ENOENT */
        { 5,     "Input/output error" },        /* EIO */
@@ -138,14 +135,14 @@ static struct tok status2str[] = {
        { 0,     NULL }
 };
 
-static struct tok nfsv3_writemodes[] = {
+static const struct tok nfsv3_writemodes[] = {
        { 0,            "unstable" },
        { 1,            "datasync" },
        { 2,            "filesync" },
        { 0,            NULL }
 };
 
-static struct tok type2str[] = {
+static const struct tok type2str[] = {
        { NFNON,        "NON" },
        { NFREG,        "REG" },
        { NFDIR,        "DIR" },
@@ -287,12 +284,7 @@ nfsreply_print(register const u_char *bp, u_int length,
               register const u_char *bp2)
 {
        register const struct sunrpc_msg *rp;
-       u_int32_t proc, vers, reply_stat;
        char srcid[20], dstid[20];      /*fits 32bit*/
-       enum sunrpc_reject_stat rstat;
-       u_int32_t rlow;
-       u_int32_t rhigh;
-       enum sunrpc_auth_stat rwhy;
 
        nfserr = 0;             /* assume no error */
        rp = (const struct sunrpc_msg *)bp;
@@ -308,6 +300,29 @@ nfsreply_print(register const u_char *bp, u_int length,
                    EXTRACT_32BITS(&rp->rm_xid));
        }
        print_nfsaddr(bp2, srcid, dstid);
+
+       nfsreply_print_noaddr(bp, length, bp2);
+       return;
+
+trunc:
+       if (!nfserr)
+               printf("%s", tstr);
+}
+
+void
+nfsreply_print_noaddr(register const u_char *bp, u_int length,
+              register const u_char *bp2)
+{
+       register const struct sunrpc_msg *rp;
+       u_int32_t proc, vers, reply_stat;
+       enum sunrpc_reject_stat rstat;
+       u_int32_t rlow;
+       u_int32_t rhigh;
+       enum sunrpc_auth_stat rwhy;
+
+       nfserr = 0;             /* assume no error */
+       rp = (const struct sunrpc_msg *)bp;
+
        TCHECK(rp->rm_reply.rp_stat);
        reply_stat = EXTRACT_32BITS(&rp->rm_reply.rp_stat);
        switch (reply_stat) {
@@ -393,7 +408,7 @@ nfsreply_print(register const u_char *bp, u_int length,
 
 trunc:
        if (!nfserr)
-               fputs(" [|nfs]", stdout);
+               printf("%s", tstr);
 }
 
 /*
@@ -504,12 +519,6 @@ nfsreq_print(register const u_char *bp, u_int length,
     register const u_char *bp2)
 {
        register const struct sunrpc_msg *rp;
-       register const u_int32_t *dp;
-       nfs_type type;
-       int v3;
-       u_int32_t proc;
-       u_int32_t access_flags;
-       struct nfsv3_sattr sa3;
        char srcid[20], dstid[20];      /*fits 32bit*/
 
        nfserr = 0;             /* assume no error */
@@ -528,6 +537,29 @@ nfsreq_print(register const u_char *bp, u_int length,
        print_nfsaddr(bp2, srcid, dstid);
        (void)printf("%d", length);
 
+       nfsreq_print_noaddr(bp, length, bp2);
+       return;
+
+trunc:
+       if (!nfserr)
+               printf("%s", tstr);
+}
+
+void
+nfsreq_print_noaddr(register const u_char *bp, u_int length,
+    register const u_char *bp2)
+{
+       register const struct sunrpc_msg *rp;
+       register const u_int32_t *dp;
+       nfs_type type;
+       int v3;
+       u_int32_t proc;
+       u_int32_t access_flags;
+       struct nfsv3_sattr sa3;
+
+       nfserr = 0;             /* assume no error */
+       rp = (const struct sunrpc_msg *)bp;
+
        if (!xid_map_enter(rp, bp2))    /* record proc number for later on */
                goto trunc;
 
@@ -837,7 +869,7 @@ nfsreq_print(register const u_char *bp, u_int length,
 
 trunc:
        if (!nfserr)
-               fputs(" [|nfs]", stdout);
+               printf("%s", tstr);
 }
 
 /*
@@ -853,7 +885,7 @@ static void
 nfs_printfh(register const u_int32_t *dp, const u_int len)
 {
        my_fsid fsid;
-       ino_t ino;
+       u_int32_t ino;
        const char *sfsname = NULL;
        char *spacep;
 
@@ -962,14 +994,14 @@ xid_map_enter(const struct sunrpc_msg *rp, const u_char *bp)
        xmep->xid = rp->rm_xid;
        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));
+               UNALIGNED_MEMCPY(&xmep->client, &ip->ip_src, sizeof(ip->ip_src));
+               UNALIGNED_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));
+               UNALIGNED_MEMCPY(&xmep->client, &ip6->ip6_src, sizeof(ip6->ip6_src));
+               UNALIGNED_MEMCPY(&xmep->server, &ip6->ip6_dst, sizeof(ip6->ip6_dst));
        }
 #endif
        xmep->proc = EXTRACT_32BITS(&rp->rm_call.cb_proc);
@@ -1847,5 +1879,5 @@ interp_reply(const struct sunrpc_msg *rp, u_int32_t proc, u_int32_t vers, int le
        }
 trunc:
        if (!nfserr)
-               fputs(" [|nfs]", stdout);
+               printf("%s", tstr);
 }