cfitsio

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

Теперь еще надо подумать, как эту критическую секцию защитить от сигналов. Либо оставить это на совести программ, использующих данную библиотечную функцию (по-моему, это будет правильней).
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org

April 2025

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

Most Popular Tags

Style Credit

Expand Cut Tags

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