diff options
author | Aidan MacDonald <amachronic@protonmail.com> | 2021-11-05 17:40:58 +0300 |
---|---|---|
committer | Aidan MacDonald <amachronic@protonmail.com> | 2021-11-05 18:16:16 +0300 |
commit | 2dd008245d42504c12c27d9731f2e1180162fe21 (patch) | |
tree | 4e6658ec6685292c74e3b981d320f284e9d1e17f | |
parent | 5c48c0a8bdf896837b2860bb526c69280c9517c7 (diff) |
Change read/write hook return value convention
They now return the number of bytes read or written or
a negative error code.
-rw-r--r-- | src/microtar-stdio.c | 10 | ||||
-rw-r--r-- | src/microtar.c | 59 |
2 files changed, 38 insertions, 31 deletions
diff --git a/src/microtar-stdio.c b/src/microtar-stdio.c index f0352dc..2697d00 100644 --- a/src/microtar-stdio.c +++ b/src/microtar-stdio.c @@ -28,13 +28,19 @@ static int file_read(void* stream, void* data, unsigned size) { unsigned res = fread(data, 1, size, (FILE*)stream); - return (res == size) ? MTAR_ESUCCESS : MTAR_EREADFAIL; + if(res != size && ferror((FILE*)stream)) + return MTAR_EREADFAIL; + + return res; } static int file_write(void* stream, const void* data, unsigned size) { unsigned res = fwrite(data, 1, size, (FILE*)stream); - return (res == size) ? MTAR_ESUCCESS : MTAR_EWRITEFAIL; + if(res != size && ferror((FILE*)stream)) + return MTAR_EWRITEFAIL; + + return res; } static int file_seek(void* stream, unsigned offset) diff --git a/src/microtar.c b/src/microtar.c index 9e28256..6430cd7 100644 --- a/src/microtar.c +++ b/src/microtar.c @@ -104,16 +104,20 @@ static unsigned round_up_512(unsigned n) static int tread(mtar_t* tar, void* data, unsigned size) { - int err = tar->ops->read(tar->stream, data, size); - tar->pos += size; - return err; + int ret = tar->ops->read(tar->stream, data, size); + if(ret >= 0) + tar->pos += ret; + + return ret; } static int twrite(mtar_t* tar, const void* data, unsigned size) { - int err = tar->ops->write(tar->stream, data, size); - tar->pos += size; - return err; + int ret = tar->ops->write(tar->stream, data, size); + if(ret >= 0) + tar->pos += ret; + + return ret; } static int tseek(mtar_t* tar, unsigned pos) @@ -125,15 +129,17 @@ static int tseek(mtar_t* tar, unsigned pos) static int write_null_bytes(mtar_t* tar, size_t count) { - int err; + int ret; size_t n; memset(tar->buffer, 0, sizeof(tar->buffer)); while(count > 0) { n = count < sizeof(tar->buffer) ? count : sizeof(tar->buffer); - err = twrite(tar, tar->buffer, n); - if(err) - return err; + ret = twrite(tar, tar->buffer, n); + if(ret < 0) + return ret; + if(ret != (int)n) + return MTAR_EWRITEFAIL; } return MTAR_ESUCCESS; @@ -242,15 +248,17 @@ static int header_to_raw(char* raw, const mtar_header_t* h) static int ensure_header(mtar_t* tar) { - int err; + int ret, err; if(tar->state & S_HEADER_VALID) return MTAR_ESUCCESS; tar->header_pos = tar->pos; - err = tread(tar, tar->buffer, HEADER_LEN); - if(err) - return err; + ret = tread(tar, tar->buffer, HEADER_LEN); + if(ret < 0) + return ret; + if(ret != HEADER_LEN) + return MTAR_EREADFAIL; err = raw_to_header(&tar->header, tar->buffer); if(err) @@ -429,11 +437,7 @@ int mtar_read_data(mtar_t* tar, void* ptr, unsigned size) if(data_left < size) size = data_left; - int err = tread(tar, ptr, size); - if(err) - return err; - - return (int)size; + return tread(tar, ptr, size); } int mtar_seek_data(mtar_t* tar, int offset, int whence) @@ -507,9 +511,11 @@ int mtar_write_header(mtar_t* tar, const mtar_header_t* h) if(err) return err; - err = twrite(tar, tar->buffer, HEADER_LEN); - if(err) - return err; + int ret = twrite(tar, tar->buffer, HEADER_LEN); + if(ret < 0) + return ret; + if(ret != HEADER_LEN) + return MTAR_EWRITEFAIL; tar->state |= S_WROTE_HEADER; return MTAR_ESUCCESS; @@ -566,13 +572,8 @@ int mtar_write_data(mtar_t* tar, const void* ptr, unsigned size) if(size > data_left) size = data_left; - if(size > 0) - tar->state |= S_WROTE_DATA; - int err = twrite(tar, ptr, size); - if(err) - return err; - - return (int)size; + tar->state |= S_WROTE_DATA; + return twrite(tar, ptr, size); } int mtar_end_record(mtar_t* tar) |