Another simple internal macro, this time encapsulating calling a callback. --- generator/states-reply-simple.c | 8 ++++---- generator/states-reply-structured.c | 31 ++++++++++++++--------------- generator/states-reply.c | 2 +- generator/states.c | 2 +- lib/debug.c | 2 +- lib/internal.h | 4 ++++ 6 files changed, 26 insertions(+), 23 deletions(-) diff --git a/generator/states-reply-simple.c b/generator/states-reply-simple.c index 8905367..8e3d7f1 100644 --- a/generator/states-reply-simple.c +++ b/generator/states-reply-simple.c @@ -64,10 +64,10 @@ int error = 0; assert (cmd->error == 0); - if (cmd->cb.fn.chunk.callback (cmd->cb.fn.chunk.user_data, - cmd->data, cmd->count, - cmd->offset, LIBNBD_READ_DATA, - &error) == -1) + if (CALL_CALLBACK (cmd->cb.fn.chunk, + cmd->data, cmd->count, + cmd->offset, LIBNBD_READ_DATA, + &error) == -1) cmd->error = error ? error : EPROTO; FREE_CALLBACK (cmd->cb.fn.chunk); } diff --git a/generator/states-reply-structured.c b/generator/states-reply-structured.c index 62ae3ad..2e327ce 100644 --- a/generator/states-reply-structured.c +++ b/generator/states-reply-structured.c @@ -301,10 +301,10 @@ * current error rather than any earlier one. If the callback fails * without setting errno, then use the server's error below. */ - if (cmd->cb.fn.chunk.callback (cmd->cb.fn.chunk.user_data, - cmd->data + (offset - cmd->offset), - 0, offset, LIBNBD_READ_ERROR, - &scratch) == -1) + if (CALL_CALLBACK (cmd->cb.fn.chunk, + cmd->data + (offset - cmd->offset), + 0, offset, LIBNBD_READ_ERROR, + &scratch) == -1) if (cmd->error == 0) cmd->error = scratch; if (flags & NBD_REPLY_FLAG_DONE) @@ -392,10 +392,9 @@ int error = cmd->error; uint16_t flags = be16toh (h->sbuf.sr.structured_reply.flags); - if (cmd->cb.fn.chunk.callback (cmd->cb.fn.chunk.user_data, - cmd->data + (offset - cmd->offset), - length - sizeof offset, offset, - LIBNBD_READ_DATA, &error) == -1) + if (CALL_CALLBACK (cmd->cb.fn.chunk, cmd->data + (offset - cmd->offset), + length - sizeof offset, offset, + LIBNBD_READ_DATA, &error) == -1) if (cmd->error == 0) cmd->error = error ? error : EPROTO; if (flags & NBD_REPLY_FLAG_DONE) @@ -457,10 +456,10 @@ int error = cmd->error; uint16_t flags = be16toh (h->sbuf.sr.structured_reply.flags); - if (cmd->cb.fn.chunk.callback (cmd->cb.fn.chunk.user_data, - cmd->data + offset, length, - cmd->offset + offset, - LIBNBD_READ_HOLE, &error) == -1) + if (CALL_CALLBACK (cmd->cb.fn.chunk, + cmd->data + offset, length, + cmd->offset + offset, + LIBNBD_READ_HOLE, &error) == -1) if (cmd->error == 0) cmd->error = error ? error : EPROTO; if (flags & NBD_REPLY_FLAG_DONE) @@ -512,10 +511,10 @@ int error = cmd->error; uint16_t flags = be16toh (h->sbuf.sr.structured_reply.flags); - if (cmd->cb.fn.extent.callback (cmd->cb.fn.extent.user_data, - meta_context->name, cmd->offset, - &h->bs_entries[1], (length-4) / 4, - &error) == -1) + if (CALL_CALLBACK (cmd->cb.fn.extent, + meta_context->name, cmd->offset, + &h->bs_entries[1], (length-4) / 4, + &error) == -1) if (cmd->error == 0) cmd->error = error ? error : EPROTO; if (flags & NBD_REPLY_FLAG_DONE) diff --git a/generator/states-reply.c b/generator/states-reply.c index b8bf0ce..41dcf8d 100644 --- a/generator/states-reply.c +++ b/generator/states-reply.c @@ -173,7 +173,7 @@ save_reply_state (struct nbd_handle *h) int r; assert (cmd->type != NBD_CMD_DISC); - r = cmd->cb.completion.callback (cmd->cb.completion.user_data, &error); + r = CALL_CALLBACK (cmd->cb.completion, &error); FREE_CALLBACK (cmd->cb.completion); switch (r) { case -1: diff --git a/generator/states.c b/generator/states.c index 98c10b3..263f60e 100644 --- a/generator/states.c +++ b/generator/states.c @@ -126,7 +126,7 @@ void abort_commands (struct nbd_handle *h, int r; assert (cmd->type != NBD_CMD_DISC); - r = cmd->cb.completion.callback (cmd->cb.completion.user_data, &error); + r = CALL_CALLBACK (cmd->cb.completion, &error); FREE_CALLBACK (cmd->cb.completion); switch (r) { case -1: diff --git a/lib/debug.c b/lib/debug.c index e1ec675..eec2051 100644 --- a/lib/debug.c +++ b/lib/debug.c @@ -84,7 +84,7 @@ nbd_internal_debug (struct nbd_handle *h, const char *fs, ...) if (h->debug_callback.callback) /* ignore return value */ - h->debug_callback.callback (h->debug_callback.user_data, context, msg); + CALL_CALLBACK (h->debug_callback, context, msg); else fprintf (stderr, "libnbd: debug: %s: %s: %s\n", h->hname, context ? : "unknown", msg); diff --git a/lib/internal.h b/lib/internal.h index 305158e..dc3676a 100644 --- a/lib/internal.h +++ b/lib/internal.h @@ -273,6 +273,10 @@ struct command { uint32_t error; /* Local errno value */ }; +/* Call a callback. */ +#define CALL_CALLBACK(cb, ...) \ + (cb).callback ((cb).user_data, ##__VA_ARGS__) + /* Free a callback. * * Note this works for any type of callback because the basic layout -- 2.22.0