[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