*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-nfs.c,v 1.98 2002-12-11 07:14:05 guy Exp $ (LBL)";
+static const char rcsid[] _U_ =
+ "@(#) $Header: /tcpdump/master/tcpdump/print-nfs.c,v 1.104 2004-12-27 00:41:31 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
#include <tcpdump-stdinc.h>
-#include <rpc/rpc.h>
-
#include <pcap.h>
#include <stdio.h>
#include <string.h>
#ifdef INET6
#include "ip6.h"
#endif
+#include "rpc_auth.h"
+#include "rpc_msg.h"
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 *,
+static void xid_map_enter(const struct sunrpc_msg *, const u_char *);
+static int32_t xid_map_find(const struct sunrpc_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 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);
static void print_sattr3(const struct nfsv3_sattr *sa3, int verbose);
static int print_int64(const u_int32_t *dp, int how);
* try to make the best of it. The integer stored as 2 consecutive XDR
* encoded 32-bit integers, to which a pointer is passed.
*
- * Assume that a system that has INT64_FORMAT defined, has a 64-bit
- * integer datatype and can print it.
+ * We assume that PRId64, PRIu64, and PRIx64 are defined, and that
+ * u_int64_t is defined.
*/
#define UNSIGNED 0
static int print_int64(const u_int32_t *dp, int how)
{
-#ifdef INT64_FORMAT
u_int64_t res;
- res = ((u_int64_t)EXTRACT_32BITS(&dp[0]) << 32) | (u_int64_t)EXTRACT_32BITS(&dp[1]);
+ res = EXTRACT_64BITS((u_int8_t *)dp);
switch (how) {
case SIGNED:
- printf(INT64_FORMAT, res);
+ printf("%" PRId64, res);
break;
case UNSIGNED:
- printf(U_INT64_FORMAT, res);
- break;
- case HEX:
- printf(HEX_INT64_FORMAT, res);
+ printf("%" PRIu64, res);
break;
- default:
- return (0);
- }
-#else
- u_int32_t high;
-
- high = EXTRACT_32BITS(&dp[0]);
-
- switch (how) {
- case SIGNED:
- case UNSIGNED:
case HEX:
- if (high != 0)
- printf("0x%x%08x", high, EXTRACT_32BITS(&dp[1]));
- else
- printf("0x%x", EXTRACT_32BITS(&dp[1]));
+ printf("%" PRIx64, res);
break;
default:
return (0);
}
-#endif
- return 1;
+ return (1);
}
static void
nfsreply_print(register const u_char *bp, u_int length,
register const u_char *bp2)
{
- register const struct rpc_msg *rp;
+ register const struct sunrpc_msg *rp;
u_int32_t proc, vers;
char srcid[20], dstid[20]; /*fits 32bit*/
nfserr = 0; /* assume no error */
- rp = (const struct rpc_msg *)bp;
+ rp = (const struct sunrpc_msg *)bp;
if (!nflag) {
strlcpy(srcid, "nfs", sizeof(srcid));
}
print_nfsaddr(bp2, srcid, dstid);
(void)printf("reply %s %d",
- EXTRACT_32BITS(&rp->rm_reply.rp_stat) == MSG_ACCEPTED?
- "ok":"ERR",
- length);
+ EXTRACT_32BITS(&rp->rm_reply.rp_stat) == SUNRPC_MSG_ACCEPTED?
+ "ok":"ERR",
+ length);
if (xid_map_find(rp, bp2, &proc, &vers) >= 0)
interp_reply(rp, proc, vers, length);
* If the packet was truncated, return 0.
*/
static const u_int32_t *
-parsereq(register const struct rpc_msg *rp, register u_int length)
+parsereq(register const struct sunrpc_msg *rp, register u_int length)
{
register const u_int32_t *dp;
register u_int len;
nfsreq_print(register const u_char *bp, u_int length,
register const u_char *bp2)
{
- register const struct rpc_msg *rp;
+ register const struct sunrpc_msg *rp;
register const u_int32_t *dp;
nfs_type type;
int v3;
char srcid[20], dstid[20]; /*fits 32bit*/
nfserr = 0; /* assume no error */
- rp = (const struct rpc_msg *)bp;
+ rp = (const struct sunrpc_msg *)bp;
if (!nflag) {
snprintf(srcid, sizeof(srcid), "%u",
EXTRACT_32BITS(&rp->rm_xid));
int xid_map_hint = 0;
static void
-xid_map_enter(const struct rpc_msg *rp, const u_char *bp)
+xid_map_enter(const struct sunrpc_msg *rp, const u_char *bp)
{
struct ip *ip = NULL;
#ifdef INET6
* version in vers return, or returns -1 on failure
*/
static int
-xid_map_find(const struct rpc_msg *rp, const u_char *bp, u_int32_t *proc,
+xid_map_find(const struct sunrpc_msg *rp, const u_char *bp, u_int32_t *proc,
u_int32_t *vers)
{
int i;
* If the packet was truncated, return 0.
*/
static const u_int32_t *
-parserep(register const struct rpc_msg *rp, register u_int length)
+parserep(register const struct sunrpc_msg *rp, register u_int length)
{
register const u_int32_t *dp;
u_int len;
- enum accept_stat astat;
+ enum sunrpc_accept_stat astat;
/*
* Portability note:
astat = EXTRACT_32BITS(dp);
switch (astat) {
- case SUCCESS:
+ case SUNRPC_SUCCESS:
break;
- case PROG_UNAVAIL:
+ case SUNRPC_PROG_UNAVAIL:
printf(" PROG_UNAVAIL");
nfserr = 1; /* suppress trunc string */
return (NULL);
- case PROG_MISMATCH:
+ case SUNRPC_PROG_MISMATCH:
printf(" PROG_MISMATCH");
nfserr = 1; /* suppress trunc string */
return (NULL);
- case PROC_UNAVAIL:
+ case SUNRPC_PROC_UNAVAIL:
printf(" PROC_UNAVAIL");
nfserr = 1; /* suppress trunc string */
return (NULL);
- case GARBAGE_ARGS:
+ case SUNRPC_GARBAGE_ARGS:
printf(" GARBAGE_ARGS");
nfserr = 1; /* suppress trunc string */
return (NULL);
- case SYSTEM_ERR:
+ case SUNRPC_SYSTEM_ERR:
printf(" SYSTEM_ERR");
nfserr = 1; /* suppress trunc string */
return (NULL);
TCHECK(fap->fa3_size);
printf(" sz ");
print_int64((u_int32_t *)&fap->fa3_size, UNSIGNED);
- putchar(' ');
} else {
TCHECK(fap->fa2_size);
- printf(" sz %d ", EXTRACT_32BITS(&fap->fa2_size));
+ printf(" sz %d", EXTRACT_32BITS(&fap->fa2_size));
}
}
/* print lots more stuff */
if (verbose > 1) {
if (v3) {
TCHECK(fap->fa3_ctime);
- printf("nlink %d rdev %d/%d ",
+ printf(" nlink %d rdev %d/%d",
EXTRACT_32BITS(&fap->fa_nlink),
EXTRACT_32BITS(&fap->fa3_rdev.specdata1),
EXTRACT_32BITS(&fap->fa3_rdev.specdata2));
- printf("fsid ");
+ printf(" fsid ");
print_int64((u_int32_t *)&fap->fa3_fsid, HEX);
- printf(" nodeid ");
+ printf(" fileid ");
print_int64((u_int32_t *)&fap->fa3_fileid, HEX);
- printf(" a/m/ctime %u.%06u ",
+ printf(" a/m/ctime %u.%06u",
EXTRACT_32BITS(&fap->fa3_atime.nfsv3_sec),
EXTRACT_32BITS(&fap->fa3_atime.nfsv3_nsec));
- printf("%u.%06u ",
+ printf(" %u.%06u",
EXTRACT_32BITS(&fap->fa3_mtime.nfsv3_sec),
EXTRACT_32BITS(&fap->fa3_mtime.nfsv3_nsec));
- printf("%u.%06u ",
+ printf(" %u.%06u",
EXTRACT_32BITS(&fap->fa3_ctime.nfsv3_sec),
EXTRACT_32BITS(&fap->fa3_ctime.nfsv3_nsec));
} else {
TCHECK(fap->fa2_ctime);
- printf("nlink %d rdev %x fsid %x nodeid %x a/m/ctime ",
+ printf(" nlink %d rdev %x fsid %x nodeid %x a/m/ctime",
EXTRACT_32BITS(&fap->fa_nlink),
EXTRACT_32BITS(&fap->fa2_rdev),
EXTRACT_32BITS(&fap->fa2_fsid),
EXTRACT_32BITS(&fap->fa2_fileid));
- printf("%u.%06u ",
+ printf(" %u.%06u",
EXTRACT_32BITS(&fap->fa2_atime.nfsv2_sec),
EXTRACT_32BITS(&fap->fa2_atime.nfsv2_usec));
- printf("%u.%06u ",
+ printf(" %u.%06u",
EXTRACT_32BITS(&fap->fa2_mtime.nfsv2_sec),
EXTRACT_32BITS(&fap->fa2_mtime.nfsv2_usec));
- printf("%u.%06u ",
+ printf(" %u.%06u",
EXTRACT_32BITS(&fap->fa2_ctime.nfsv2_sec),
EXTRACT_32BITS(&fap->fa2_ctime.nfsv2_usec));
}
if (!(dp = parse_post_op_attr(dp, verbose)))
return (0);
if (vflag > 1) {
- printf("dir attr:");
+ printf(" dir attr:");
dp = parse_wcc_data(dp, verbose);
}
}
}
static void
-interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int length)
+interp_reply(const struct sunrpc_msg *rp, u_int32_t proc, u_int32_t vers, int length)
{
register const u_int32_t *dp;
register int v3;
return;
if (vflag) {
TCHECK(dp[1]);
- printf("%u bytes", EXTRACT_32BITS(&dp[0]));
+ printf(" %u bytes", EXTRACT_32BITS(&dp[0]));
if (EXTRACT_32BITS(&dp[1]))
printf(" EOF");
}
return;
if (vflag) {
TCHECK(dp[0]);
- printf("%u bytes", EXTRACT_32BITS(&dp[0]));
+ printf(" %u bytes", EXTRACT_32BITS(&dp[0]));
if (vflag > 1) {
TCHECK(dp[1]);
printf(" <%s>",