This commit is contained in:
Benjamin Harris 2016-10-02 16:21:02 -04:00
parent 6864133d52
commit 992b45e613
3 changed files with 16 additions and 42 deletions

BIN
mmapcp

Binary file not shown.

View File

@ -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;
} }

BIN
out.txt

Binary file not shown.