Something like:
iodone(char *buf, int len, int retval)
{
if (retval == -1) {
fprintf(stderr, "I/O on buffer %x for %d failed: %d\n",
buf, len, retval);
} else if (retval < len) {
fprintf(stderr, "I/O on buffer %x wanted %d got %d\n",
buf, len, retval);
} /* else success */
free(buf);
}
char *buf = valloc(SIZE);
reada(fd, buf, SIZE, iodone);
/* do some other useful work */
...
Is that what you meant?