[lxc-devel] [PATCH 5/6] utils: Add utility functions that write/read to entire files
Christian Seiler
christian at iwakd.de
Sun Sep 8 19:44:43 UTC 2013
Signed-off-by: Christian Seiler <christian at 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
More information about the lxc-devel
mailing list