summaryrefslogtreecommitdiffstats
path: root/ctdb/lib/util/util_file.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2007-06-07 22:30:29 +1000
committerAndrew Tridgell <tridge@samba.org>2007-06-07 22:30:29 +1000
commit14c788f3cb7b1d77a8046ad34fa09a9ea826ebd0 (patch)
tree1137f34391f0bbe3ce0aa7a23e2798b78565bdc7 /ctdb/lib/util/util_file.c
parent06a71762a41f8602ccfdf21e6a6bbe884c9d1a4f (diff)
downloadsamba-14c788f3cb7b1d77a8046ad34fa09a9ea826ebd0.tar.gz
samba-14c788f3cb7b1d77a8046ad34fa09a9ea826ebd0.tar.xz
samba-14c788f3cb7b1d77a8046ad34fa09a9ea826ebd0.zip
move more util code to lib/util
(This used to be ctdb commit de5ab0584c978a6be4afeacd80c84015b206a3c6)
Diffstat (limited to 'ctdb/lib/util/util_file.c')
-rw-r--r--ctdb/lib/util/util_file.c116
1 files changed, 116 insertions, 0 deletions
diff --git a/ctdb/lib/util/util_file.c b/ctdb/lib/util/util_file.c
new file mode 100644
index 0000000000..e9050fb25f
--- /dev/null
+++ b/ctdb/lib/util/util_file.c
@@ -0,0 +1,116 @@
+/*
+ functions taken from samba4 for quick prototyping of ctdb. These are
+ not intended to remain part of ctdb
+*/
+
+#include "includes.h"
+#include "system/filesys.h"
+
+
+static char *fd_load(int fd, size_t *size, TALLOC_CTX *mem_ctx)
+{
+ struct stat sbuf;
+ char *p;
+
+ if (fstat(fd, &sbuf) != 0) return NULL;
+
+ p = (char *)talloc_size(mem_ctx, sbuf.st_size+1);
+ if (!p) return NULL;
+
+ if (read(fd, p, sbuf.st_size) != sbuf.st_size) {
+ talloc_free(p);
+ return NULL;
+ }
+ p[sbuf.st_size] = 0;
+
+ if (size) *size = sbuf.st_size;
+
+ return p;
+}
+
+
+static char *file_load(const char *fname, size_t *size, TALLOC_CTX *mem_ctx)
+{
+ int fd;
+ char *p;
+
+ if (!fname || !*fname) return NULL;
+
+ fd = open(fname,O_RDONLY);
+ if (fd == -1) return NULL;
+
+ p = fd_load(fd, size, mem_ctx);
+
+ close(fd);
+
+ return p;
+}
+
+
+/**
+parse a buffer into lines
+'p' will be freed on error, and otherwise will be made a child of the returned array
+**/
+static char **file_lines_parse(char *p, size_t size, int *numlines, TALLOC_CTX *mem_ctx)
+{
+ int i;
+ char *s, **ret;
+
+ if (!p) return NULL;
+
+ for (s = p, i=0; s < p+size; s++) {
+ if (s[0] == '\n') i++;
+ }
+
+ ret = talloc_array(mem_ctx, char *, i+2);
+ if (!ret) {
+ talloc_free(p);
+ return NULL;
+ }
+
+ talloc_steal(ret, p);
+
+ memset(ret, 0, sizeof(ret[0])*(i+2));
+ if (numlines) *numlines = i;
+
+ ret[0] = p;
+ for (s = p, i=0; s < p+size; s++) {
+ if (s[0] == '\n') {
+ s[0] = 0;
+ i++;
+ ret[i] = s+1;
+ }
+ if (s[0] == '\r') s[0] = 0;
+ }
+
+ return ret;
+}
+
+
+/**
+load a file into memory and return an array of pointers to lines in the file
+must be freed with talloc_free().
+**/
+_PUBLIC_ char **file_lines_load(const char *fname, int *numlines, TALLOC_CTX *mem_ctx)
+{
+ char *p;
+ size_t size;
+
+ p = file_load(fname, &size, mem_ctx);
+ if (!p) return NULL;
+
+ return file_lines_parse(p, size, numlines, mem_ctx);
+}
+
+char *hex_encode(TALLOC_CTX *mem_ctx, const unsigned char *buff_in, size_t len)
+{
+ int i;
+ char *hex_buffer;
+
+ hex_buffer = talloc_array(mem_ctx, char, (len*2)+1);
+
+ for (i = 0; i < len; i++)
+ slprintf(&hex_buffer[i*2], 3, "%02X", buff_in[i]);
+
+ return hex_buffer;
+}