Skip to content

Commit

Permalink
utils: Add utility functions that write/read to entire files
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Seiler <christian@iwakd.de>
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
  • Loading branch information
chris-se authored and hallyn committed Sep 10, 2013
1 parent 35fface commit 9e25b03
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 0 deletions.
91 changes: 91 additions & 0 deletions src/lxc/utils.c
Expand Up @@ -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"

Expand Down Expand Up @@ -805,3 +811,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;
}
5 changes: 5 additions & 0 deletions src/lxc/utils.h
Expand Up @@ -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);
Expand Down

0 comments on commit 9e25b03

Please sign in to comment.