add xdr_free prototype
authorwarlord <warlord@cb58f699-b61c-0410-a6fe-9272a202ed29>
Fri, 1 Nov 2002 18:13:25 +0000 (18:13 +0000)
committerwarlord <warlord@cb58f699-b61c-0410-a6fe-9272a202ed29>
Fri, 1 Nov 2002 18:13:25 +0000 (18:13 +0000)
create xdr_int64_t() and xdr_uint64_t()

git-svn-id: https://svn.middleware.georgetown.edu/cpp-sp/trunk@189 cb58f699-b61c-0410-a6fe-9272a202ed29

oncrpc/rpc/xdr.h
oncrpc/xdr.c

index 146372c..96bb1a2 100644 (file)
@@ -239,9 +239,12 @@ struct xdr_discrim {
 /*
  * These are the "generic" xdr routines.
  */
+extern bool_t  xdr_free(DOTS);
 extern bool_t  xdr_void(DOTS);
 extern bool_t  xdr_int(DOTS);
 extern bool_t  xdr_u_int(DOTS);
+extern bool_t  xdr_int64_t(DOTS);
+extern bool_t  xdr_uint64_t(DOTS);
 extern bool_t  xdr_long(DOTS);
 extern bool_t  xdr_u_long(DOTS);
 extern bool_t  xdr_short(DOTS);
index fc6bab4..1089d0f 100644 (file)
@@ -140,6 +140,80 @@ xdr_u_int(xdrs, up)
 }
 
 /*
+ * XDR 64-bit integers
+ */
+bool_t
+xdr_int64_t(xdrs, ip)
+       XDR *xdrs;
+       int64_t *ip;
+{
+  if (sizeof (int64_t) <= sizeof (long)) {
+    return (xdr_long(xdrs, (long *)ip));
+  } else {
+    /* Assumes sizeof(long) == 4 */
+    int32_t t1;
+    uint32_t t2;
+    
+    switch (xdrs->x_op) {
+    case XDR_ENCODE:
+      t1 = (int32_t) ((*ip) >> 32);
+      t2 = (int32_t) (*ip);
+      return (XDR_PUTLONG(xdrs, &t1) && XDR_PUTLONG(xdrs, &t2));
+      
+    case XDR_DECODE:
+      if (!XDR_GETLONG(xdrs, &t1) || !XDR_GETLONG(xdrs, &t2))
+       return FALSE;
+      *ip = ((int64_t) t1) << 32;
+      *ip |= t2;
+      return TRUE;
+
+    case XDR_FREE:
+      return TRUE;
+
+    default:
+      return FALSE;
+    }
+  }
+}
+
+/*
+ * XDR unsigned 64-bit integers
+ */
+bool_t
+xdr_uint64_t(xdrs, up)
+       XDR *xdrs;
+       uint64_t *up;
+{
+  if (sizeof (int64_t) <= sizeof (long)) {
+    return (xdr_long(xdrs, (long *)up));
+  } else {
+    /* Assumes sizeof(long) == 4 */
+    uint32_t t1;
+    uint32_t t2;
+    
+    switch (xdrs->x_op) {
+    case XDR_ENCODE:
+      t1 = (uint32_t) ((*up) >> 32);
+      t2 = (uint32_t) (*up);
+      return (XDR_PUTLONG(xdrs, &t1) && XDR_PUTLONG(xdrs, &t2));
+      
+    case XDR_DECODE:
+      if (!XDR_GETLONG(xdrs, &t1) || !XDR_GETLONG(xdrs, &t2))
+       return FALSE;
+      *up = ((uint64_t) t1) << 32;
+      *up |= t2;
+      return TRUE;
+
+    case XDR_FREE:
+      return TRUE;
+
+    default:
+      return FALSE;
+    }
+  }
+}
+
+/*
  * XDR long integers
  * same as xdr_u_long - open coded to save a proc call!
  */