print: handle write() errors in apk_print_progress()
parent
ca784ceab3
commit
22281fb4b5
|
@ -18,6 +18,8 @@
|
||||||
#include "apk_atom.h"
|
#include "apk_atom.h"
|
||||||
#include "apk_crypto.h"
|
#include "apk_crypto.h"
|
||||||
|
|
||||||
|
ssize_t apk_write_fully(int fd, const void *ptr, size_t size);
|
||||||
|
|
||||||
struct apk_id_hash {
|
struct apk_id_hash {
|
||||||
int empty;
|
int empty;
|
||||||
struct hlist_head by_id[16], by_name[16];
|
struct hlist_head by_id[16], by_name[16];
|
||||||
|
|
36
src/io.c
36
src/io.c
|
@ -33,6 +33,22 @@
|
||||||
|
|
||||||
size_t apk_io_bufsize = 128*1024;
|
size_t apk_io_bufsize = 128*1024;
|
||||||
|
|
||||||
|
ssize_t apk_write_fully(int fd, const void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
ssize_t i = 0, r;
|
||||||
|
|
||||||
|
while (i < size) {
|
||||||
|
r = write(fd, ptr + i, size - i);
|
||||||
|
if (r <= 0) {
|
||||||
|
if (r == 0) return i;
|
||||||
|
return -errno;
|
||||||
|
}
|
||||||
|
i += r;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
static void apk_file_meta_from_fd(int fd, struct apk_file_meta *meta)
|
static void apk_file_meta_from_fd(int fd, struct apk_file_meta *meta)
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
@ -828,22 +844,6 @@ struct apk_fd_ostream {
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
};
|
};
|
||||||
|
|
||||||
static ssize_t safe_write(int fd, const void *ptr, size_t size)
|
|
||||||
{
|
|
||||||
ssize_t i = 0, r;
|
|
||||||
|
|
||||||
while (i < size) {
|
|
||||||
r = write(fd, ptr + i, size - i);
|
|
||||||
if (r < 0)
|
|
||||||
return -errno;
|
|
||||||
if (r == 0)
|
|
||||||
return i;
|
|
||||||
i += r;
|
|
||||||
}
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t fdo_flush(struct apk_fd_ostream *fos)
|
static ssize_t fdo_flush(struct apk_fd_ostream *fos)
|
||||||
{
|
{
|
||||||
ssize_t r;
|
ssize_t r;
|
||||||
|
@ -851,7 +851,7 @@ static ssize_t fdo_flush(struct apk_fd_ostream *fos)
|
||||||
if (fos->bytes == 0)
|
if (fos->bytes == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((r = safe_write(fos->fd, fos->buffer, fos->bytes)) != fos->bytes) {
|
if ((r = apk_write_fully(fos->fd, fos->buffer, fos->bytes)) != fos->bytes) {
|
||||||
apk_ostream_cancel(&fos->os, r < 0 ? r : -EIO);
|
apk_ostream_cancel(&fos->os, r < 0 ? r : -EIO);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -870,7 +870,7 @@ static ssize_t fdo_write(struct apk_ostream *os, const void *ptr, size_t size)
|
||||||
if (r != 0)
|
if (r != 0)
|
||||||
return r;
|
return r;
|
||||||
if (size >= sizeof(fos->buffer) / 2) {
|
if (size >= sizeof(fos->buffer) / 2) {
|
||||||
r = safe_write(fos->fd, ptr, size);
|
r = apk_write_fully(fos->fd, ptr, size);
|
||||||
if (r != size) apk_ostream_cancel(&fos->os, r < 0 ? r : -EIO);
|
if (r != size) apk_ostream_cancel(&fos->os, r < 0 ? r : -EIO);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include "apk_defines.h"
|
#include "apk_defines.h"
|
||||||
#include "apk_print.h"
|
#include "apk_print.h"
|
||||||
|
#include "apk_io.h"
|
||||||
|
|
||||||
const char *apk_error_str(int error)
|
const char *apk_error_str(int error)
|
||||||
{
|
{
|
||||||
|
@ -181,7 +182,10 @@ void apk_print_progress(struct apk_progress *p, size_t done, size_t total)
|
||||||
if (p->last_done == done && (!p->out || p->last_out_change == p->out->last_change)) return;
|
if (p->last_done == done && (!p->out || p->last_out_change == p->out->last_change)) return;
|
||||||
if (p->fd != 0) {
|
if (p->fd != 0) {
|
||||||
i = snprintf(buf, sizeof(buf), "%zu/%zu\n", done, total);
|
i = snprintf(buf, sizeof(buf), "%zu/%zu\n", done, total);
|
||||||
write(p->fd, buf, i);
|
if (apk_write_fully(p->fd, buf, i) != i) {
|
||||||
|
close(p->fd);
|
||||||
|
p->fd = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
p->last_done = done;
|
p->last_done = done;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue