From 65f2ed910adca105f35266769484184aa495e7f1 Mon Sep 17 00:00:00 2001 From: eddyem Date: Thu, 21 Feb 2019 20:27:07 +0300 Subject: [PATCH] keys manipulation OK --- examples/keylist.c | 23 +++++++++ fits.c | 47 +++++++++++------ locale/ru/LC_MESSAGES/FITSmanip.mo | Bin 379 -> 1824 bytes locale/ru/messages.po | 63 ++++++++++++----------- locale/ru/ru.po | 78 ++++++++++++++++------------- 5 files changed, 134 insertions(+), 77 deletions(-) diff --git a/examples/keylist.c b/examples/keylist.c index 9ecdd03..a008464 100644 --- a/examples/keylist.c +++ b/examples/keylist.c @@ -23,6 +23,7 @@ */ #include "common.h" +#include #include typedef struct{ @@ -79,6 +80,12 @@ glob_pars *parse_args(int argc, char **argv){ return &G; } +void ch(int s){ + signal(s, SIG_IGN); + printf("signal: %d\n", s); + signal(s, ch); +} + int main(int argc, char *argv[]){ initial_setup(); parse_args(argc, argv); @@ -137,11 +144,27 @@ int main(int argc, char *argv[]){ ++ptr; } } + // test for signals handler: ctrl+c, ctrl+z + signal(SIGINT, ch); + signal(SIGTSTP, ch); + // protect critical zone blocking all possible signals: + sigset_t mask, oldmask; + sigfillset(&mask); + sigprocmask(SIG_SETMASK, &mask, &oldmask); if(G.outfile){ // save result to new file FITS_write(G.outfile, f); }else{ FITS_rewrite(f); } + DBG("Written! Sleep for 2 seconds in ctitical section"); + sleep(2); + // return ignoring + DBG("Unblock signals, sleep for 2 seconds"); + sigprocmask(SIG_SETMASK, &oldmask, NULL); + sleep(2); + /* + * Do something here + */ return 0; } diff --git a/fits.c b/fits.c index a7b6bd5..83636e1 100644 --- a/fits.c +++ b/fits.c @@ -22,6 +22,8 @@ #include "FITSmanip.h" #include +#include // dirname, basename +#include #include #include #include @@ -722,7 +724,7 @@ FITS *FITS_open(char *filename){ FITS *fits = MALLOC(FITS, 1); int fst = 0; // use fits_open_diskfile instead of fits_open_file to prevent using of extended name syntax - fits_open_diskfile(&fits->fp, filename, READWRITE, &fst); // READWRITE allows to modify files on-the-fly + fits_open_diskfile(&fits->fp, filename, READONLY, &fst); if(fst){ fits_report_error(stderr, fst); FITS_free(&fits); @@ -805,7 +807,7 @@ static bool keylist_write(KeyList *kl, fitsfile *fp){ /** * @brief FITS_write - write FITS file to disk - * @param filename - new filename + * @param filename - new filename (with possible cfitsio additions like ! and so on) * @param fits - structure to write * @return TRUE if all OK */ @@ -813,7 +815,7 @@ bool FITS_write(char *filename, FITS *fits){ if(!filename || !fits) return FALSE; fitsfile *fp; int fst = 0; - fits_create_diskfile(&fp, filename, &fst); + fits_create_file(&fp, filename, &fst); DBG("create file %s", filename); if(fst){fits_report_error(stderr, fst); return FALSE;} int N = fits->NHDUs; @@ -872,17 +874,34 @@ bool FITS_write(char *filename, FITS *fits){ */ bool FITS_rewrite(FITS *fits){ FNAME(); - char *nm = tmpnam(NULL); - if(!nm){WARN("tmpnam()"); return FALSE;} - char *fnm = strrchr(nm, '/'); - if(!fnm){WARN("strrchr()"); return FALSE;} - ++fnm; - DBG("make link: %s -> %s", fits->filename, fnm); - if(link(fits->filename, fnm)){ - WARN("link()"); - return FALSE; - } - return TRUE; + char rlpath[PATH_MAX]; + if(realpath(fits->filename, rlpath)){do{ // got real path - try to make link + char *d = strdup(rlpath); + if(!d){ WARN("strdup()"); FREE(d); break; } + char *dir = dirname(d); + if(!dir){ WARN("dirname()"); FREE(d); break; } + char newpath[PATH_MAX]; + char *nm = tmpnam(NULL); + if(!nm){ WARN("tmpnam()"); FREE(d); break; } + char *fnm = basename(nm); + if(!fnm){ WARN("basename()"); FREE(d); break; } + snprintf(newpath, PATH_MAX, "%s/%s", dir, fnm); + FREE(d); + DBG("make link: %s -> %s", rlpath, newpath); + if(link(rlpath, newpath)){ WARN("link()"); break; } + if(unlink(rlpath)){ WARN("unlink()"); break; } + if(FITS_write(rlpath, fits)){ + unlink(newpath); + return TRUE; + } + // problems: restore old file + if(link(newpath, rlpath)) WARN("link()"); + if(unlink(newpath)) WARN("unlink()"); + }while(0);}else WARN(_("Can't get real path for %s, use cfitsio to rewrite"), fits->filename); + // Can't get realpath or some other error, try to use cfitsio + snprintf(rlpath, PATH_MAX, "!%s", fits->filename); + DBG("PATH: %s", rlpath); + return FITS_write(rlpath, fits); } /************************************************************************************** diff --git a/locale/ru/LC_MESSAGES/FITSmanip.mo b/locale/ru/LC_MESSAGES/FITSmanip.mo index e9f1a55aacb623969e50a1b20e5d620b22dabbb5..10252625ade8e7954d17e2ac029c8b4000d7d473 100644 GIT binary patch literal 1824 zcmaKrZExFD6vquKPhmU_h7f{rs!_3NbxDJSMpnwQHroP8TlGl-2?;O0O-)lfvYn=d zPr(cL5G9ya3|_?gWAJtGi;!P~uVVdO zX#Wv>8|yuA9Q+*=@h_eW@=bt3$4BA%b1;EiI`|g$?~h0lflW~4`3p>e=bw(W!6^2p!5g3fUIM=dUk3L8>n4*3x zhePz|-{U20K%#^){eB|7Kc2=@^j?f-FwbKmh4dUIN|m0)JT-19DwW1*oeYx-+tydo zjH16|lcK6*vaDgMWE+&%EITx0jlvG8imim}9JAr5$HX_W7aqoEk@Zj&9*c{ zoHtp?)NB?WfxAj~XICCwW{rGtQ>QUxHA=wfe;QBi+RD8=^QDlzQ#cj;5mQmu2GV^E zG{|HPf(6^bkumJvHj26`loYgWmba*+p)hQ*HBDzKZ7KO8lTw>Xj)k^qijk^qG9A_G z7AYnp-LT0j77B)GGgX>1XoKyP&`gUoopRb1)BOgl=o`9G^526RR`lVifl$$F-#98+ zwy72iSFX~UqU9NSv|t)vvaBtqRC$$|B7K||5;LD9?j&h7xww>?pNlLqp+e4BIZc&s z6?2xnY{V(DFuyF%;7iyzB+n`~i&HE*`GFjb$+1bi#$)eai@q0)!cksiTbc+S`hA*A zEXtXAc{V|J=i`~wwa@0~l99Ax+48cf=vH2_4Kq%+SJG*kOJtHXmCPhk>6?k!*~R42 z(llK4ToL_~mzlB|r*vZO&Weycl}_KxYZHcvU({pjUeowO_(nH?mt;R8@UZdRS z4d*bp3{K4nZo@-Pb@!JJRozOt>$H!kS8h7q5p~G}-2(&&9J~X!>9pK#89vo=10jbd zx7p%VUK6LA9Xzgx`y#H(RXXr*i{mxj+EK5wJG?X1+95T0i~HG}VWeiu?Q;(y#O)bm z9&UPVw^reM;@9=sE%%^uy zzIf4(p)lO8f$E_#$OEmySl+MlhAS#)ItL!F@qO~B!NU%6w6*RGKULk4{^+@tR{4Ri z!lQ~?xkZner=51ej!x9uHDfBU-Kx@aaH)OPz0xoxl0_S)Uf wZW}_KUKh=79Pg88OVIL@7`z@D!s`7Z_sV{Soocz};xF;=*+l~e7k5`2C0F8$+^to9EK(eMn+bK KrjySwKLG$)D+$5? diff --git a/locale/ru/messages.po b/locale/ru/messages.po index a57ba2a..e48776d 100644 --- a/locale/ru/messages.po +++ b/locale/ru/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-02-14 22:15+0300\n" +"POT-Creation-Date: 2019-02-21 20:26+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,70 +18,77 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #. / "Не могу скопировать данные" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:72 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:90 msgid "Can't copy data" msgstr "" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:287 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:282 +msgid "No keywords in given HDU" +msgstr "" + +#. / "Не могу добавить запись в список" +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:298 +msgid "Can't add record to list" +msgstr "" + +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:351 msgid "strdup() failed!" msgstr "" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:319 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:384 #, c-format msgid "Can't read column %d!" msgstr "" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:333 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:398 #, c-format msgid "Can't read column %d row %d!" msgstr "" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:342 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:407 msgid "Can't read table data type" msgstr "" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:346 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:411 msgid "Can't read table data unit" msgstr "" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:466 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:527 msgid "Unsupported column data type!" msgstr "" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:599 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:662 #, c-format msgid "Can't write table %s!" msgstr "" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:609 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:672 #, c-format msgid "Can't write column %s!" msgstr "" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:650 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:751 msgid "Can't read HDU" msgstr "" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:664 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:778 +msgid "Unknown HDU type" +msgstr "" + +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:900 +#, c-format +msgid "Can't get real path for %s, use cfitsio to rewrite" +msgstr "" + +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:976 +msgid "Bad w, h or pxsz" +msgstr "" + +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:1076 msgid "Images with > 2 dimensions are not supported" msgstr "" -#. / "Не могу добавить запись в список" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:701 -msgid "Can't add record to list" -msgstr "" - -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:715 -#, c-format -msgid "Can't open image HDU #%d" -msgstr "" - -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:724 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:1100 #, c-format msgid "Found %d pixels with undefined value" msgstr "" - -#. / Неправильный тип данных -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:841 -msgid "Wrong data type" -msgstr "" diff --git a/locale/ru/ru.po b/locale/ru/ru.po index dbb5559..494774a 100644 --- a/locale/ru/ru.po +++ b/locale/ru/ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" - "POT-Creation-Date: 2019-02-14 22:15+0300\n" + "POT-Creation-Date: 2019-02-21 20:26+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,71 +16,79 @@ msgstr "Project-Id-Version: PACKAGE VERSION\n" "Content-Type: text/plain; charset=koi8-r\n" "Content-Transfer-Encoding: 8bit\n" +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:976 +msgid "Bad w, h or pxsz" +msgstr "Неверные значения w, h или pxsz" + #. / "Не могу добавить запись в список" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:701 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:298 msgid "Can't add record to list" -msgstr "" +msgstr "Не могу добавить запись в список" #. / "Не могу скопировать данные" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:72 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:90 msgid "Can't copy data" -msgstr "" +msgstr "Не могу скопировать данные" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:715 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:900 #, c-format -msgid "Can't open image HDU #%d" -msgstr "" +msgid "Can't get real path for %s, use cfitsio to rewrite" +msgstr "Не могу определить путь (realpath) к %s, использую cfitsio для " + "перезаписи" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:650 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:751 msgid "Can't read HDU" -msgstr "" +msgstr "Не могу прочесть HDU" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:333 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:398 #, c-format msgid "Can't read column %d row %d!" -msgstr "" +msgstr "Не могу прочесть столбец %d строку %d" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:319 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:384 #, c-format msgid "Can't read column %d!" -msgstr "" +msgstr "Не могу прочесть столбец %d!" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:342 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:407 msgid "Can't read table data type" -msgstr "" +msgstr "Не могу прочесть тип данных таблицы" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:346 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:411 msgid "Can't read table data unit" -msgstr "" +msgstr "Не могу прочесть единицы измерения данных таблицы" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:609 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:672 #, c-format msgid "Can't write column %s!" -msgstr "" +msgstr "Не могу записать столбец %s!" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:599 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:662 #, c-format msgid "Can't write table %s!" -msgstr "" +msgstr "Не могу записать таблицу %s!" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:724 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:1100 #, c-format msgid "Found %d pixels with undefined value" -msgstr "" +msgstr "Найдено %d пикселей с неопределенными значениями" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:664 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:1076 msgid "Images with > 2 dimensions are not supported" -msgstr "" +msgstr "Изображения с более чем двумя измерениями не поддерживаются" -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:466 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:282 +msgid "No keywords in given HDU" +msgstr "В данном HDU ключи отсутствуют" + +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:778 +msgid "Unknown HDU type" +msgstr "Неизвестный тип HDU" + +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:527 msgid "Unsupported column data type!" -msgstr "" +msgstr "Неподдерживаемый тип данных столбца!" -#. / Неправильный тип данных -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:841 -msgid "Wrong data type" -msgstr "" - -#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:287 +#: /home/eddy/C-files/FITSmaniplib/sharedlib_template/fits.c:351 msgid "strdup() failed!" -msgstr "" +msgstr "Не удалось сделать strdup()!"