reftable/blocksource: adjust read_block()
to return ssize_t
The `block_source_read_block()` function and its implementations return an integer as a result that reflects either the number of bytes read, or an error. As such its return type, a signed integer, isn't wrong, but it doesn't give the reader a good hint what it actually returns. Refactor the function to return an `ssize_t` instead, which is typical for functions similar to read(3p) and should thus give readers a better signal what they can expect as a result. Adjust callers to better handle the returned value to avoid warnings with -Wsign-compare. One of these callers is `reader_get_block()`, whose return value is only ever used by its callers to figure out whether or not the read was successful. So instead of bubbling up the `ssize_t` there, too, we adapt it to only indicate success or errors. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
1f054af72f
commit
7c4c1cbc0b
@ -24,8 +24,8 @@ static void reftable_buf_close(void *b UNUSED)
|
||||
{
|
||||
}
|
||||
|
||||
static int reftable_buf_read_block(void *v, struct reftable_block *dest,
|
||||
uint64_t off, uint32_t size)
|
||||
static ssize_t reftable_buf_read_block(void *v, struct reftable_block *dest,
|
||||
uint64_t off, uint32_t size)
|
||||
{
|
||||
struct reftable_buf *b = v;
|
||||
assert(off + size <= b->len);
|
||||
@ -78,8 +78,8 @@ static void file_close(void *v)
|
||||
reftable_free(b);
|
||||
}
|
||||
|
||||
static int file_read_block(void *v, struct reftable_block *dest, uint64_t off,
|
||||
uint32_t size)
|
||||
static ssize_t file_read_block(void *v, struct reftable_block *dest, uint64_t off,
|
||||
uint32_t size)
|
||||
{
|
||||
struct file_block_source *b = v;
|
||||
assert(off + size <= b->size);
|
||||
|
@ -20,11 +20,11 @@ uint64_t block_source_size(struct reftable_block_source *source)
|
||||
return source->ops->size(source->arg);
|
||||
}
|
||||
|
||||
int block_source_read_block(struct reftable_block_source *source,
|
||||
struct reftable_block *dest, uint64_t off,
|
||||
uint32_t size)
|
||||
ssize_t block_source_read_block(struct reftable_block_source *source,
|
||||
struct reftable_block *dest, uint64_t off,
|
||||
uint32_t size)
|
||||
{
|
||||
int result = source->ops->read_block(source->arg, dest, off, size);
|
||||
ssize_t result = source->ops->read_block(source->arg, dest, off, size);
|
||||
dest->source = *source;
|
||||
return result;
|
||||
}
|
||||
@ -57,14 +57,17 @@ static int reader_get_block(struct reftable_reader *r,
|
||||
struct reftable_block *dest, uint64_t off,
|
||||
uint32_t sz)
|
||||
{
|
||||
ssize_t bytes_read;
|
||||
if (off >= r->size)
|
||||
return 0;
|
||||
|
||||
if (off + sz > r->size) {
|
||||
if (off + sz > r->size)
|
||||
sz = r->size - off;
|
||||
}
|
||||
|
||||
return block_source_read_block(&r->source, dest, off, sz);
|
||||
bytes_read = block_source_read_block(&r->source, dest, off, sz);
|
||||
if (bytes_read < 0)
|
||||
return (int)bytes_read;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
enum reftable_hash reftable_reader_hash_id(struct reftable_reader *r)
|
||||
@ -601,6 +604,7 @@ int reftable_reader_new(struct reftable_reader **out,
|
||||
struct reftable_reader *r;
|
||||
uint64_t file_size = block_source_size(source);
|
||||
uint32_t read_size;
|
||||
ssize_t bytes_read;
|
||||
int err;
|
||||
|
||||
REFTABLE_CALLOC_ARRAY(r, 1);
|
||||
@ -619,8 +623,8 @@ int reftable_reader_new(struct reftable_reader **out,
|
||||
goto done;
|
||||
}
|
||||
|
||||
err = block_source_read_block(source, &header, 0, read_size);
|
||||
if (err != read_size) {
|
||||
bytes_read = block_source_read_block(source, &header, 0, read_size);
|
||||
if (bytes_read < 0 || (size_t)bytes_read != read_size) {
|
||||
err = REFTABLE_IO_ERROR;
|
||||
goto done;
|
||||
}
|
||||
@ -645,9 +649,9 @@ int reftable_reader_new(struct reftable_reader **out,
|
||||
r->hash_id = 0;
|
||||
r->refcount = 1;
|
||||
|
||||
err = block_source_read_block(source, &footer, r->size,
|
||||
footer_size(r->version));
|
||||
if (err != footer_size(r->version)) {
|
||||
bytes_read = block_source_read_block(source, &footer, r->size,
|
||||
footer_size(r->version));
|
||||
if (bytes_read < 0 || (size_t)bytes_read != footer_size(r->version)) {
|
||||
err = REFTABLE_IO_ERROR;
|
||||
goto done;
|
||||
}
|
||||
|
@ -16,9 +16,9 @@ https://developers.google.com/open-source/licenses/bsd
|
||||
|
||||
uint64_t block_source_size(struct reftable_block_source *source);
|
||||
|
||||
int block_source_read_block(struct reftable_block_source *source,
|
||||
struct reftable_block *dest, uint64_t off,
|
||||
uint32_t size);
|
||||
ssize_t block_source_read_block(struct reftable_block_source *source,
|
||||
struct reftable_block *dest, uint64_t off,
|
||||
uint32_t size);
|
||||
void block_source_close(struct reftable_block_source *source);
|
||||
|
||||
/* metadata for a block type */
|
||||
|
@ -31,10 +31,13 @@ struct reftable_block_source_vtable {
|
||||
/* returns the size of a block source */
|
||||
uint64_t (*size)(void *source);
|
||||
|
||||
/* reads a segment from the block source. It is an error to read
|
||||
beyond the end of the block */
|
||||
int (*read_block)(void *source, struct reftable_block *dest,
|
||||
uint64_t off, uint32_t size);
|
||||
/*
|
||||
* Reads a segment from the block source. It is an error to read beyond
|
||||
* the end of the block.
|
||||
*/
|
||||
ssize_t (*read_block)(void *source, struct reftable_block *dest,
|
||||
uint64_t off, uint32_t size);
|
||||
|
||||
/* mark the block as read; may return the data back to malloc */
|
||||
void (*return_block)(void *source, struct reftable_block *blockp);
|
||||
|
||||
|
Reference in New Issue
Block a user