wut/libraries/wutdevoptab/devoptab_fs_utils.c
2020-07-22 03:23:29 +01:00

78 lines
1.6 KiB
C

#include "devoptab_fs.h"
char *
__wut_fs_fixpath(struct _reent *r,
const char *path)
{
char *p;
char *fixedPath;
if (!path) {
r->_errno = EINVAL;
return NULL;
}
p = strchr(path, ':') + 1;
if (!strchr(path, ':')) {
p = (char*)path;
}
if (strlen(p) > PATH_MAX) {
r->_errno = ENAMETOOLONG;
return NULL;
}
fixedPath = memalign(0x40, PATH_MAX + 1);
if (!fixedPath) {
r->_errno = ENOMEM;
return NULL;
}
// cwd is handled by coreinit, so just strip the 'device:' if it exists
strcpy(fixedPath, p);
return fixedPath;
}
int
__wut_fs_translate_error(FSStatus error)
{
switch ((int32_t)error) {
case FS_STATUS_END:
return ENOENT;
case FS_STATUS_CANCELLED:
return EINVAL;
case FS_STATUS_EXISTS:
return EEXIST;
case FS_STATUS_MEDIA_ERROR:
return EIO;
case FS_STATUS_NOT_FOUND:
return ENOENT;
case FS_STATUS_PERMISSION_ERROR:
return EPERM;
case FS_STATUS_STORAGE_FULL:
return ENOSPC;
case FS_ERROR_ALREADY_EXISTS:
return EEXIST;
case FS_ERROR_BUSY:
return EBUSY;
case FS_ERROR_CANCELLED:
return ECANCELED;
case FS_STATUS_FILE_TOO_BIG:
return EFBIG;
case FS_ERROR_INVALID_PATH:
return ENAMETOOLONG;
case FS_ERROR_NOT_DIR:
return ENOTDIR;
case FS_ERROR_NOT_FILE:
return EISDIR;
case FS_ERROR_OUT_OF_RANGE:
return ESPIPE;
case FS_ERROR_UNSUPPORTED_COMMAND:
return ENOTSUP;
case FS_ERROR_WRITE_PROTECTED:
return EROFS;
default:
return (int)error;
}
}