Feb. 21st, 2019

cfitsio

Feb. 21st, 2019 07:17 pm
eddy_em: (Default)
Решил проблему с симлинками. На всякий случай оставил "как самую последнюю соломинку" перезапись функцией 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);
}

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

April 2025

S M T W T F S
  1 23 45
67 89101112
13141516171819
20212223242526
27282930   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 22nd, 2025 05:07 am
Powered by Dreamwidth Studios