X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=pctb%2Fconvert.c;h=4ded228f9d130ffb7a40bfb2758872afe6678b4f;hp=9fcbd58483fb08587a040fd25cd33c4aecdec571;hb=2e3f8f6ab168a6824dac1430473c7299018a1b0f;hpb=4172802be80063ded4208231cf9fc2acdc35784b diff --git a/pctb/convert.c b/pctb/convert.c index 9fcbd58..4ded228 100644 --- a/pctb/convert.c +++ b/pctb/convert.c @@ -66,6 +66,8 @@ FILE *screenshot_file; const char *o_ocean, *o_pirate; int o_quiet; +static pid_t screenshot_compressor=-1; + enum flags o_flags= ff_charset_allowedit | ff_dict_fetch|ff_dict_submit|ff_dict_pirate; @@ -79,11 +81,17 @@ static void vbadusage(const char *fmt, va_list al) { } DEFINE_VWRAPPERF(static, badusage, NORET); -static void open_screenshot_file(const char *mode) { - screenshot_file= fopen(o_screenshot_fn, mode); - if (!screenshot_file) - fatal("could not open screenshots file `%s': %s", - o_screenshot_fn, strerror(errno)); +static void open_screenshot_file(int for_write) { + if (!fnmatch("*.gz",o_screenshot_fn,0)) { + int mode= for_write ? O_WRONLY|O_CREAT|O_TRUNC : O_RDONLY; + sysassert(! gzopen(o_screenshot_fn, mode, &screenshot_file, + &screenshot_compressor, "-1") ); + } else { + screenshot_file= fopen(o_screenshot_fn, for_write ? "w" : "r"); + if (!screenshot_file) + fatal("could not open screenshots file `%s': %s", + o_screenshot_fn, strerror(errno)); + } } static void run_analysis(void) { @@ -110,33 +118,40 @@ static void run_analysis(void) { EXECLP_HELPER("commod-results-processor", o_outmode_str, (char*)0); } - waitpid_check_exitstatus(processor, "output processor/uploader"); + waitpid_check_exitstatus(processor, "output processor/uploader", 0); fclose(tf); progress_log("all complete."); } -void fetch_with_rsync(const char *stem) { +static void rsync_core(const char *stem, const char *suffix, + const char *zopt) { pid_t fetcher; + progress("Updating dictionary %s...",stem); + sysassert( (fetcher= fork()) != -1 ); if (!fetcher) { const char *rsync= getenv("YPPSC_PCTB_RSYNC"); if (!rsync) rsync= "rsync"; const char *src= getenv("YPPSC_PCTB_DICT_UPDATE"); - char *remote= masprintf("%s/master-%s.txt", src, stem); - char *local= masprintf("_master-%s.txt", stem); + char *remote= masprintf("%s/master-%s.txt%s", src, stem, suffix); + char *local= masprintf("_master-%s.txt%s", stem, suffix); if (DEBUGP(rsync)) fprintf(stderr,"executing rsync to fetch %s to %s\n",remote,local); - execlp(rsync, "rsync", - DEBUGP(rsync) ? "-zvLt" : "-zLt", - "--",remote,local,(char*)0); + char *opts= masprintf("-Lt%s%s", + zopt, + DEBUGP(rsync) ? "v" : ""); + execlp(rsync, "rsync",opts,"--",remote,local,(char*)0); sysassert(!"exec rsync failed"); } - waitpid_check_exitstatus(fetcher, "rsync"); + waitpid_check_exitstatus(fetcher, "rsync", 0); } +void fetch_with_rsync_gz(const char *stem) { rsync_core(stem,".gz",""); } +void fetch_with_rsync(const char *stem) { rsync_core(stem,"","z"); } + static void set_server(const char *envname, const char *defprotocol, const char *defvalue, const char *defvalue_test, const char *userspecified, @@ -211,7 +226,8 @@ int main(int argc, char **argv) { IS("--best-prices")) o_outmode_kind=omk_str, o_outmode_str=arg+2; - else if (IS("--screenshot-file")) o_screenshot_fn= ARGVAL; + else if (IS("--screenshot-file")|| + IS("--screenshots-file")) o_screenshot_fn= ARGVAL; else if (IS("--pctb-server")) o_serv_pctb= ARGVAL; else if (IS("--dict-submit-server")) o_serv_dict_submit= ARGVAL; else if (IS("--dict-update-server")) o_serv_dict_fetch= ARGVAL; @@ -267,7 +283,7 @@ int main(int argc, char **argv) { o_serv_dict_submit, o_flags & ff_dict_submit); if (!o_screenshot_fn) - o_screenshot_fn= masprintf("%s/_pages.ppm",get_vardir()); + o_screenshot_fn= masprintf("%s/_pages.ppm.gz", get_vardir()); /* Actually do the work */ @@ -296,22 +312,25 @@ int main(int argc, char **argv) { } if (o_mode & mf_screenshot) { - open_screenshot_file("w"); + open_screenshot_file(1); if (o_flags & ff_singlepage) take_one_screenshot(); else take_screenshots(); progress_log("OK for you to move the mouse now, and you can" " use the YPP client again."); + progress("Finishing handling screenshots..."); + gzclose(&screenshot_file,&screenshot_compressor,"screenshots output"); } if (o_mode & mf_readscreenshot) { if ((o_flags & ff_upload) && !(o_flags & ff_testservers)) badusage("must not reuse screenshots for upload to live PCTB database"); - open_screenshot_file("r"); + open_screenshot_file(0); if (o_flags & ff_singlepage) read_one_screenshot(); else read_screenshots(); + gzclose(&screenshot_file,&screenshot_compressor,"screenshots input"); } if (o_mode & mf_analyse) { if (o_flags & ff_needisland) { - find_islandname(page_images[0]->rgb); + find_islandname(); if (o_flags & ff_printisland) printf("%s, %s\n", archipelago, island); sysassert(! setenv("YPPSC_ISLAND",island,1) ); @@ -411,7 +430,7 @@ void sysassert_fail(const char *file, int line, const char *what) { _exit(16); } -void waitpid_check_exitstatus(pid_t pid, const char *what) { +void waitpid_check_exitstatus(pid_t pid, const char *what, int sigpipeok) { pid_t got; int st; for (;;) { @@ -426,8 +445,9 @@ void waitpid_check_exitstatus(pid_t pid, const char *what) { fatal("%s failed with nonzero exit status %d", what, WEXITSTATUS(st)); } else if (WIFSIGNALED(st)) { - fatal("%s died due to signal %s%s", what, - strsignal(WTERMSIG(st)), WCOREDUMP(st)?" (core dumped)":""); + if (!sigpipeok || WTERMSIG(st) != SIGPIPE) + fatal("%s died due to signal %s%s", what, + strsignal(WTERMSIG(st)), WCOREDUMP(st)?" (core dumped)":""); } else { fatal("%s gave strange wait status %d", what, st); }