bool convert_header_to_stat()

in src/cache.cpp [79:174]


bool convert_header_to_stat(const std::string& strpath, const headers_t& meta, struct stat* pst, bool forcedir, bool noextendedmeta, off_t check_size_meta)
{
    if(!pst){
        return false;
    }
    memset(pst, 0, sizeof(struct stat));

    pst->st_nlink = 1; // see fuse FAQ

    // mode
    pst->st_mode = get_mode(meta, strpath, true, forcedir, noextendedmeta);

    // blocks
    if(S_ISREG(pst->st_mode)){
        pst->st_blocks = get_blocks(pst->st_size);
    }
    pst->st_blksize = 4096;

    // mtime
    struct timespec mtime = get_mtime(meta, true, noextendedmeta);
    if(pst->st_mtime < 0){
        pst->st_mtime = 0L;
    }else{
        if(mtime.tv_sec < 0){
            mtime.tv_sec  = 0;
            mtime.tv_nsec = 0;
        }
#if defined(__APPLE__)
        pst->st_mtime = mtime.tv_sec;
        pst->st_mtimespec.tv_nsec = mtime.tv_nsec;
#else
        pst->st_mtim.tv_sec = mtime.tv_sec;
        pst->st_mtim.tv_nsec = mtime.tv_nsec;
#endif
    }

    // ctime
    struct timespec ctime = get_ctime(meta, true, noextendedmeta);
    if(pst->st_ctime < 0){
        pst->st_ctime = 0L;
    }else{
        if(ctime.tv_sec < 0){
            ctime.tv_sec  = 0;
            ctime.tv_nsec = 0;
        }
#if defined(__APPLE__)
        pst->st_ctime = ctime.tv_sec;
        pst->st_ctimespec.tv_nsec = ctime.tv_nsec;
#else
        pst->st_ctim.tv_sec = ctime.tv_sec;
        pst->st_ctim.tv_nsec = ctime.tv_nsec;
#endif
    }

    // atime
    struct timespec atime = get_atime(meta, true, noextendedmeta);
    if(pst->st_atime < 0){
        pst->st_atime = 0L;
    }else{
        if(atime.tv_sec < 0){
            atime.tv_sec  = 0;
            atime.tv_nsec = 0;
        }
#if defined(__APPLE__)
        pst->st_atime = atime.tv_sec;
        pst->st_atimespec.tv_nsec = atime.tv_nsec;
#else
        pst->st_atim.tv_sec = atime.tv_sec;
        pst->st_atim.tv_nsec = atime.tv_nsec;
#endif
    }

    // size
    if (S_ISDIR(pst->st_mode)) {
        pst->st_size = 4096;
    } else {
        pst->st_size = get_size(meta);
    }

    //change symlink to S_IFREG
    if (noextendedmeta && S_ISLNK(pst->st_mode) && !is_check_meta(pst->st_size, check_size_meta)) {
        pst->st_mode &= ~S_IFMT;
        pst->st_mode |= S_IFREG;
    }

    //new symlink format
    if (S_ISLNK(pst->st_mode) && pst->st_size == 0) {
        pst->st_size = get_symlink_size(meta);
    }

    // uid/gid
    pst->st_uid = get_uid(meta, noextendedmeta);
    pst->st_gid = get_gid(meta, noextendedmeta);

    return true;
}