]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/serial.c
Real fix of bug #1897
[bacula/bacula] / bacula / src / lib / serial.c
index c1e5c3f73e1fd55d06c1d68ff7af362d77b06950..2a2e48ddb211cb7504d430451b67272ba71c0ba3 100644 (file)
@@ -1,28 +1,35 @@
 /*
 
-                  Serialisation Support Functions
-                         John Walker
-
+                   Serialisation Support Functions
+                          John Walker
 */
 /*
-   Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
+   Bacula® - The Network Backup Solution
+
+   Copyright (C) 2000-2011 Free Software Foundation Europe e.V.
 
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 2 of
-   the License, or (at your option) any later version.
+   The main author of Bacula is Kern Sibbald, with contributions from
+   many others, a complete list can be found in the file AUTHORS.
+   This program is Free Software; you can redistribute it and/or
+   modify it under the terms of version three of the GNU Affero General Public
+   License as published by the Free Software Foundation and included
+   in the file LICENSE.
 
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with this program; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
-   MA 02111-1307, USA.
+   You should have received a copy of the GNU Affero General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
 
- */
+   Bacula® is a registered trademark of Kern Sibbald.
+   The licensor of Bacula is the Free Software Foundation Europe
+   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+   Switzerland, email:ftf@fsfeurope.org.
+*/
 
 
 #include "bacula.h"
 
 /*
 
-       NOTE:  The following functions should work on any
-              vaguely contemporary platform.  Production
-              builds should use optimised macros (void
-              on platforms with network byte order and IEEE
-              floating point format as native.
+        NOTE:  The following functions should work on any
+               vaguely contemporary platform.  Production
+               builds should use optimised macros (void
+               on platforms with network byte order and IEEE
+               floating point format as native.
 
 */
 
@@ -82,17 +89,17 @@ void serial_uint32(uint8_t * * const ptr, const uint32_t v)
 
 void serial_int64(uint8_t * * const ptr, const int64_t v)
 {
-    if (htonl(1) == 1L) {
-       memcpy(*ptr, &v, sizeof(int64_t));
+    if (bigendian()) {
+        memcpy(*ptr, &v, sizeof(int64_t));
     } else {
-       int i;
-       uint8_t rv[sizeof(int64_t)];
-       uint8_t *pv = (uint8_t *) &v;
-
-       for (i = 0; i < 8; i++) {
-           rv[i] = pv[7 - i];
-       }
-       memcpy(*ptr, &rv, sizeof(int64_t));
+        int i;
+        uint8_t rv[sizeof(int64_t)];
+        uint8_t *pv = (uint8_t *) &v;
+
+        for (i = 0; i < 8; i++) {
+            rv[i] = pv[7 - i];
+        }
+        memcpy(*ptr, &rv, sizeof(int64_t));
     }
     *ptr += sizeof(int64_t);
 }
@@ -102,55 +109,82 @@ void serial_int64(uint8_t * * const ptr, const int64_t v)
 
 void serial_uint64(uint8_t * * const ptr, const uint64_t v)
 {
-    if (htonl(1) == 1L) {
-       memcpy(*ptr, &v, sizeof(uint64_t));
+    if (bigendian()) {
+        memcpy(*ptr, &v, sizeof(uint64_t));
     } else {
-       int i;
-       uint8_t rv[sizeof(uint64_t)];
-       uint8_t *pv = (uint8_t *) &v;
-
-       for (i = 0; i < 8; i++) {
-           rv[i] = pv[7 - i];
-       }
-       memcpy(*ptr, &rv, sizeof(uint64_t));
+        int i;
+        uint8_t rv[sizeof(uint64_t)];
+        uint8_t *pv = (uint8_t *) &v;
+
+        for (i = 0; i < 8; i++) {
+            rv[i] = pv[7 - i];
+        }
+        memcpy(*ptr, &rv, sizeof(uint64_t));
     }
     *ptr += sizeof(uint64_t);
 }
 
 
-/*  serial_float64  -- Serialise a 64 bit IEEE floating point number.
-                       This code assumes that the host floating point
-                       format is IEEE and that floating point quantities
-                       are stored in IEEE format either LSB first or MSB
-                       first.  More creative host formats will require
-                       additional transformations here.  */
+/*  serial_btime  --  Serialise an btime_t 64 bit integer.  */
+
+void serial_btime(uint8_t * * const ptr, const btime_t v)
+{
+    if (bigendian()) {
+        memcpy(*ptr, &v, sizeof(btime_t));
+    } else {
+        int i;
+        uint8_t rv[sizeof(btime_t)];
+        uint8_t *pv = (uint8_t *) &v;
+
+        for (i = 0; i < 8; i++) {
+            rv[i] = pv[7 - i];
+        }
+        memcpy(*ptr, &rv, sizeof(btime_t));
+    }
+    *ptr += sizeof(btime_t);
+}
+
+
+
+/*  serial_float64  --  Serialise a 64 bit IEEE floating point number.
+                        This code assumes that the host floating point
+                        format is IEEE and that floating point quantities
+                        are stored in IEEE format either LSB first or MSB
+                        first.  More creative host formats will require
+                        additional transformations here.  */
 
 void serial_float64(uint8_t * * const ptr, const float64_t v)
 {
-    if (htonl(1) == 1L) {
-       memcpy(*ptr, &v, sizeof(float64_t));
+    if (bigendian()) {
+        memcpy(*ptr, &v, sizeof(float64_t));
     } else {
-       int i;
-       uint8_t rv[sizeof(float64_t)];
-       uint8_t *pv = (uint8_t *) &v;
-
-       for (i = 0; i < 8; i++) {
-           rv[i] = pv[7 - i];
-       }
-       memcpy(*ptr, &rv, sizeof(float64_t));
+        int i;
+        uint8_t rv[sizeof(float64_t)];
+        uint8_t *pv = (uint8_t *) &v;
+
+        for (i = 0; i < 8; i++) {
+            rv[i] = pv[7 - i];
+        }
+        memcpy(*ptr, &rv, sizeof(float64_t));
     }
     *ptr += sizeof(float64_t);
 }
 
-int serial_string(uint8_t * const ptr, char * const str)
+void serial_string(uint8_t * * const ptr, const char * const str)
 {
-   int len = strlen((const char *) str) + 1;
-   memcpy(ptr, str, len);
-   return len;
+   int i;                   
+   char *dest = (char *)*ptr;
+   char *src = (char *)str;
+   for (i=0; src[i] != 0;  i++) {
+      dest[i] = src[i];
+   }
+   dest[i++] = 0;                  /* terminate output string */
+   *ptr += i;                      /* update pointer */
+// Dmsg2(000, "ser src=%s dest=%s\n", src, dest);
 }
 
 
-/*  unserial_int16  -- Unserialise a signed 16 bit integer.  */
+/*  unserial_int16  --  Unserialise a signed 16 bit integer.  */
 
 int16_t unserial_int16(uint8_t * * const ptr)
 {
@@ -172,7 +206,7 @@ uint16_t unserial_uint16(uint8_t * * const ptr)
     return ntohs(vo);
 }
 
-/*  unserial_int32  -- Unserialise a signed 32 bit integer.  */
+/*  unserial_int32  --  Unserialise a signed 32 bit integer.  */
 
 int32_t unserial_int32(uint8_t * * const ptr)
 {
@@ -194,84 +228,91 @@ uint32_t unserial_uint32(uint8_t * * const ptr)
     return ntohl(vo);
 }
 
-/*  unserial_int64  -- Unserialise a signed 64 bit integer.  */
+/*  unserial_uint64  --  Unserialise an unsigned 64 bit integer.  */
 
-int64_t unserial_int64(uint8_t * * const ptr)
+uint64_t unserial_uint64(uint8_t * * const ptr)
 {
-    int64_t v;
+    uint64_t v;
 
-    if (htonl(1) == 1L) {
-       memcpy(&v, *ptr, sizeof(int64_t));
+    if (bigendian()) {
+        memcpy(&v, *ptr, sizeof(uint64_t));
     } else {
-       int i;
-       uint8_t rv[sizeof(int64_t)];
-       uint8_t *pv = (uint8_t *) &v;
-
-       memcpy(&v, *ptr, sizeof(int64_t));
-       for (i = 0; i < 8; i++) {
-           rv[i] = pv[7 - i];
-       }
-       memcpy(&v, &rv, sizeof(int64_t));
+        int i;
+        uint8_t rv[sizeof(uint64_t)];
+        uint8_t *pv = (uint8_t *) &v;
+
+        memcpy(&v, *ptr, sizeof(uint64_t));
+        for (i = 0; i < 8; i++) {
+            rv[i] = pv[7 - i];
+        }
+        memcpy(&v, &rv, sizeof(uint64_t));
     }
-    *ptr += sizeof(int64_t);
+    *ptr += sizeof(uint64_t);
     return v;
 }
 
-/*  unserial_uint64  --  Unserialise an unsigned 64 bit integer.  */
+/*  unserial_btime  --  Unserialise a btime_t 64 bit integer.  */
 
-uint64_t unserial_uint64(uint8_t * * const ptr)
+btime_t unserial_btime(uint8_t * * const ptr)
 {
-    uint64_t v;
+    btime_t v;
 
-    if (htonl(1) == 1L) {
-       memcpy(&v, *ptr, sizeof(uint64_t));
+    if (bigendian()) {
+        memcpy(&v, *ptr, sizeof(btime_t));
     } else {
-       int i;
-       uint8_t rv[sizeof(uint64_t)];
-       uint8_t *pv = (uint8_t *) &v;
-
-       memcpy(&v, *ptr, sizeof(uint64_t));
-       for (i = 0; i < 8; i++) {
-           rv[i] = pv[7 - i];
-       }
-       memcpy(&v, &rv, sizeof(uint64_t));
+        int i;
+        uint8_t rv[sizeof(btime_t)];
+        uint8_t *pv = (uint8_t *) &v;
+
+        memcpy(&v, *ptr, sizeof(btime_t));
+        for (i = 0; i < 8; i++) {
+            rv[i] = pv[7 - i];
+        }
+        memcpy(&v, &rv, sizeof(btime_t));
     }
-    *ptr += sizeof(uint64_t);
+    *ptr += sizeof(btime_t);
     return v;
 }
 
 
+
 /*  unserial_float64  --  Unserialise a 64 bit IEEE floating point number.
-                        This code assumes that the host floating point
-                        format is IEEE and that floating point quantities
-                        are stored in IEEE format either LSB first or MSB
-                        first.  More creative host formats will require
-                        additional transformations here.  */
+                         This code assumes that the host floating point
+                         format is IEEE and that floating point quantities
+                         are stored in IEEE format either LSB first or MSB
+                         first.  More creative host formats will require
+                         additional transformations here.  */
 
 float64_t unserial_float64(uint8_t * * const ptr)
 {
     float64_t v;
 
-    if (htonl(1) == 1L) {
-       memcpy(&v, *ptr, sizeof(float64_t));
+    if (bigendian()) {
+        memcpy(&v, *ptr, sizeof(float64_t));
     } else {
-       int i;
-       uint8_t rv[sizeof(float64_t)];
-       uint8_t *pv = (uint8_t *) &v;
-
-       memcpy(&v, *ptr, sizeof(float64_t));
-       for (i = 0; i < 8; i++) {
-           rv[i] = pv[7 - i];
-       }
-       memcpy(&v, &rv, sizeof(float64_t));
+        int i;
+        uint8_t rv[sizeof(float64_t)];
+        uint8_t *pv = (uint8_t *) &v;
+
+        memcpy(&v, *ptr, sizeof(float64_t));
+        for (i = 0; i < 8; i++) {
+            rv[i] = pv[7 - i];
+        }
+        memcpy(&v, &rv, sizeof(float64_t));
     }
     *ptr += sizeof(float64_t);
     return v;
 }
 
-int unserial_string(uint8_t  * const ptr, char * const str)
+void unserial_string(uint8_t * * const ptr, char * const str, int max)
 {
-   int len = strlen((char *)ptr) + 1;
-   memcpy(str, ptr, len);
-   return len;
+   int i;                   
+   char *src = (char*)(*ptr);
+   char *dest = str;
+   for (i=0; i<max && src[i] != 0;  i++) {
+      dest[i] = src[i];
+   }
+   dest[i++] = 0;            /* terminate output string */
+   *ptr += i;                /* update pointer */
+// Dmsg2(000, "unser src=%s dest=%s\n", src, dest);
 }