Signed-off-by: Christian Seiler <christ...@iwakd.de>
---
 src/lxc/utils.c |   91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/lxc/utils.h |    5 +++
 2 files changed, 96 insertions(+)

diff --git a/src/lxc/utils.c b/src/lxc/utils.c
index dc98443..02336d7 100644
--- a/src/lxc/utils.c
+++ b/src/lxc/utils.c
@@ -39,6 +39,12 @@
 #include <sys/wait.h>
 #include <assert.h>
 
+#ifndef HAVE_GETLINE
+#ifdef HAVE_FGETLN
+#include <../include/getline.h>
+#endif
+#endif
+
 #include "utils.h"
 #include "log.h"
 
@@ -807,3 +813,88 @@ void **lxc_dup_array(void **array, lxc_dup_fn 
element_dup_fn, lxc_free_fn elemen
 
        return result;
 }
+
+int lxc_write_to_file(const char *filename, const void* buf, size_t count, 
bool add_newline)
+{
+       int fd, saved_errno;
+       ssize_t ret;
+
+       fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, 0666);
+       if (fd < 0)
+               return -1;
+       ret = lxc_write_nointr(fd, buf, count);
+       if (ret < 0)
+               goto out_error; 
+       if ((size_t)ret != count)
+               goto out_error;
+       if (add_newline) {
+               ret = lxc_write_nointr(fd, "\n", 1);
+               if (ret != 1)
+                       goto out_error;
+       }
+       close(fd);
+       return 0;
+
+out_error:
+       saved_errno = errno;
+       close(fd);
+       errno = saved_errno;
+       return -1;
+}
+
+int lxc_read_from_file(const char *filename, void* buf, size_t count)
+{
+       int fd = -1, saved_errno;
+       ssize_t ret;
+
+       fd = open(filename, O_RDONLY | O_CLOEXEC);
+       if (fd < 0)
+               return -1;
+
+       if (!buf || !count) {
+               char buf2[100];
+               size_t count2 = 0;
+               while ((ret = read(fd, buf2, 100)) > 0)
+                       count2 += ret;
+               if (ret >= 0)
+                       ret = count2;
+       } else {
+               memset(buf, 0, count);
+               ret = read(fd, buf, count);
+       }
+
+       if (ret < 0)
+               ERROR("read %s: %s", filename, strerror(errno));
+
+       saved_errno = errno;
+       close(fd);
+       errno = saved_errno;
+       return ret;
+}
+
+char *lxc_read_line_from_file(const char *filename)
+{
+       FILE *f;
+       char *line = NULL;
+       int saved_errno;
+       size_t sz = 0;
+
+       f = fopen_cloexec(filename, "r");
+       if (!f)
+               return NULL;
+
+       if (getline(&line, &sz, f) == -1) {
+               saved_errno = errno;
+               fclose(f);
+               errno = saved_errno;
+               return NULL;
+       }
+
+       fclose(f);
+
+       /* trim line, if necessary */
+       if (strlen(line) > 0 && line[strlen(line) - 1] == '\n')
+               line[strlen(line) - 1] = '\0';
+
+       return line;
+}
diff --git a/src/lxc/utils.h b/src/lxc/utils.h
index 7261846..4c2ab29 100644
--- a/src/lxc/utils.h
+++ b/src/lxc/utils.h
@@ -194,6 +194,11 @@ extern ssize_t lxc_read_nointr_expect(int fd, void* buf, 
size_t count, const voi
 extern int sha1sum_file(char *fnam, unsigned char *md_value);
 #endif
 
+/* read and write whole files */
+extern int lxc_write_to_file(const char *filename, const void* buf, size_t 
count, bool add_newline);
+extern int lxc_read_from_file(const char *filename, void* buf, size_t count);
+extern char *lxc_read_line_from_file(const char *filename);
+
 /* convert variadic argument lists to arrays (for execl type argument lists) */
 extern char** lxc_va_arg_list_to_argv(va_list ap, size_t skip, int do_strdup);
 extern const char** lxc_va_arg_list_to_argv_const(va_list ap, size_t skip);
-- 
1.7.10.4


------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to