use symbolic shell variables in library paths
[strongswan.git] / src / libstrongswan / chunk.c
index f2c8a3e..d70e172 100644 (file)
  */
 
 #include <stdio.h>
  */
 
 #include <stdio.h>
+#include <sys/stat.h>
 
 #include "chunk.h"
 
 
 #include "chunk.h"
 
+#include <debug.h>
 #include <printf_hook.h>
 
 /**
 #include <printf_hook.h>
 
 /**
@@ -205,6 +207,45 @@ void chunk_split(chunk_t chunk, const char *mode, ...)
        va_end(chunks);
 }
 
        va_end(chunks);
 }
 
+/**
+ * Described in header.
+ */
+bool chunk_write(chunk_t chunk, const char *path, const char *label, mode_t mask, bool force)
+{
+       mode_t oldmask;
+       FILE *fd;
+
+       if (!force)
+       {
+               fd = fopen(path, "r");
+               if (fd)
+               {
+                       fclose(fd);
+                       DBG1("  %s file '%s' already exists", label, path);
+                       return FALSE;
+               }
+       }
+
+       /* set umask */
+       oldmask = umask(mask);
+
+       fd = fopen(path, "w");
+
+       if (fd)
+       {
+               fwrite(chunk.ptr, sizeof(u_char), chunk.len, fd);
+               fclose(fd);
+               DBG1("  written %s file '%s' (%u bytes)", label, path, chunk.len);
+               umask(oldmask);
+               return TRUE;
+       }
+       else
+       {
+               DBG1("  could not open %s file '%s' for writing", label, path);
+               umask(oldmask);
+               return FALSE;
+       }
+}
 
 /**
  * Described in header.
 
 /**
  * Described in header.
@@ -233,6 +274,21 @@ chunk_t chunk_skip(chunk_t chunk, size_t bytes)
 /**
  * Described in header.
  */
 /**
  * Described in header.
  */
+int chunk_compare(chunk_t a, chunk_t b)
+{
+       int compare_len = a.len - b.len;
+       int len = (compare_len < 0)? a.len : b.len;
+
+       if (compare_len != 0 || len == 0)
+       {
+               return compare_len;
+       }
+       return memcmp(a.ptr, b.ptr, len);
+};
+
+/**
+ * Described in header.
+ */
 bool chunk_equals(chunk_t a, chunk_t b)
 {
        return a.ptr != NULL  && b.ptr != NULL &&
 bool chunk_equals(chunk_t a, chunk_t b)
 {
        return a.ptr != NULL  && b.ptr != NULL &&