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