Поиск

cfitsio


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


Теперь еще надо подумать, как эту критическую секцию защитить от сигналов. Либо оставить это на совести программ, использующих данную библиотечную функцию (по-моему, это будет правильней). eddy_em.livejournal.com

Добавить комментарий