Import Upstream version 1.8.5
[hcoop/debian/openafs.git] / src / rx / xdr_int64.c
1
2 /*
3 * XDR routine for int64 (long long or struct)
4 */
5
6 #include <afsconfig.h>
7 #include <afs/param.h>
8
9
10 #if defined(KERNEL) && !defined(UKERNEL)
11 #ifdef AFS_LINUX20_ENV
12 #include "h/string.h"
13 #else
14 #include <sys/param.h>
15 #include <sys/systm.h>
16 #endif
17 #else
18 #include <roken.h>
19 #endif
20 #include "xdr.h"
21
22 /*
23 * XDR afs_int64 integers
24 */
25 bool_t
26 xdr_int64(XDR * xdrs, afs_int64 * ulp)
27 {
28 return xdr_afs_int64(xdrs, ulp);
29 }
30
31 bool_t
32 xdr_afs_int64(XDR * xdrs, afs_int64 * ulp)
33 {
34 afs_int32 high;
35 afs_uint32 low;
36
37 if (xdrs->x_op == XDR_DECODE) {
38 if (!XDR_GETINT32(xdrs, (afs_int32 *) & high))
39 return (FALSE);
40 if (!XDR_GETINT32(xdrs, (afs_int32 *) & low))
41 return (FALSE);
42 *ulp = high;
43 *ulp <<= 32;
44 *ulp += low;
45 return (TRUE);
46 }
47 if (xdrs->x_op == XDR_ENCODE) {
48 high = (afs_int32) (*ulp >> 32);
49 low = (afs_uint32) (*ulp & 0xFFFFFFFFL);
50 if (!XDR_PUTINT32(xdrs, (afs_int32 *) & high))
51 return (FALSE);
52 return (XDR_PUTINT32(xdrs, (afs_int32 *) & low));
53 }
54 if (xdrs->x_op == XDR_FREE)
55 return (TRUE);
56 return (FALSE);
57 }
58
59 /*
60 * XDR afs_int64 integers
61 */
62 bool_t
63 xdr_uint64(XDR * xdrs, afs_uint64 * ulp)
64 {
65 return xdr_afs_uint64(xdrs, ulp);
66 }
67
68 bool_t
69 xdr_afs_uint64(XDR * xdrs, afs_uint64 * ulp)
70 {
71 afs_uint32 high;
72 afs_uint32 low;
73
74 if (xdrs->x_op == XDR_DECODE) {
75 if (!XDR_GETINT32(xdrs, (afs_int32 *) & high))
76 return (FALSE);
77 if (!XDR_GETINT32(xdrs, (afs_int32 *) & low))
78 return (FALSE);
79 *ulp = high;
80 *ulp <<= 32;
81 *ulp += low;
82 return (TRUE);
83 }
84 if (xdrs->x_op == XDR_ENCODE) {
85 high = (afs_uint32) (*ulp >> 32);
86 low = (afs_uint32) (*ulp & 0xFFFFFFFFL);
87 if (!XDR_PUTINT32(xdrs, (afs_int32 *) & high))
88 return (FALSE);
89 return (XDR_PUTINT32(xdrs, (afs_int32 *) & low));
90 }
91 if (xdrs->x_op == XDR_FREE)
92 return (TRUE);
93 return (FALSE);
94 }
95