done
This commit is contained in:
parent
6864133d52
commit
992b45e613
58
mmapcp.cc
58
mmapcp.cc
|
@ -6,54 +6,28 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main (int argc, char *argv[]) {
|
||||||
{
|
|
||||||
int s, s2, d;
|
int s, s2, d;
|
||||||
struct stat st;
|
struct stat st, s2t;
|
||||||
struct stat s2t;
|
|
||||||
void *sp, *s2p, *dp;
|
void *sp, *s2p, *dp;
|
||||||
s = open(argv[1], O_RDONLY);
|
s = open(argv[1], O_RDONLY);
|
||||||
if (s == -1) {
|
if (s == -1) { perror("open source"); exit(1); }
|
||||||
perror("open source");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
s2 = open(argv[2], O_RDONLY);
|
s2 = open(argv[2], O_RDONLY);
|
||||||
if (s2 == -1) {
|
if (s2 == -1) { perror("open source2"); exit(1); }
|
||||||
perror("open source2");
|
d = open(argv[3], O_WRONLY | O_CREAT, 0644);
|
||||||
exit(1);
|
if (d == -1) { perror("open destination"); exit(1); }
|
||||||
}
|
if (fstat(s, &st)) { perror("stat source"); exit(1); }
|
||||||
d = open(argv[3], O_RDWR | O_CREAT | O_TRUNC, 0644);
|
if (fstat(s2, &s2t)) { perror("stat source2"); exit(1); }
|
||||||
if (d == -1) {
|
if (ftruncate(d, st.st_size + s2t.st_size)) { perror("truncate destination"); exit(1); }
|
||||||
perror("open destination");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (fstat(s, &st)) {
|
|
||||||
perror("stat source");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (fstat(s2, &s2t)) {
|
|
||||||
perror("stat source2");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (ftruncate(d, st.st_size + s2t.st_size)) {
|
|
||||||
perror("truncate destination");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
sp = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, s, 0);
|
sp = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, s, 0);
|
||||||
if (sp == MAP_FAILED) {
|
if (sp == MAP_FAILED) { perror("map source"); exit(1); }
|
||||||
perror("map source");
|
madvise(sp, st.st_size, MADV_SEQUENTIAL);
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
s2p = mmap(NULL, s2t.st_size, PROT_READ, MAP_SHARED, s2, 0);
|
s2p = mmap(NULL, s2t.st_size, PROT_READ, MAP_SHARED, s2, 0);
|
||||||
if (s2p == MAP_FAILED) {
|
if (s2p == MAP_FAILED) { perror("map source2"); exit(1); }
|
||||||
perror("map source2");
|
madvise(s2p, s2t.st_size, MADV_SEQUENTIAL);
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
dp = mmap(NULL, st.st_size + s2t.st_size, PROT_WRITE | PROT_READ, MAP_SHARED, d, 0);
|
dp = mmap(NULL, st.st_size + s2t.st_size, PROT_WRITE | PROT_READ, MAP_SHARED, d, 0);
|
||||||
if (dp == MAP_FAILED) {
|
if (dp == MAP_FAILED) { perror("map destination"); exit(1); }
|
||||||
perror("map destination");
|
madvise(dp, st.st_size + s2t.st_size, MADV_SEQUENTIAL);
|
||||||
exit(1);
|
memcpy(mempcpy(dp, sp, st.st_size), s2p, s2t.st_size);
|
||||||
}
|
|
||||||
memcpy(dp, sp, st.st_size);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue