Add XDR x_flags and XDR_FLAG_CKSUM.

Add a shared flags member to XDR, and use it for fine-grained
control over request checksum behavior.

Internal checksumming when decoding is an acceptable default
since it reduces work for both NFSv3 and NFSv4.0.  Since the
checksum is unecessary for NFSv4.1, allow the caller to omit
the checksum step by clearing the approprite bit in XDR
x_flags.

Signed-off-by: Matt Benjamin <matt@linuxbox.com>
diff --git a/src/xdr_inrec.c b/src/xdr_inrec.c
index b436598..fcc579c 100644
--- a/src/xdr_inrec.c
+++ b/src/xdr_inrec.c
@@ -189,6 +189,7 @@
     xdrs->x_lib[1] = NULL;
     xdrs->x_public = NULL;
     xdrs->x_private = rstrm;
+    xdrs->x_flags = XDR_FLAG_CKSUM;
     rstrm->xdrs = xdrs;
     rstrm->tcp_handle = tcp_handle;
     rstrm->readit = readit;
@@ -212,9 +213,11 @@
     RECSTREAM *rstrm = (RECSTREAM *)(xdrs->x_private);
 
     /* handle checksumming if requested (short request case) */
-    if (! (rstrm->cksum)) {
-        if (rstrm->cklen) {
-            compute_buffer_cksum(rstrm);
+    if (xdrs->x_flags & XDR_FLAG_CKSUM) {
+        if (! (rstrm->cksum)) {
+            if (rstrm->cklen) {
+                compute_buffer_cksum(rstrm);
+            }
         }
     }
 
@@ -276,10 +279,12 @@
         rstrm->fbtbc -= current;
         len -= current;
         /* handle checksumming if requested */
-        if (rstrm->cklen) {
-            if (! (rstrm->cksum)) {
-                if (rstrm->offset >= rstrm->cklen) {
-                    compute_buffer_cksum(rstrm);
+        if (xdrs->x_flags & XDR_FLAG_CKSUM) {
+            if (rstrm->cklen) {
+                if (! (rstrm->cksum)) {
+                    if (rstrm->offset >= rstrm->cklen) {
+                        compute_buffer_cksum(rstrm);
+                    }
                 }
             }
         }
diff --git a/tirpc/rpc/xdr.h b/tirpc/rpc/xdr.h
index 162ecc3..56b093d 100644
--- a/tirpc/rpc/xdr.h
+++ b/tirpc/rpc/xdr.h
@@ -134,6 +134,9 @@
 #define XDR_PUTBUFS_FLAG_NONE   0x0000
 #define XDR_PUTBUFS_FLAG_BRELE  0x0001
 
+#define XDR_FLAG_NONE    0x0000
+#define XDR_FLAG_CKSUM   0x0001
+
 /*
  * The XDR handle.
  * Contains operation which is being applied to the stream,
@@ -169,6 +172,7 @@
     void *x_lib[2]; /* RPC library private */
     void *x_base;  /* private used for position info */
     u_int x_handy; /* extra private word */
+    u_int x_flags; /* shared flags */
 } XDR;
 
 /*