static int forget_file(struct asfd *asfd, struct sbuf *sb, struct conf *conf) { // Tell the server to forget about this // file, otherwise it might get stuck // on a select waiting for it to arrive. if(asfd->write_str(asfd, CMD_INTERRUPT, sb->path.buf)) return 0; if(sb->path.cmd==CMD_FILE && sb->burp1->datapth.buf) { rs_signature_t *sumset=NULL; // The server will be sending us a signature. // Munch it up then carry on. if(load_signature(asfd, &sumset, conf)) return -1; else rs_free_sumset(sumset); } return 0; }
bool Environment::verify_paths(std::string prefix) { struct stat st; std::string dir = prefix + RBX_RUNTIME_PATH; if(stat(dir.c_str(), &st) == -1 || !S_ISDIR(st.st_mode)) return false; if(!load_signature(dir)) return false; dir = prefix + RBX_BIN_PATH; if(stat(dir.c_str(), &st) == -1 || !S_ISDIR(st.st_mode)) return false; dir = prefix + RBX_KERNEL_PATH; if(stat(dir.c_str(), &st) == -1 || !S_ISDIR(st.st_mode)) return false; dir = prefix + RBX_LIB_PATH; if(stat(dir.c_str(), &st) == -1 || !S_ISDIR(st.st_mode)) return false; return true; }
static int forget_file(struct sbuf *sb, char cmd, struct cntr *cntr) { // Tell the server to forget about this // file, otherwise it might get stuck // on a select waiting for it to arrive. if(async_write_str(CMD_INTERRUPT, sb->path)) return 0; if(cmd==CMD_FILE && sb->datapth) { rs_signature_t *sumset=NULL; // The server will be sending // us a signature. Munch it up // then carry on. if(load_signature(&sumset, cntr)) return -1; else rs_free_sumset(sumset); } return 0; }
static int load_signature_and_send_delta(BFILE *bfd, FILE *in, unsigned long long *bytes, unsigned long long *sentbytes, struct cntr *cntr, size_t datalen) { rs_job_t *job; rs_result r; rs_signature_t *sumset=NULL; unsigned char checksum[MD5_DIGEST_LENGTH+1]; rs_filebuf_t *infb=NULL; rs_filebuf_t *outfb=NULL; rs_buffers_t rsbuf; memset(&rsbuf, 0, sizeof(rsbuf)); if(load_signature(&sumset, cntr)) return -1; //logp("start delta\n"); if(!(job=rs_delta_begin(sumset))) { logp("could not start delta job.\n"); rs_free_sumset(sumset); return RS_IO_ERROR; } if(!(infb=rs_filebuf_new(bfd, in, NULL, -1, ASYNC_BUF_LEN, datalen, cntr)) || !(outfb=rs_filebuf_new(NULL, NULL, NULL, async_get_fd(), ASYNC_BUF_LEN, -1, cntr))) { logp("could not rs_filebuf_new for delta\n"); if(infb) rs_filebuf_free(infb); return -1; } //logp("start delta loop\n"); while(1) { size_t wlen=0; rs_result delresult; delresult=rs_async(job, &rsbuf, infb, outfb); if(delresult==RS_DONE) { r=delresult; // logp("delresult done\n"); break; } else if(delresult==RS_BLOCKED || delresult==RS_RUNNING) { // logp("delresult running/blocked: %d\n", delresult); // Keep going } else { logp("error in rs_async for delta: %d\n", delresult); r=delresult; break; } // FIX ME: get it to read stuff (errors, for example) here too. if(async_rw(NULL, NULL, '\0', '\0', NULL, &wlen)) return -1; } if(r!=RS_DONE) logp("delta loop returned: %d\n", r); //logp("after delta loop: %d\n", r); //logp("\n"); if(r==RS_DONE) { *bytes=infb->bytes; *sentbytes=outfb->bytes; if(!MD5_Final(checksum, &(infb->md5))) { logp("MD5_Final() failed\n"); r=RS_IO_ERROR; } } rs_filebuf_free(infb); rs_filebuf_free(outfb); rs_job_free(job); rs_free_sumset(sumset); if(r==RS_DONE && write_endfile(*bytes, checksum)) // finish delta file return -1; //logp("end of load_sig_send_delta\n"); return r; }
static int load_signature_and_send_delta(struct asfd *asfd, BFILE *bfd, FILE *in, unsigned long long *bytes, unsigned long long *sentbytes, struct conf *conf, size_t datalen) { rs_job_t *job; rs_result r; rs_signature_t *sumset=NULL; unsigned char checksum[MD5_DIGEST_LENGTH+1]; rs_filebuf_t *infb=NULL; rs_filebuf_t *outfb=NULL; rs_buffers_t rsbuf; memset(&rsbuf, 0, sizeof(rsbuf)); if(load_signature(asfd, &sumset, conf)) return -1; if(!(job=rs_delta_begin(sumset))) { logp("could not start delta job.\n"); rs_free_sumset(sumset); return RS_IO_ERROR; } if(!(infb=rs_filebuf_new(asfd, bfd, in, NULL, -1, ASYNC_BUF_LEN, datalen, conf->cntr)) || !(outfb=rs_filebuf_new(asfd, NULL, NULL, NULL, asfd->fd, ASYNC_BUF_LEN, -1, conf->cntr))) { logp("could not rs_filebuf_new for delta\n"); if(infb) rs_filebuf_free(infb); return -1; } while(1) { rs_result delresult; delresult=rs_async(job, &rsbuf, infb, outfb); if(delresult==RS_DONE) { r=delresult; break; } else if(delresult==RS_BLOCKED || delresult==RS_RUNNING) { // Keep going } else { logp("error in rs_async for delta: %d\n", delresult); r=delresult; break; } // FIX ME: get it to read stuff (errors, for example) here too. if(asfd->as->rw(asfd->as)) return -1; } if(r!=RS_DONE) logp("delta loop returned: %d\n", r); if(r==RS_DONE) { *bytes=infb->bytes; *sentbytes=outfb->bytes; if(!MD5_Final(checksum, &(infb->md5))) { logp("MD5_Final() failed\n"); r=RS_IO_ERROR; } } rs_filebuf_free(infb); rs_filebuf_free(outfb); rs_job_free(job); rs_free_sumset(sumset); if(r==RS_DONE && write_endfile(asfd, *bytes, checksum)) return -1; return r; }