removed linux26/xfrm.h
[strongswan.git] / src / libstrongswan / chunk.h
index 93c4b51..a13ccfc 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * @file chunk.h
  *
- * @brief Pointer/lenght abstraction and its functions.
+ * @brief Pointer/length abstraction and its functions.
  *
  */
 
@@ -47,21 +47,41 @@ struct chunk_t {
 extern chunk_t chunk_empty;
 
 /**
- * Initialize a chunk to point to a static(!) buffer
+ * Create a new chunk pointing to "ptr" with length "len"
  */
-#define chunk_from_buf(str) { str, sizeof(str) }
+chunk_t chunk_create(u_char *ptr, size_t len);
+
+/**
+ * Create a clone of a chunk pointing to "ptr"
+ */
+chunk_t chunk_create_clone(u_char *ptr, chunk_t chunk);
+
+/**
+ * Calculate length of multiple chunks
+ */
+size_t chunk_length(const char *mode, ...);
 
 /**
- * Clone chunk contents in a newly allocated chunk
+ * Concatenate chunks into a chunk pointing to "ptr",
+ * "mode" is a string of "c" (copy) and "m" (move), which says
+ * how to handle to chunks in "..."
  */
-chunk_t chunk_clone(chunk_t chunk);
+chunk_t chunk_create_cat(u_char *ptr, const char* mode, ...);
 
 /**
- * Allocate a chunk from concatenation of other chunks.
- * mode is a string 'm' and 'c, 'm' means move chunk,
- * 'c' means copy chunk.
+ * Split up a chunk into parts, "mode" is a string of "a" (alloc),
+ * "c" (copy) and "m" (move). Each letter say for the corresponding chunk if
+ * it should get allocated on heap, copied into existing chunk, or the chunk
+ * should point into "chunk". The length of each part is an argument before
+ * each target chunk. E.g.:
+ * chunk_split(chunk, "mcac", 3, &a, 7, &b, 5, &c, d.len, &d);
  */
-chunk_t chunk_cat(const char* mode, ...);
+void chunk_split(chunk_t chunk, const char *mode, ...);
+
+/**
+  * Write the binary contents of a chunk_t to a file
+  */
+bool chunk_write(chunk_t chunk, const char *path, const char *label, mode_t mask, bool force);
 
 /**
  * Free contents of a chunk
@@ -69,9 +89,55 @@ chunk_t chunk_cat(const char* mode, ...);
 void chunk_free(chunk_t *chunk);
 
 /**
- * Allocate a chunk
+ * Initialize a chunk to point to buffer inspectable by sizeof()
+ */
+#define chunk_from_buf(str) { str, sizeof(str) }
+
+/**
+ * Initialize a chunk to point to a thing
+ */
+#define chunk_from_thing(thing) chunk_create((char*)&(thing), sizeof(thing))
+
+/**
+ * Allocate a chunk on the heap
+ */
+#define chunk_alloc(bytes) chunk_create(malloc(bytes), bytes)
+
+/**
+ * Allocate a chunk on the stack
+ */
+#define chunk_alloca(bytes) chunk_create(alloca(bytes), bytes)
+
+/**
+ * Clone a chunk on heap
+ */
+#define chunk_clone(chunk) chunk_create_clone(malloc(chunk.len), chunk)
+
+/**
+ * Clone a chunk on stack
+ */
+#define chunk_clonea(chunk) chunk_create_clone(alloca(chunk.len), chunk)
+
+/**
+ * Concatenate chunks into a chunk on heap
+ */
+#define chunk_cat(mode, ...) chunk_create_cat(malloc(chunk_length(mode, __VA_ARGS__)), mode, __VA_ARGS__)
+
+/**
+ * Concatenate chunks into a chunk on stack
+ */
+#define chunk_cata(mode, ...) chunk_create_cat(alloca(chunk_length(mode, __VA_ARGS__)), mode, __VA_ARGS__)
+
+/**
+ * Skip n bytes in chunk (forward pointer, shorten length)
+ */
+chunk_t chunk_skip(chunk_t chunk, size_t bytes);
+
+/**
+ *  Compare two chunks, returns zero if a equals b
+ *  or negative/positive if a is small/greater than b
  */
-chunk_t chunk_alloc(size_t bytes);
+int chunk_compare(chunk_t a, chunk_t b);
 
 /**
  * Compare two chunks for equality,