static int run_restore(struct asfd *asfd, struct sdirs *sdirs, struct conf **cconfs, int srestore) { int ret=-1; char *dir_for_notify=NULL; enum action act=ACTION_RESTORE; struct iobuf *rbuf=asfd->rbuf; const char *cname=get_string(cconfs[OPT_CNAME]); if(parse_restore_str_and_set_confs(rbuf->buf, &act, cconfs)) goto end; iobuf_free_content(rbuf); if(act==ACTION_RESTORE) { int r; if((r=client_can_restore(cconfs))<0) goto end; else if(!r) { logp("Not allowing restore of %s\n", cname); if(!asfd->write_str(asfd, CMD_GEN, "Client restore is not allowed")) ret=0; goto end; } } if(act==ACTION_VERIFY && !(client_can_generic(cconfs, OPT_CLIENT_CAN_VERIFY))) { logp("Not allowing verify of %s\n", cname); if(!asfd->write_str(asfd, CMD_GEN, "Client verify is not allowed")) ret=0; goto end; } if(asfd->write_str(asfd, CMD_GEN, "ok")) goto end; ret=do_restore_server(asfd, sdirs, act, srestore, &dir_for_notify, cconfs); if(dir_for_notify) maybe_do_notification(asfd, ret, sdirs->client, dir_for_notify, act==ACTION_RESTORE?"restorelog":"verifylog", act==ACTION_RESTORE?"restore":"verify", cconfs); end: free_w(&dir_for_notify); return ret; }
static int run_restore(struct asfd *asfd, struct sdirs *sdirs, struct conf **cconfs, int srestore) { int ret=-1; char *cp=NULL; char *copy=NULL; enum action act; char *backupnostr=NULL; char *restoreregex=NULL; char *dir_for_notify=NULL; struct iobuf *rbuf=asfd->rbuf; const char *cname=get_string(cconfs[OPT_CNAME]); if(!(copy=strdup_w(rbuf->buf, __func__))) goto end; iobuf_free_content(rbuf); if(!strncmp_w(copy, "restore ")) act=ACTION_RESTORE; else act=ACTION_VERIFY; if(!(backupnostr=strchr(copy, ' '))) { logp("Could not parse %s in %s\n", copy, __func__); goto end; } backupnostr++; if(set_string(cconfs[OPT_BACKUP], backupnostr)) goto end; // FIX THIS. if((cp=strchr(cconfs[OPT_BACKUP]->data.s, ':'))) *cp='\0'; if(act==ACTION_RESTORE) { int r; if((r=client_can_restore(cconfs))<0) goto end; else if(!r) { logp("Not allowing restore of %s\n", cname); if(!asfd->write_str(asfd, CMD_GEN, "Client restore is not allowed")) ret=0; goto end; } } if(act==ACTION_VERIFY && !(client_can_generic(cconfs, OPT_CLIENT_CAN_VERIFY))) { logp("Not allowing verify of %s\n", cname); if(!asfd->write_str(asfd, CMD_GEN, "Client verify is not allowed")) ret=0; goto end; } if((restoreregex=strchr(copy, ':'))) { *restoreregex='\0'; restoreregex++; } if(restoreregex && *restoreregex && set_string(cconfs[OPT_REGEX], restoreregex)) goto end; if(asfd->write_str(asfd, CMD_GEN, "ok")) goto end; ret=do_restore_server(asfd, sdirs, act, srestore, &dir_for_notify, cconfs); if(dir_for_notify) maybe_do_notification(asfd, ret, sdirs->client, dir_for_notify, act==ACTION_RESTORE?"restorelog":"verifylog", act==ACTION_RESTORE?"restore":"verify", cconfs); end: free_w(©); free_w(&dir_for_notify); return ret; }
static void run_test(int expected_ret, enum protocol protocol, int manio_entries, int blocks_per_file, void setup_asfds_callback(struct asfd *asfd, struct slist *slist)) { struct async *as; struct asfd *asfd; struct sdirs *sdirs; struct conf **confs; struct slist *slist=NULL; char *dir_for_notify=NULL; prng_init(0); base64_init(); hexmap_init(); setup(protocol, &as, &sdirs, &confs); set_string(confs[OPT_BACKUP], "1"); set_protocol(confs, protocol); asfd=asfd_mock_setup(&reads, &writes); as->asfd_add(as, asfd); as->read_write=async_rw_simple; as->read_quick=async_rw_simple; asfd->as=as; build_storage_dirs(sdirs, sd1, ARR_LEN(sd1)); if(manio_entries) { struct sbuf *s; if(protocol==PROTO_2) slist=build_manifest_with_data_files(sdirs->cmanifest, sdirs->data, manio_entries, blocks_per_file); else { slist=build_manifest(sdirs->cmanifest, protocol, manio_entries, 0 /*phase*/); for(s=slist->head; s; s=s->next) { char path[256]; if(!sbuf_is_filedata(s)) continue; snprintf(path, sizeof(path), "%s/%s%s", sdirs->currentdata, TREE_DIR, s->path.buf); build_file(path, "data"); } } } setup_asfds_callback(asfd, slist); fail_unless(do_restore_server( asfd, sdirs, ACTION_RESTORE, 0, // srestore &dir_for_notify, confs )==expected_ret); if(!expected_ret) { // FIX THIS: Should check for the presence and correctness of // changed and unchanged manios. } slist_free(&slist); free_w(&dir_for_notify); tear_down(&as, &asfd, &sdirs, &confs); }