From 6b245870a4d1af8362c81a57826df708651d3567 Mon Sep 17 00:00:00 2001 From: warlord Date: Fri, 1 Nov 2002 18:13:25 +0000 Subject: [PATCH] add xdr_free prototype 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 | 3 +++ oncrpc/xdr.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/oncrpc/rpc/xdr.h b/oncrpc/rpc/xdr.h index 146372c..96bb1a2 100644 --- a/oncrpc/rpc/xdr.h +++ b/oncrpc/rpc/xdr.h @@ -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); diff --git a/oncrpc/xdr.c b/oncrpc/xdr.c index fc6bab4..1089d0f 100644 --- a/oncrpc/xdr.c +++ b/oncrpc/xdr.c @@ -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! */ -- 2.1.4