aix-51-support-20030701
[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 RCSID("$Header$");
10
11 #if defined(KERNEL) && !defined(UKERNEL)
12 #ifdef AFS_LINUX20_ENV
13 #include "h/string.h"
14 #else
15 #include <sys/param.h>
16 #include <sys/systm.h>
17 #endif
18 #else
19 #include <stdio.h>
20 #endif
21 #include "xdr.h"
22 #if defined(KERNEL) && !defined(UKERNEL)
23 #ifdef        AFS_DEC_ENV
24 #include <afs/longc_procs.h>
25 #endif
26 #endif
27
28 #ifdef AFS_64BIT_ENV
29 /*
30  * XDR afs_int64 integers
31  */
32 bool_t xdr_int64(register XDR *xdrs, afs_int64 *ulp)
33 {
34         return xdr_afs_int64(xdrs, ulp);
35 }
36
37 bool_t xdr_afs_int64(register XDR *xdrs, afs_int64 *ulp)
38 {
39         afs_int32 high;
40         afs_uint32 low;
41
42         if (xdrs->x_op == XDR_DECODE) {
43                 if (!XDR_GETINT32(xdrs, (afs_int32 *) &high)) return (FALSE);
44                 if (!XDR_GETINT32(xdrs, (afs_int32 *) &low)) return (FALSE);
45                 *ulp = high;
46                 *ulp <<= 32;
47                 *ulp += low;
48                 return (TRUE);
49         }
50         if (xdrs->x_op == XDR_ENCODE) {
51                 high = (*ulp >> 32);
52                 low = *ulp & 0xFFFFFFFFL;
53                 if (!XDR_PUTINT32(xdrs, (afs_int32 *) &high)) return (FALSE);
54                 return (XDR_PUTINT32(xdrs, (afs_int32 *) &low));
55         }
56         if (xdrs->x_op == XDR_FREE)
57                 return (TRUE);
58         return (FALSE);
59 }
60
61 /*
62  * XDR afs_int64 integers
63  */
64 bool_t xdr_uint64(register XDR *xdrs, afs_uint64 *ulp)
65 {
66         return xdr_afs_uint64(xdrs, ulp);
67 }
68 bool_t xdr_afs_uint64(register XDR *xdrs, afs_uint64 *ulp)
69 {
70         afs_uint32 high;
71         afs_uint32 low;
72
73         if (xdrs->x_op == XDR_DECODE) {
74                 if (!XDR_GETINT32(xdrs, (afs_uint32 *) &high)) return (FALSE);
75                 if (!XDR_GETINT32(xdrs, (afs_uint32 *) &low)) return (FALSE);
76                 *ulp = high;
77                 *ulp <<= 32;
78                 *ulp += low;
79                 return (TRUE);
80         }
81         if (xdrs->x_op == XDR_ENCODE) {
82                 high = (*ulp >> 32);
83                 low = *ulp & 0xFFFFFFFFL;
84                 if (!XDR_PUTINT32(xdrs, (afs_uint32 *) &high)) return (FALSE);
85                 return (XDR_PUTINT32(xdrs, (afs_uint32 *) &low));
86         }
87         if (xdrs->x_op == XDR_FREE)
88                 return (TRUE);
89         return (FALSE);
90 }
91
92 #else /* AFS_64BIT_ENV */
93 /*
94  * XDR afs_int64 integers
95  */
96 bool_t xdr_int64(register XDR *xdrs, afs_int64 *ulp)
97 {
98         return xdr_afs_int64(xdrs, ulp);
99 }
100 bool_t xdr_afs_int64(register XDR *xdrs, afs_int64 *ulp)
101 {
102         if (xdrs->x_op == XDR_DECODE) {
103                 if (!XDR_GETINT32(xdrs, (afs_int32 *) &ulp->high)) return (FALSE);
104                 return (XDR_GETINT32(xdrs, (afs_int32 *) &ulp->low));
105         }
106         if (xdrs->x_op == XDR_ENCODE) {
107                 if (!XDR_PUTINT32(xdrs, (afs_int32 *) &ulp->high)) return (FALSE);
108                 return (XDR_PUTINT32(xdrs, (afs_int32 *) &ulp->low));
109         }
110         if (xdrs->x_op == XDR_FREE)
111                 return (TRUE);
112         return (FALSE);
113 }
114
115 /*
116  * XDR afs_uint64 integers
117  */
118 bool_t xdr_uint64(register XDR *xdrs, afs_uint64 *ulp)
119 {
120         return xdr_afs_uint64(xdrs, ulp);
121 }
122 bool_t xdr_afs_uint64(register XDR *xdrs, afs_uint64 *ulp)
123 {
124         if (xdrs->x_op == XDR_DECODE) {
125                 if (!XDR_GETINT32(xdrs, (afs_uint32 *) &ulp->high)) return (FALSE);
126                 return (XDR_GETINT32(xdrs, (afs_uint32 *) &ulp->low));
127         }
128         if (xdrs->x_op == XDR_ENCODE) {
129                 if (!XDR_PUTINT32(xdrs, (afs_uint32 *) &ulp->high)) return (FALSE);
130                 return (XDR_PUTINT32(xdrs, (afs_uint32 *) &ulp->low));
131         }
132         if (xdrs->x_op == XDR_FREE)
133                 return (TRUE);
134         return (FALSE);
135 }
136 #endif /* AFS_64BIT_ENV */