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; }