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