libite
2.6.1
src
fsendfile.c
Go to the documentation of this file.
1
/* Copy data between file streams
2
*
3
* Copyright (c) 2013 Tobias Waldekranz <tobias@waldekranz.com>
4
*
5
* Permission is hereby granted, free of charge, to any person obtaining a copy
6
* of this software and associated documentation files (the "Software"), to deal
7
* in the Software without restriction, including without limitation the rights
8
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
* copies of the Software, and to permit persons to whom the Software is
10
* furnished to do so, subject to the following conditions:
11
*
12
* The above copyright notice and this permission notice shall be included in
13
* all copies or substantial portions of the Software.
14
*
15
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
* THE SOFTWARE.
22
*/
23
30
31
#include <errno.h>
32
#include <stdio.h>
33
#include <stdlib.h>
34
35
51
ssize_t
fsendfile
(FILE *src, FILE *dst,
size_t
len)
52
{
53
char
*buf;
54
size_t
tot = 0;
55
ssize_t blk = BUFSIZ, num = 0;
56
57
if
(!src) {
58
errno = EINVAL;
59
return
-1;
60
}
61
62
buf = malloc(BUFSIZ);
63
if
(!buf)
64
return
-1;
65
66
while
(!len || tot < len) {
67
if
(len && ((len - tot) < BUFSIZ))
68
blk = len - tot;
69
70
num = fread(buf, 1, blk, src);
71
if
(num == 0)
72
break
;
73
74
if
(dst && (fwrite(buf, num, 1, dst) != 1)) {
75
num = -1;
76
break
;
77
}
78
79
tot += num;
80
}
81
82
free(buf);
83
84
return
(num == -1) ? -1 : (ssize_t)tot;
85
}
86
fsendfile
ssize_t fsendfile(FILE *src, FILE *dst, size_t len)
Definition
fsendfile.c:51
Generated by
1.13.2