[lxc-devel] [PATCH 5/6] utils: Add utility functions that write/read to entire files
Serge Hallyn
serge.hallyn at ubuntu.com
Tue Sep 10 04:21:08 UTC 2013
Quoting Christian Seiler (christian at iwakd.de):
> Signed-off-by: Christian Seiler <christian at iwakd.de>
Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>
but I notice that lxc_read_line_from_file() is not being used here
or later. The function would seem more useful if it accepted a line
number to read. Otherwise I'd suggest we drop the function. Thoughts?
> ---
> 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 at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel
More information about the lxc-devel
mailing list