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;
}