/* Call with the basis file */ static PyObject* _librsync_new_patchmaker(PyObject* self, PyObject* args) { _librsync_PatchMakerObject* pm; PyObject *python_file; FILE *cfile; if (!PyArg_ParseTuple(args, "O:new_patchmaker", &python_file)) return NULL; if (!PyFile_Check(python_file)) { PyErr_SetString(PyExc_TypeError, "Need true file object"); return NULL; } Py_INCREF(python_file); pm = PyObject_New(_librsync_PatchMakerObject, &_librsync_PatchMakerType); if (pm == NULL) return NULL; pm->x_attr = NULL; pm->basis_file = python_file; cfile = PyFile_AsFile(python_file); pm->patch_job = rs_patch_begin(rs_file_copy_cb, cfile); return (PyObject*)pm; }
rs_result rs_patch_gzfile(struct asfd *asfd, struct fzp *basis_file, struct fzp *delta_file, struct fzp *new_file, rs_stats_t *stats, struct cntr *cntr) { rs_job_t *job; rs_result r; job=rs_patch_begin(rs_file_copy_cb, basis_file); r=rs_whole_gzrun(asfd, job, delta_file, new_file, cntr); rs_job_free(job); return r; }
static ERL_NIF_TERM patch_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { state_t *state = init_state(); if (!enif_inspect_iolist_as_binary(env, argv[0], &state->bin)) return enif_make_badarg(env); enif_realloc_binary(&state->bin, state->bin.size); state->job = rs_patch_begin((rs_copy_cb *) &read_callback, state); state->type = PATCH; ERL_NIF_TERM result = enif_make_resource(env, state); enif_release_resource(state); return result; }
rs_result rs_patch_file(FILE *basis_file, FILE *delta_file, FILE *new_file, rs_stats_t *stats) { rs_job_t *job; rs_result r; job = rs_patch_begin(rs_file_copy_cb, basis_file); r = rs_whole_run(job, delta_file, new_file); if (stats) memcpy(stats, &job->stats, sizeof *stats); rs_job_free(job); return r; }
rs_result rs_patch_gzfile(FILE *basis_file, FILE *delta_file, gzFile delta_zfile, FILE *new_file, gzFile new_zfile, rs_stats_t *stats, struct cntr *cntr) { rs_job_t *job; rs_result r; job = rs_patch_begin(rs_file_copy_cb, basis_file); r = rs_whole_gzrun(job, delta_file, delta_zfile, new_file, new_zfile, cntr); /* if (stats) memcpy(stats, &job->stats, sizeof *stats); */ rs_job_free(job); return r; }
executer_result _executer_recive_delta (executer_job_t * job) { char *temppath; rs_buffers_t rsbuf; executer_rs inrs; executer_rs outrs; int result; utils_debug ("Receving delta."); int tempfile = _executer_create_temp (job->realpath, &temppath); if (tempfile == 0) { utils_error ("Error creating temp file for file '%s': %s", job->realpath, strerror (errno)); return EXECUTER_ERROR; } FILE *origfile = fopen (job->realpath, "rb"); if (origfile == NULL) { utils_error ("Error opening file '%s': %s", job->realpath, strerror (errno)); return EXECUTER_ERROR; } rs_job_t *patchjob = rs_patch_begin (rs_file_copy_cb, origfile); inrs.sock = job->peer_sock; inrs.type = _EXECUTER_SOCKET; inrs.size = _EXECUTER_DEFAULT_OUT; inrs.buf = malloc (inrs.size); outrs.sock = tempfile; outrs.type = _EXECUTER_FILE; outrs.size = RS_DEFAULT_BLOCK_LEN; outrs.buf = malloc (outrs.size); rsbuf.avail_in = 0; rsbuf.avail_out = 0; rsbuf.next_in = 0; rsbuf.next_out = 0; rsbuf.eof_in = false; result = rs_job_drive (patchjob, &rsbuf, _executer_in_callback, &inrs, _executer_out_callback, &outrs); if (result != RS_DONE) { utils_error ("Error patching file"); return EXECUTER_ERROR; } //Check if there are any data if (rsbuf.avail_out > 0) { _executer_in_callback (patchjob, &rsbuf, &inrs); _executer_out_callback (patchjob, &rsbuf, &outrs); } rs_job_free (patchjob); close (tempfile); fclose (origfile); free (outrs.buf); free (inrs.buf); job->next_operation = _executer_receive_stat; job->tempfile = temppath; return EXECUTER_RUNNING; }