r9794: r11627@blu: tridge | 2005-08-30 22:55:27 +1000
[jra/samba/.git] / source4 / lib / data_blob.c
index c5f15f12710809bae299106ae365b1e305625065..049210e8eeea73691495031cc43c9e0b4ffef1e1 100644 (file)
@@ -29,7 +29,7 @@ DATA_BLOB data_blob_named(const void *p, size_t length, const char *name)
 {
        DATA_BLOB ret;
 
-       if (length == 0) {
+       if (p == NULL && length == 0) {
                ZERO_STRUCT(ret);
                return ret;
        }
@@ -37,7 +37,7 @@ DATA_BLOB data_blob_named(const void *p, size_t length, const char *name)
        if (p) {
                ret.data = talloc_memdup(NULL, p, length);
        } else {
-               ret.data = talloc(NULL, length);
+               ret.data = talloc_size(NULL, length);
        }
        if (ret.data == NULL) {
                ret.length = 0;
@@ -142,3 +142,54 @@ BOOL data_blob_equal(const DATA_BLOB *d1, const DATA_BLOB *d2)
        return False;
 }
 
+/*******************************************************************
+print the data_blob as hex string
+*******************************************************************/
+char *data_blob_hex_string(TALLOC_CTX *mem_ctx, 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]);
+
+       return hex_string;
+}
+
+/*
+  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 = discard_const(str);
+       blob.length = strlen(str);
+       return blob;
+}
+
+DATA_BLOB data_blob_const(const void *p, size_t length)
+{
+       DATA_BLOB blob;
+       blob.data = discard_const(p);
+       blob.length = length;
+       return blob;
+}
+
+
+/*
+  append some data to a data blob
+*/
+NTSTATUS data_blob_append(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, void *p, size_t length)
+{
+       blob->data = talloc_realloc_size(mem_ctx, blob->data, blob->length + length);
+       NT_STATUS_HAVE_NO_MEMORY(blob->data);   
+       memcpy(blob->data + blob->length, p, length);
+       blob->length += length;
+       return NT_STATUS_OK;
+}