-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathappend0.c
More file actions
59 lines (55 loc) · 1 KB
/
Copy pathappend0.c
File metadata and controls
59 lines (55 loc) · 1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <aio.h>
main(argc, argv)
int argc;
char *argv[];
{
/* append [dest] [src] */
int src, dst;
struct stat xsrc, xdst;
off_t newsz;
off_t off_out, off_in;
ssize_t rc, req;
char buf[262144];
if (argc != 3)
exit(-1);
dst = open(argv[1], O_RDWR);
src = open(argv[2], O_RDONLY);
if (dst == -1 || src == -1)
exit(-1);
fstat(dst, &xdst);
fstat(src, &xsrc);
newsz = xdst.st_size + xsrc.st_size;
if (newsz < xdst.st_size)
exit(-1);
rc = ftruncate(dst, newsz);
if (rc) {
printf("err %d\n", rc);
return -1;
}
off_in = 0;
off_out = xdst.st_size;
for (;;) {
bzero(buf, sizeof(buf));
rc = pread(src, buf, sizeof(buf), off_in);
if (rc == 0)
break;
if (rc < 0) {
printf("err %d\n", rc);
return -1;
}
off_in += rc;
req = rc;
rc = pwrite(dst, buf, rc, off_out + off_in);
if (rc != req) {
printf("err_out %d\n", rc);
return -1;
}
}
close(dst);
close(src);
}