FSStatus FSGetStatAsync(FSClient *client, FSCmdBlock *block, const char *filepath, FSStat *stat, uint32_t flags, FSAsyncData *asyncData) { assert(asyncData->callback); auto result = FSGetStat(client, block, filepath, stat, flags); FSAsyncCallback cb = static_cast<uint32_t>(asyncData->callback); cb(client, block, result, asyncData->param); return result; }
FSStatus SAVEGetStat(FSClient *client, FSCmdBlock *block, uint8_t account, const char *path, FSStat *stat, uint32_t flags) { auto fsPath = internal::getSavePath(account, path); return FSGetStat(client, block, fsPath.path().c_str(), stat, flags); }
static int FSDrvStat(struct _reent* r, const char* file, struct stat* st) { FSStat stat; FSStatus err = FSGetStat(fsClient, fsCmdBlock, file, &stat, FS_RET_ALL_ERROR); if(err == FS_STATUS_OK) { FSDrvConvertStat(st, &stat); } else { FSDrvReportError(r); return -1; } return 0; }
static int sd_fat_stat_r (struct _reent *r, const char *path, struct stat *st) { sd_fat_private_t *dev = sd_fat_get_device_data(path); if(!dev) { r->_errno = ENODEV; return -1; } OSLockMutex(dev->pMutex); // Zero out the stat buffer memset(st, 0, sizeof(struct stat)); char *real_path = sd_fat_real_path(path, dev); if(!real_path) { r->_errno = ENOMEM; OSUnlockMutex(dev->pMutex); return -1; } FSStat__ stats; int result = FSGetStat(dev->pClient, dev->pCmd, real_path, (FSStat*)&stats, -1); free(real_path); if(result < 0) { r->_errno = result; OSUnlockMutex(dev->pMutex); return -1; } // mark root also as directory st->st_mode = ((stats.flag & 0x80000000) || (strlen(dev->mount_path) + 1 == strlen(real_path)))? S_IFDIR : S_IFREG; st->st_nlink = 1; st->st_size = stats.size; st->st_blocks = (stats.size + 511) >> 9; // Fill in the generic entry stats st->st_dev = stats.ent_id; st->st_uid = stats.owner_id; st->st_gid = stats.group_id; st->st_ino = stats.ent_id; st->st_atime = stats.mtime; st->st_ctime = stats.ctime; st->st_mtime = stats.mtime; OSUnlockMutex(dev->pMutex); return 0; }