static int zstd_flush(void* data) {
struct zstd_cookie* cookie = data;
+ ssize_t bytes_left;
int r;
// Fail if were given no cookie
cookie->out.size = sizeof(cookie->buffer);
cookie->out.pos = 0;
- r = ZSTD_endStream(cookie->cstream, &cookie->out);
- if (ZSTD_isError(r))
+ bytes_left = ZSTD_endStream(cookie->cstream, &cookie->out);
+ if (ZSTD_isError(bytes_left))
return -1;
+ // Otherwise we write the buffer to the file
+ if (cookie->out.pos) {
+ r = fwrite(cookie->buffer, 1, cookie->out.pos, cookie->f);
+ if (r < (ssize_t)cookie->out.pos)
+ return -1;
+ }
+
// If the buffer is empty we are done
- if (r == 0)
+ if (bytes_left == 0)
break;
-
- // Otherwise we write the buffer to the file
- r = fwrite(cookie->buffer, 1, cookie->out.pos, cookie->f);
- if (r < (ssize_t)cookie->out.pos)
- return -1;
}
}