3 Serialisation Support Functions
7 Bacula® - The Network Backup Solution
9 Copyright (C) 2000-2014 Free Software Foundation Europe e.V.
11 The main author of Bacula is Kern Sibbald, with contributions from many
12 others, a complete list can be found in the file AUTHORS.
14 You may use this file and others of this release according to the
15 license defined in the LICENSE file, which includes the Affero General
16 Public License, v3.0 ("AGPLv3") and some additional permissions and
17 terms pursuant to its AGPLv3 Section 7.
19 Bacula® is a registered trademark of Kern Sibbald.
28 NOTE: The following functions should work on any
29 vaguely contemporary platform. Production
30 builds should use optimised macros (void
31 on platforms with network byte order and IEEE
32 floating point format as native.
36 /* serial_int16 -- Serialise a signed 16 bit integer. */
38 void serial_int16(uint8_t * * const ptr, const int16_t v)
40 int16_t vo = htons(v);
42 memcpy(*ptr, &vo, sizeof vo);
46 /* serial_uint16 -- Serialise an unsigned 16 bit integer. */
48 void serial_uint16(uint8_t * * const ptr, const uint16_t v)
50 uint16_t vo = htons(v);
52 memcpy(*ptr, &vo, sizeof vo);
56 /* serial_int32 -- Serialise a signed 32 bit integer. */
58 void serial_int32(uint8_t * * const ptr, const int32_t v)
60 int32_t vo = htonl(v);
62 memcpy(*ptr, &vo, sizeof vo);
66 /* serial_uint32 -- Serialise an unsigned 32 bit integer. */
68 void serial_uint32(uint8_t * * const ptr, const uint32_t v)
70 uint32_t vo = htonl(v);
72 memcpy(*ptr, &vo, sizeof vo);
76 /* serial_int64 -- Serialise a signed 64 bit integer. */
78 void serial_int64(uint8_t * * const ptr, const int64_t v)
81 memcpy(*ptr, &v, sizeof(int64_t));
84 uint8_t rv[sizeof(int64_t)];
85 uint8_t *pv = (uint8_t *) &v;
87 for (i = 0; i < 8; i++) {
90 memcpy(*ptr, &rv, sizeof(int64_t));
92 *ptr += sizeof(int64_t);
96 /* serial_uint64 -- Serialise an unsigned 64 bit integer. */
98 void serial_uint64(uint8_t * * const ptr, const uint64_t v)
101 memcpy(*ptr, &v, sizeof(uint64_t));
104 uint8_t rv[sizeof(uint64_t)];
105 uint8_t *pv = (uint8_t *) &v;
107 for (i = 0; i < 8; i++) {
110 memcpy(*ptr, &rv, sizeof(uint64_t));
112 *ptr += sizeof(uint64_t);
116 /* serial_btime -- Serialise an btime_t 64 bit integer. */
118 void serial_btime(uint8_t * * const ptr, const btime_t v)
121 memcpy(*ptr, &v, sizeof(btime_t));
124 uint8_t rv[sizeof(btime_t)];
125 uint8_t *pv = (uint8_t *) &v;
127 for (i = 0; i < 8; i++) {
130 memcpy(*ptr, &rv, sizeof(btime_t));
132 *ptr += sizeof(btime_t);
137 /* serial_float64 -- Serialise a 64 bit IEEE floating point number.
138 This code assumes that the host floating point
139 format is IEEE and that floating point quantities
140 are stored in IEEE format either LSB first or MSB
141 first. More creative host formats will require
142 additional transformations here. */
144 void serial_float64(uint8_t * * const ptr, const float64_t v)
147 memcpy(*ptr, &v, sizeof(float64_t));
150 uint8_t rv[sizeof(float64_t)];
151 uint8_t *pv = (uint8_t *) &v;
153 for (i = 0; i < 8; i++) {
156 memcpy(*ptr, &rv, sizeof(float64_t));
158 *ptr += sizeof(float64_t);
161 void serial_string(uint8_t * * const ptr, const char * const str)
164 char *dest = (char *)*ptr;
165 char *src = (char *)str;
166 for (i=0; src[i] != 0; i++) {
169 dest[i++] = 0; /* terminate output string */
170 *ptr += i; /* update pointer */
171 // Dmsg2(000, "ser src=%s dest=%s\n", src, dest);
175 /* unserial_int16 -- Unserialise a signed 16 bit integer. */
177 int16_t unserial_int16(uint8_t * * const ptr)
181 memcpy(&vo, *ptr, sizeof vo);
186 /* unserial_uint16 -- Unserialise an unsigned 16 bit integer. */
188 uint16_t unserial_uint16(uint8_t * * const ptr)
192 memcpy(&vo, *ptr, sizeof vo);
197 /* unserial_int32 -- Unserialise a signed 32 bit integer. */
199 int32_t unserial_int32(uint8_t * * const ptr)
203 memcpy(&vo, *ptr, sizeof vo);
208 /* unserial_uint32 -- Unserialise an unsigned 32 bit integer. */
210 uint32_t unserial_uint32(uint8_t * * const ptr)
214 memcpy(&vo, *ptr, sizeof vo);
219 /* unserial_uint64 -- Unserialise an unsigned 64 bit integer. */
221 uint64_t unserial_uint64(uint8_t * * const ptr)
226 memcpy(&v, *ptr, sizeof(uint64_t));
229 uint8_t rv[sizeof(uint64_t)];
230 uint8_t *pv = (uint8_t *) &v;
232 memcpy(&v, *ptr, sizeof(uint64_t));
233 for (i = 0; i < 8; i++) {
236 memcpy(&v, &rv, sizeof(uint64_t));
238 *ptr += sizeof(uint64_t);
242 /* unserial_btime -- Unserialise a btime_t 64 bit integer. */
244 btime_t unserial_btime(uint8_t * * const ptr)
249 memcpy(&v, *ptr, sizeof(btime_t));
252 uint8_t rv[sizeof(btime_t)];
253 uint8_t *pv = (uint8_t *) &v;
255 memcpy(&v, *ptr, sizeof(btime_t));
256 for (i = 0; i < 8; i++) {
259 memcpy(&v, &rv, sizeof(btime_t));
261 *ptr += sizeof(btime_t);
267 /* unserial_float64 -- Unserialise a 64 bit IEEE floating point number.
268 This code assumes that the host floating point
269 format is IEEE and that floating point quantities
270 are stored in IEEE format either LSB first or MSB
271 first. More creative host formats will require
272 additional transformations here. */
274 float64_t unserial_float64(uint8_t * * const ptr)
279 memcpy(&v, *ptr, sizeof(float64_t));
282 uint8_t rv[sizeof(float64_t)];
283 uint8_t *pv = (uint8_t *) &v;
285 memcpy(&v, *ptr, sizeof(float64_t));
286 for (i = 0; i < 8; i++) {
289 memcpy(&v, &rv, sizeof(float64_t));
291 *ptr += sizeof(float64_t);
295 void unserial_string(uint8_t * * const ptr, char * const str, int max)
298 char *src = (char*)(*ptr);
300 for (i=0; i<max && src[i] != 0; i++) {
303 dest[i++] = 0; /* terminate output string */
304 *ptr += i; /* update pointer */
305 // Dmsg2(000, "unser src=%s dest=%s\n", src, dest);