Решил проблему с симлинками. На всякий случай оставил "как самую последнюю соломинку" перезапись функцией cfitsio (когда к имени добавляется префикс — восклицательный знак). Вот только с симлинками это не работает, т.к. cfitsio не парится и просто делает unlink на файл и создает его снова. Т.е. удаляет симлинк и создает файл с этим именем.
Мне лень разбираться, как средствами cfitsio это обойти (как вариант, можно закрыть файл, "обнулить" его самостоятельно и дальше уже средствами cfitsio), поэтому оставлю как есть (маловероятно, что что-то пойдет не так и придется средствами cfitsio работать):
Теперь еще надо подумать, как эту критическую секцию защитить от сигналов. Либо оставить это на совести программ, использующих данную библиотечную функцию (по-моему, это будет правильней).
Мне лень разбираться, как средствами cfitsio это обойти (как вариант, можно закрыть файл, "обнулить" его самостоятельно и дальше уже средствами cfitsio), поэтому оставлю как есть (маловероятно, что что-то пойдет не так и придется средствами cfitsio работать):
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()"); 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);
}
Теперь еще надо подумать, как эту критическую секцию защитить от сигналов. Либо оставить это на совести программ, использующих данную библиотечную функцию (по-моему, это будет правильней).