io: fix mmap writing to actually work
apparently it needs to have both PROT_READ and PROT_WRITE. and it needs to be MAP_SHARED for the writing to be effective. oh, and the data needs to be preallocated with ftruncate; otherwise, one gets SIGBUS.cute-signatures
parent
49420239c2
commit
8e4075e6b1
|
@ -331,7 +331,7 @@ int apk_archive_entry_extract(const struct apk_file_info *ae,
|
||||||
break;
|
break;
|
||||||
case S_IFREG:
|
case S_IFREG:
|
||||||
if (ae->link_target == NULL) {
|
if (ae->link_target == NULL) {
|
||||||
fd = open(fn, O_WRONLY | O_CREAT, ae->mode & 07777);
|
fd = open(fn, O_RDWR | O_CREAT, ae->mode & 07777);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
r = -1;
|
r = -1;
|
||||||
break;
|
break;
|
||||||
|
|
10
src/io.c
10
src/io.c
|
@ -113,13 +113,15 @@ size_t apk_istream_splice(void *stream, int fd, size_t size,
|
||||||
apk_progress_cb cb, void *cb_ctx)
|
apk_progress_cb cb, void *cb_ctx)
|
||||||
{
|
{
|
||||||
struct apk_istream *is = (struct apk_istream *) stream;
|
struct apk_istream *is = (struct apk_istream *) stream;
|
||||||
unsigned char *buf;
|
unsigned char *buf = MAP_FAILED;
|
||||||
size_t bufsz, done = 0, r, togo, mmapped = 0;
|
size_t bufsz, done = 0, r, togo, mmapped = 0;
|
||||||
|
|
||||||
bufsz = size;
|
bufsz = size;
|
||||||
if (size > 256 * 1024) {
|
if (size > 128 * 1024) {
|
||||||
buf = mmap(NULL, size, PROT_WRITE, 0, fd, 0);
|
if (ftruncate(fd, size) == 0)
|
||||||
if (buf != NULL) {
|
buf = mmap(NULL, size, PROT_READ | PROT_WRITE,
|
||||||
|
MAP_SHARED, fd, 0);
|
||||||
|
if (buf != MAP_FAILED) {
|
||||||
mmapped = 1;
|
mmapped = 1;
|
||||||
if (bufsz > 2*1024*1024)
|
if (bufsz > 2*1024*1024)
|
||||||
bufsz = 2*1024*1024;
|
bufsz = 2*1024*1024;
|
||||||
|
|
Loading…
Reference in New Issue