Merge data_blob_hex_string from Samba4.
[kai/samba.git] / source3 / lib / data_blob.c
index 860ef5ad10f845ff2a6cd441f0407afb9cb2071d..66c5daf363af67b5ffbb1f90281b178074bb1892 100644 (file)
@@ -6,7 +6,7 @@
    
    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
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    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., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
 
+const DATA_BLOB data_blob_null = { NULL, 0, NULL };
+
 /*******************************************************************
  Free() a data blob.
 *******************************************************************/
@@ -47,9 +48,9 @@ DATA_BLOB data_blob(const void *p, size_t length)
        }
 
        if (p) {
-               ret.data = smb_xmemdup(p, length);
+               ret.data = (uint8 *)smb_xmemdup(p, length);
        } else {
-               ret.data = SMB_XMALLOC_ARRAY(unsigned char, length);
+               ret.data = SMB_XMALLOC_ARRAY(uint8, length);
        }
        ret.length = length;
        ret.free = free_data_blob;
@@ -70,13 +71,13 @@ DATA_BLOB data_blob_talloc(TALLOC_CTX *mem_ctx, const void *p, size_t length)
        }
 
        if (p) {
-               ret.data = TALLOC_MEMDUP(mem_ctx, p, length);
+               ret.data = (uint8 *)TALLOC_MEMDUP(mem_ctx, p, length);
                if (ret.data == NULL)
-                       smb_panic("data_blob_talloc: talloc_memdup failed.\n");
+                       smb_panic("data_blob_talloc: TALLOC_MEMDUP failed");
        } else {
-               ret.data = TALLOC(mem_ctx, length);
+               ret.data = (uint8 *)TALLOC(mem_ctx, length);
                if (ret.data == NULL)
-                       smb_panic("data_blob_talloc: talloc failed.\n");
+                       smb_panic("data_blob_talloc: TALLOC failed");
        }
 
        ret.length = length;
@@ -118,3 +119,62 @@ void data_blob_clear_free(DATA_BLOB *d)
        data_blob_clear(d);
        data_blob_free(d);
 }
+
+/**
+  useful for constructing data blobs in test suites, while
+  avoiding const warnings
+**/
+DATA_BLOB data_blob_string_const(const char *str)
+{
+       DATA_BLOB blob;
+       blob.data = CONST_DISCARD(uint8 *, str);
+       blob.length = strlen(str) + 1;
+       blob.free = NULL;
+       return blob;
+}
+
+/**
+ * Create a new data blob from const data 
+ */
+DATA_BLOB data_blob_const(const void *p, size_t length)
+{
+       DATA_BLOB blob;
+       blob.data = CONST_DISCARD(uint8 *, p);
+       blob.length = length;
+       blob.free = NULL;
+       return blob;
+}
+
+/**
+ construct a zero data blob, using supplied TALLOC_CTX.
+ use this sparingly as it initialises data - better to initialise
+ yourself if you want specific data in the blob
+**/
+DATA_BLOB data_blob_talloc_zero(TALLOC_CTX *mem_ctx, size_t length)
+{
+       DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, length);
+       data_blob_clear(&blob);
+       return blob;
+}
+
+/**
+print the data_blob as hex string
+**/
+_PUBLIC_ char *data_blob_hex_string(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob)
+{
+       int i;
+       char *hex_string;
+
+       hex_string = talloc_array(mem_ctx, char, (blob->length*2)+1);
+       if (!hex_string) {
+               return NULL;
+       }
+
+       for (i = 0; i < blob->length; i++)
+               slprintf(&hex_string[i*2], 3, "%02X", blob->data[i]);
+
+       hex_string[(blob->length*2)] = '\0';
+       return hex_string;
+}
+
+