diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-11-06 21:19:20 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-11-07 01:19:56 +0100 |
commit | cda134ab1eac84f874aacf8e885a07112a7fd5ce (patch) | |
tree | 1c1739debf6148d09afd9f18cd61e1c2471fab94 /src/shared/fileio.c | |
parent | 0c2576ef74a9f9b96519cdcb7f9c01742d8255e2 (diff) |
copy: teach copy_bytes() sendfile() support, and then replace sendfile_full() by it
Diffstat (limited to 'src/shared/fileio.c')
-rw-r--r-- | src/shared/fileio.c | 75 |
1 files changed, 2 insertions, 73 deletions
diff --git a/src/shared/fileio.c b/src/shared/fileio.c index 38028b972e..f4efc4c9f1 100644 --- a/src/shared/fileio.c +++ b/src/shared/fileio.c @@ -20,12 +20,12 @@ ***/ #include <unistd.h> -#include <sys/sendfile.h> -#include "fileio.h" + #include "util.h" #include "strv.h" #include "utf8.h" #include "ctype.h" +#include "fileio.h" int write_string_stream(FILE *f, const char *line) { assert(f); @@ -144,77 +144,6 @@ int read_one_line_file(const char *fn, char **line) { return 0; } -ssize_t sendfile_full(int out_fd, const char *fn) { - _cleanup_fclose_ FILE *f; - struct stat st; - int r; - ssize_t s; - - size_t n, l; - _cleanup_free_ char *buf = NULL; - - assert(out_fd > 0); - assert(fn); - - f = fopen(fn, "re"); - if (!f) - return -errno; - - r = fstat(fileno(f), &st); - if (r < 0) - return -errno; - - s = sendfile(out_fd, fileno(f), NULL, st.st_size); - if (s < 0) - if (errno == EINVAL || errno == ENOSYS) { - /* continue below */ - } else - return -errno; - else - return s; - - /* sendfile() failed, fall back to read/write */ - - /* Safety check */ - if (st.st_size > 4*1024*1024) - return -E2BIG; - - n = st.st_size > 0 ? st.st_size : LINE_MAX; - l = 0; - - while (true) { - char *t; - size_t k; - - t = realloc(buf, n); - if (!t) - return -ENOMEM; - - buf = t; - k = fread(buf + l, 1, n - l, f); - - if (k <= 0) { - if (ferror(f)) - return -errno; - - break; - } - - l += k; - n *= 2; - - /* Safety check */ - if (n > 4*1024*1024) - return -E2BIG; - } - - r = write(out_fd, buf, l); - if (r < 0) - return -errno; - - return (ssize_t) l; -} - int read_full_stream(FILE *f, char **contents, size_t *size) { size_t n, l; _cleanup_free_ char *buf = NULL; |