From c68afb5f319ae4a49d444e9e6f6e07ee4b84f798 Mon Sep 17 00:00:00 2001 From: Dave Murphy Date: Tue, 30 Dec 2014 20:39:49 +0000 Subject: [PATCH] check for directory in stat too and set st_mode appropriately --- libctru/source/sdmc_dev.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/libctru/source/sdmc_dev.c b/libctru/source/sdmc_dev.c index 5ec6cd2..d02c962 100644 --- a/libctru/source/sdmc_dev.c +++ b/libctru/source/sdmc_dev.c @@ -181,7 +181,7 @@ Result sdmcExit(void) RemoveDevice("sdmc"); sdmcInitialised = false; - + return rc; } @@ -530,7 +530,6 @@ sdmc_stat(struct _reent *r, Handle fd; Result rc; const char *pathptr = NULL; - u64 tmpsize = 0; pathptr = sdmc_fixpath(file); @@ -540,11 +539,10 @@ sdmc_stat(struct _reent *r, return -1; } - rc = FSUSER_OpenFile(NULL, &fd, sdmcArchive, FS_makePath(PATH_CHAR, pathptr), - FS_OPEN_READ, FS_ATTRIBUTE_NONE); - - if(rc==0) + if( (rc = FSUSER_OpenFile(NULL, &fd, sdmcArchive, FS_makePath(PATH_CHAR, pathptr), + FS_OPEN_READ, FS_ATTRIBUTE_NONE))==0) { + u64 tmpsize = 0; rc = FSFILE_GetSize(fd, &tmpsize); FSFILE_Close(fd); @@ -553,12 +551,24 @@ sdmc_stat(struct _reent *r, { memset(st, 0, sizeof(struct stat)); st->st_size = (off_t)tmpsize; + st->st_nlink = 1; + st->st_uid = 1; + st->st_gid = 2; + st->st_mode = S_IFREG | S_IWUSR | S_IWGRP | S_IWOTH | S_IRUSR | S_IRGRP | S_IROTH; + return 0; } } + if( (rc = FSUSER_OpenDirectory(NULL, &fd, sdmcArchive, FS_makePath(PATH_CHAR, pathptr))) == 0 ) + { + memset(st, 0, sizeof(struct stat)); + st->st_nlink = 1; + st->st_uid = 1; + st->st_gid = 2; + st->st_mode = S_IFDIR | S_IWUSR | S_IWGRP | S_IWOTH | S_IRUSR | S_IRGRP | S_IROTH; + return 0; + } - if(rc==0)return 0; - - r->_errno = rc; + r->_errno = EBADF; return -1; }