keys manipulation OK

This commit is contained in:
eddyem 2019-02-21 20:27:07 +03:00
parent b8dc08bbfd
commit 65f2ed910a
5 changed files with 134 additions and 77 deletions

View File

@ -23,6 +23,7 @@
*/
#include "common.h"
#include <signal.h>
#include <string.h>
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;
}

43
fits.c
View File

@ -22,6 +22,8 @@
#include "FITSmanip.h"
#include <errno.h>
#include <libgen.h> // dirname, basename
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
@ -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,18 +874,35 @@ bool FITS_write(char *filename, FITS *fits){
*/
bool FITS_rewrite(FITS *fits){
FNAME();
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()"); 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;
}
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);
}
/**************************************************************************************
* FITS images *

Binary file not shown.

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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()!"