2 Bacula(R) - The Network Backup Solution
4 Copyright (C) 2000-2015 Kern Sibbald
5 Copyright (C) 2000-2014 Free Software Foundation Europe e.V.
7 The original author of Bacula is Kern Sibbald, with contributions
8 from many others, a complete list can be found in the file AUTHORS.
10 You may use this file and others of this release according to the
11 license defined in the LICENSE file, which includes the Affero General
12 Public License, v3.0 ("AGPLv3") and some additional permissions and
13 terms pursuant to its AGPLv3 Section 7.
15 This notice must be preserved when any source code is
16 conveyed and/or propagated.
18 Bacula(R) is a registered trademark of Kern Sibbald.
22 Serialisation Support Functions
32 NOTE: The following functions should work on any
33 vaguely contemporary platform. Production
34 builds should use optimised macros (void
35 on platforms with network byte order and IEEE
36 floating point format as native.
40 /* serial_int16 -- Serialise a signed 16 bit integer. */
42 void serial_int16(uint8_t * * const ptr, const int16_t v)
44 int16_t vo = htons(v);
46 memcpy(*ptr, &vo, sizeof vo);
50 /* serial_uint16 -- Serialise an unsigned 16 bit integer. */
52 void serial_uint16(uint8_t * * const ptr, const uint16_t v)
54 uint16_t vo = htons(v);
56 memcpy(*ptr, &vo, sizeof vo);
60 /* serial_int32 -- Serialise a signed 32 bit integer. */
62 void serial_int32(uint8_t * * const ptr, const int32_t v)
64 int32_t vo = htonl(v);
66 memcpy(*ptr, &vo, sizeof vo);
70 /* serial_uint32 -- Serialise an unsigned 32 bit integer. */
72 void serial_uint32(uint8_t * * const ptr, const uint32_t v)
74 uint32_t vo = htonl(v);
76 memcpy(*ptr, &vo, sizeof vo);
80 /* serial_int64 -- Serialise a signed 64 bit integer. */
82 void serial_int64(uint8_t * * const ptr, const int64_t v)
85 memcpy(*ptr, &v, sizeof(int64_t));
88 uint8_t rv[sizeof(int64_t)];
89 uint8_t *pv = (uint8_t *) &v;
91 for (i = 0; i < 8; i++) {
94 memcpy(*ptr, &rv, sizeof(int64_t));
96 *ptr += sizeof(int64_t);
100 /* serial_uint64 -- Serialise an unsigned 64 bit integer. */
102 void serial_uint64(uint8_t * * const ptr, const uint64_t v)
105 memcpy(*ptr, &v, sizeof(uint64_t));
108 uint8_t rv[sizeof(uint64_t)];
109 uint8_t *pv = (uint8_t *) &v;
111 for (i = 0; i < 8; i++) {
114 memcpy(*ptr, &rv, sizeof(uint64_t));
116 *ptr += sizeof(uint64_t);
120 /* serial_btime -- Serialise an btime_t 64 bit integer. */
122 void serial_btime(uint8_t * * const ptr, const btime_t v)
125 memcpy(*ptr, &v, sizeof(btime_t));
128 uint8_t rv[sizeof(btime_t)];
129 uint8_t *pv = (uint8_t *) &v;
131 for (i = 0; i < 8; i++) {
134 memcpy(*ptr, &rv, sizeof(btime_t));
136 *ptr += sizeof(btime_t);
141 /* serial_float64 -- Serialise a 64 bit IEEE floating point number.
142 This code assumes that the host floating point
143 format is IEEE and that floating point quantities
144 are stored in IEEE format either LSB first or MSB
145 first. More creative host formats will require
146 additional transformations here. */
148 void serial_float64(uint8_t * * const ptr, const float64_t v)
151 memcpy(*ptr, &v, sizeof(float64_t));
154 uint8_t rv[sizeof(float64_t)];
155 uint8_t *pv = (uint8_t *) &v;
157 for (i = 0; i < 8; i++) {
160 memcpy(*ptr, &rv, sizeof(float64_t));
162 *ptr += sizeof(float64_t);
165 void serial_string(uint8_t * * const ptr, const char * const str)
168 char *dest = (char *)*ptr;
169 char *src = (char *)str;
170 for (i=0; src[i] != 0; i++) {
173 dest[i++] = 0; /* terminate output string */
174 *ptr += i; /* update pointer */
175 // Dmsg2(000, "ser src=%s dest=%s\n", src, dest);
179 /* unserial_int16 -- Unserialise a signed 16 bit integer. */
181 int16_t unserial_int16(uint8_t * * const ptr)
185 memcpy(&vo, *ptr, sizeof vo);
190 /* unserial_uint16 -- Unserialise an unsigned 16 bit integer. */
192 uint16_t unserial_uint16(uint8_t * * const ptr)
196 memcpy(&vo, *ptr, sizeof vo);
201 /* unserial_int32 -- Unserialise a signed 32 bit integer. */
203 int32_t unserial_int32(uint8_t * * const ptr)
207 memcpy(&vo, *ptr, sizeof vo);
212 /* unserial_uint32 -- Unserialise an unsigned 32 bit integer. */
214 uint32_t unserial_uint32(uint8_t * * const ptr)
218 memcpy(&vo, *ptr, sizeof vo);
223 /* unserial_int64 -- Unserialise a 64 bit integer. */
225 int64_t unserial_int64(uint8_t * * const ptr)
230 memcpy(&v, *ptr, sizeof(int64_t));
233 uint8_t rv[sizeof(int64_t)];
234 uint8_t *pv = (uint8_t *) &v;
236 memcpy(&v, *ptr, sizeof(uint64_t));
237 for (i = 0; i < 8; i++) {
240 memcpy(&v, &rv, sizeof(uint64_t));
242 *ptr += sizeof(uint64_t);
246 /* unserial_uint64 -- Unserialise an unsigned 64 bit integer. */
248 uint64_t unserial_uint64(uint8_t * * const ptr)
253 memcpy(&v, *ptr, sizeof(uint64_t));
256 uint8_t rv[sizeof(uint64_t)];
257 uint8_t *pv = (uint8_t *) &v;
259 memcpy(&v, *ptr, sizeof(uint64_t));
260 for (i = 0; i < 8; i++) {
263 memcpy(&v, &rv, sizeof(uint64_t));
265 *ptr += sizeof(uint64_t);
269 /* unserial_btime -- Unserialise a btime_t 64 bit integer. */
271 btime_t unserial_btime(uint8_t * * const ptr)
276 memcpy(&v, *ptr, sizeof(btime_t));
279 uint8_t rv[sizeof(btime_t)];
280 uint8_t *pv = (uint8_t *) &v;
282 memcpy(&v, *ptr, sizeof(btime_t));
283 for (i = 0; i < 8; i++) {
286 memcpy(&v, &rv, sizeof(btime_t));
288 *ptr += sizeof(btime_t);
294 /* unserial_float64 -- Unserialise a 64 bit IEEE floating point number.
295 This code assumes that the host floating point
296 format is IEEE and that floating point quantities
297 are stored in IEEE format either LSB first or MSB
298 first. More creative host formats will require
299 additional transformations here. */
301 float64_t unserial_float64(uint8_t * * const ptr)
306 memcpy(&v, *ptr, sizeof(float64_t));
309 uint8_t rv[sizeof(float64_t)];
310 uint8_t *pv = (uint8_t *) &v;
312 memcpy(&v, *ptr, sizeof(float64_t));
313 for (i = 0; i < 8; i++) {
316 memcpy(&v, &rv, sizeof(float64_t));
318 *ptr += sizeof(float64_t);
322 void unserial_string(uint8_t * * const ptr, char * const str, int max)
325 char *src = (char*)(*ptr);
327 for (i=0; i<max && src[i] != 0; i++) {
330 dest[i++] = 0; /* terminate output string */
331 *ptr += i; /* update pointer */
332 // Dmsg2(000, "unser src=%s dest=%s\n", src, dest);