summaryrefslogtreecommitdiff
path: root/src/ucl_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ucl_util.c')
-rw-r--r--src/ucl_util.c114
1 files changed, 103 insertions, 11 deletions
diff --git a/src/ucl_util.c b/src/ucl_util.c
index 6ab1d38e72526..34080d4414925 100644
--- a/src/ucl_util.c
+++ b/src/ucl_util.c
@@ -35,6 +35,75 @@
#include <openssl/evp.h>
#endif
+#ifdef _WIN32
+#include <windows.h>
+
+#define PROT_READ 1
+#define PROT_WRITE 2
+#define PROT_READWRITE 3
+#define MAP_SHARED 1
+#define MAP_PRIVATE 2
+#define MAP_FAILED ((void *) -1)
+
+static void *mmap(char *addr, size_t length, int prot, int access, int fd, off_t offset)
+{
+ void *map = NULL;
+ HANDLE handle = INVALID_HANDLE_VALUE;
+
+ switch (prot) {
+ default:
+ case PROT_READ:
+ {
+ handle = CreateFileMapping((HANDLE) _get_osfhandle(fd), 0, PAGE_READONLY, 0, length, 0);
+ if (!handle) break;
+ map = (void *) MapViewOfFile(handle, FILE_MAP_READ, 0, 0, length);
+ CloseHandle(handle);
+ break;
+ }
+ case PROT_WRITE:
+ {
+ handle = CreateFileMapping((HANDLE) _get_osfhandle(fd), 0, PAGE_READWRITE, 0, length, 0);
+ if (!handle) break;
+ map = (void *) MapViewOfFile(handle, FILE_MAP_WRITE, 0, 0, length);
+ CloseHandle(handle);
+ break;
+ }
+ case PROT_READWRITE:
+ {
+ handle = CreateFileMapping((HANDLE) _get_osfhandle(fd), 0, PAGE_READWRITE, 0, length, 0);
+ if (!handle) break;
+ map = (void *) MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, length);
+ CloseHandle(handle);
+ break;
+ }
+ }
+ if (map == (void *) NULL) {
+ return (void *) MAP_FAILED;
+ }
+ return (void *) ((char *) map + offset);
+}
+
+static int munmap(void *map,size_t length)
+{
+ if (!UnmapViewOfFile(map)) {
+ return(-1);
+ }
+ return(0);
+}
+
+static char* realpath(const char *path, char *resolved_path) {
+ char *p;
+ char tmp[MAX_PATH + 1];
+ strncpy(tmp, path, sizeof(tmp)-1);
+ p = tmp;
+ while(*p) {
+ if (*p == '/') *p = '\\';
+ p++;
+ }
+ return _fullpath(resolved_path, tmp, MAX_PATH);
+}
+#endif
+
/**
* @file rcl_util.c
* Utilities for rcl parsing
@@ -177,7 +246,7 @@ ucl_unescape_json_string (char *str, size_t len)
return (t - str);
}
-char *
+UCL_EXTERN char *
ucl_copy_key_trash (ucl_object_t *obj)
{
if (obj->trash_stack[UCL_TRASH_KEY] == NULL && obj->key != NULL) {
@@ -193,7 +262,7 @@ ucl_copy_key_trash (ucl_object_t *obj)
return obj->trash_stack[UCL_TRASH_KEY];
}
-char *
+UCL_EXTERN char *
ucl_copy_value_trash (ucl_object_t *obj)
{
if (obj->trash_stack[UCL_TRASH_VALUE] == NULL) {
@@ -216,7 +285,7 @@ ucl_copy_value_trash (ucl_object_t *obj)
return obj->trash_stack[UCL_TRASH_VALUE];
}
-ucl_object_t*
+UCL_EXTERN ucl_object_t*
ucl_parser_get_object (struct ucl_parser *parser)
{
if (parser->state != UCL_STATE_ERROR && parser->top_obj != NULL) {
@@ -226,7 +295,7 @@ ucl_parser_get_object (struct ucl_parser *parser)
return NULL;
}
-void
+UCL_EXTERN void
ucl_parser_free (struct ucl_parser *parser)
{
struct ucl_stack *stack, *stmp;
@@ -266,7 +335,7 @@ ucl_parser_free (struct ucl_parser *parser)
UCL_FREE (sizeof (struct ucl_parser), parser);
}
-const char *
+UCL_EXTERN const char *
ucl_parser_get_error(struct ucl_parser *parser)
{
if (parser->err == NULL)
@@ -275,7 +344,7 @@ ucl_parser_get_error(struct ucl_parser *parser)
return utstring_body(parser->err);
}
-bool
+UCL_EXTERN bool
ucl_pubkey_add (struct ucl_parser *parser, const unsigned char *key, size_t len)
{
#ifndef HAVE_OPENSSL
@@ -679,7 +748,7 @@ ucl_include_file (const unsigned char *data, size_t len,
* @param err error ptr
* @return
*/
-bool
+UCL_EXTERN bool
ucl_include_handler (const unsigned char *data, size_t len, void* ud)
{
struct ucl_parser *parser = ud;
@@ -700,7 +769,7 @@ ucl_include_handler (const unsigned char *data, size_t len, void* ud)
* @param err error ptr
* @return
*/
-bool
+UCL_EXTERN bool
ucl_includes_handler (const unsigned char *data, size_t len, void* ud)
{
struct ucl_parser *parser = ud;
@@ -714,7 +783,7 @@ ucl_includes_handler (const unsigned char *data, size_t len, void* ud)
}
-bool
+UCL_EXTERN bool
ucl_try_include_handler (const unsigned char *data, size_t len, void* ud)
{
struct ucl_parser *parser = ud;
@@ -727,7 +796,7 @@ ucl_try_include_handler (const unsigned char *data, size_t len, void* ud)
return ucl_include_url (data, len, parser, false, false);
}
-bool
+UCL_EXTERN bool
ucl_parser_set_filevars (struct ucl_parser *parser, const char *filename, bool need_expand)
{
char realbuf[PATH_MAX], *curdir;
@@ -757,7 +826,7 @@ ucl_parser_set_filevars (struct ucl_parser *parser, const char *filename, bool n
return true;
}
-bool
+UCL_EXTERN bool
ucl_parser_add_file (struct ucl_parser *parser, const char *filename)
{
unsigned char *buf;
@@ -1055,6 +1124,29 @@ ucl_object_insert_key_common (ucl_object_t *top, ucl_object_t *elt,
return top;
}
+bool
+ucl_object_delete_keyl(ucl_object_t *top, const char *key, size_t keylen)
+{
+ ucl_object_t *found;
+
+ found = ucl_object_find_keyl(top, key, keylen);
+
+ if (found == NULL)
+ return false;
+
+ ucl_hash_delete(top->value.ov, found);
+ ucl_object_unref (found);
+ top->len --;
+
+ return true;
+}
+
+bool
+ucl_object_delete_key(ucl_object_t *top, const char *key)
+{
+ return ucl_object_delete_keyl(top, key, 0);
+}
+
ucl_object_t *
ucl_object_insert_key (ucl_object_t *top, ucl_object_t *elt,
const char *key, size_t keylen, bool copy_key)