static struct asfd *asfd_setup(const char *outputpath) { struct asfd *asfd; fail_unless((asfd=asfd_alloc())!=NULL); fail_unless((asfd->rbuf=iobuf_alloc())!=NULL); asfd->write=my_asfd_write; fail_unless(!build_path_w(outputpath)); fail_unless((output=fzp_open(outputpath, "wb"))!=NULL); json_set_pretty_print(1); return asfd; }
static int parse_client_data(struct asfd *srfd, struct cstat *clist, struct conf **confs) { int ret=0; char *command=NULL; char *client=NULL; char *backup=NULL; char *logfile=NULL; char *browse=NULL; const char *cp=NULL; struct cstat *cstat=NULL; struct bu *bu=NULL; //printf("got client data: '%s'\n", srfd->rbuf->buf); cp=srfd->rbuf->buf; // The client monitor will send an initial blank line to kick things // off. Until it is sent, we will not even have entered the code // in this file. So, without it, data from the parent will not have // been read, and the monitor client will be given incomplete // information for its first response. // Just ignore the new line at this point, it has served its purpose. if(srfd->rbuf->len==1 && !strcmp(cp, "\n")) { ret=0; goto end; } command=get_str(&cp, "j:", 0); client=get_str(&cp, "c:", 0); backup=get_str(&cp, "b:", 0); logfile=get_str(&cp, "l:", 0); browse=get_str(&cp, "p:", 1); if(command) { if(!strcmp(command, "pretty-print-on")) { json_set_pretty_print(1); if(json_send_warn(srfd, "Pretty print on")) goto error; } else if(!strcmp(command, "pretty-print-off")) { json_set_pretty_print(0); if(json_send_warn(srfd, "Pretty print off")) goto error; } else { if(json_send_warn(srfd, "Unknown command")) goto error; } goto end; } if(browse) { free_w(&logfile); if(!(logfile=strdup_w("manifest", __func__))) goto error; strip_trailing_slashes(&browse); } //dump_cbno(clist, "pcd"); if(client && *client) { if(!(cstat=cstat_get_by_name(clist, client))) { if(json_send_warn(srfd, "Could not find client")) goto error; goto end; } if(cstat_set_backup_list(cstat)) { if(json_send_warn(srfd, "Could not get backup list")) goto error; goto end; } } if(cstat && backup) { unsigned long bno=0; if(!(bno=strtoul(backup, NULL, 10))) { if(json_send_warn(srfd, "Could not get backup number")) goto error; goto end; } for(bu=cstat->bu; bu; bu=bu->prev) if(bu->bno==bno) break; if(!bu) { if(json_send_warn(srfd, "Backup not found")) goto error; goto end; } } if(logfile) { if(strcmp(logfile, "manifest") && strcmp(logfile, "backup") && strcmp(logfile, "restore") && strcmp(logfile, "verify") && strcmp(logfile, "backup_stats") && strcmp(logfile, "restore_stats") && strcmp(logfile, "verify_stats")) { if(json_send_warn(srfd, "File not supported")) goto error; goto end; } } /* printf("client: %s\n", client?:""); printf("backup: %s\n", backup?:""); printf("logfile: %s\n", logfile?:""); */ if(cstat) { if(!cstat->run_status) cstat_set_run_status(cstat); } else for(cstat=clist; cstat; cstat=cstat->next) { if(!cstat->run_status) cstat_set_run_status(cstat); } if(json_send(srfd, clist, cstat, bu, logfile, browse, get_int(confs[OPT_MONITOR_BROWSE_CACHE]))) goto error; goto end; error: ret=-1; end: free_w(&client); free_w(&backup); free_w(&logfile); free_w(&browse); return ret; }