Hi.
I'm trying to make use of the streaming API but I get into trouble when generating delta. It works if I use the whole-file API, so I guess I'm doing something wrong. Help is appreciated.
Thanks.
delta.c
---
#include <stdio.h>
#include <stdlib.h>
#include <librsync.h>
#define BUFSZ (1024*4)
int main(int argc, char **argv) {
int e;
FILE *f;
char ibuf[BUFSZ];
char obuf[BUFSZ];
rs_job_t *job = NULL;
rs_signature_t *sig = NULL;
rs_buffers_t rsb = { 0 };
if (argv[1] == NULL) {
fputs("USAGE: delta newfile < sigfile > deltafile\n", stderr);
return EXIT_FAILURE;
}
if (!(f = fopen(argv[1], "r"))) {
perror(NULL);
return EXIT_FAILURE;
}
if (rs_loadsig_file(stdin, &sig, NULL) || rs_build_hash_table(sig))
goto cleanup;
job = rs_delta_begin(sig);
do {
rsb.next_in = ibuf, rsb.avail_in = sizeof(ibuf);
rsb.avail_in = fread(ibuf, 1, rsb.avail_in, f);
if (rsb.avail_in == 0) {
if (ferror(f)) {
perror(NULL);
goto cleanup;
}
rsb.eof_in = 1;
}
do {
rsb.next_out = obuf, rsb.avail_out = sizeof(obuf);
e = rs_job_iter(job, &rsb);
if (e != RS_DONE && e != RS_BLOCKED)
goto cleanup;
fwrite(obuf, 1, sizeof(obuf) - rsb.avail_out, stdout);
} while (rsb.avail_in);
} while (!rsb.eof_in);
cleanup:
fclose(f);
if (job)
rs_job_free(job);
if (sig)
rs_free_sumset(sig);
return rsb.eof_in ? EXIT_SUCCESS : EXIT_FAILURE;
}
---