diff options
Diffstat (limited to 'src/misc')
-rw-r--r-- | src/misc/nt32/realpath.c | 30 | ||||
-rw-r--r-- | src/misc/nt64/realpath.c | 30 |
2 files changed, 60 insertions, 0 deletions
diff --git a/src/misc/nt32/realpath.c b/src/misc/nt32/realpath.c new file mode 100644 index 0000000..0376011 --- /dev/null +++ b/src/misc/nt32/realpath.c @@ -0,0 +1,30 @@ +#include <limits.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> +#include <errno.h> +#include "psxglue.h" + +extern const struct __psx_vtbl * __psx_vtbl; + +char * realpath(const char * restrict filename, char * restrict resolved) +{ + int ecode; + char buf[PATH_MAX]; + + ecode = filename + ? __psx_vtbl->fs_rpath( + AT_FDCWD,filename, + O_NONBLOCK|O_CLOEXEC, + buf,sizeof(buf)) + : -EINVAL; + + if (ecode < 0) { + errno = -ecode; + return 0; + } + + return resolved + ? strcpy(resolved,buf) + : strdup(buf); +} diff --git a/src/misc/nt64/realpath.c b/src/misc/nt64/realpath.c new file mode 100644 index 0000000..0376011 --- /dev/null +++ b/src/misc/nt64/realpath.c @@ -0,0 +1,30 @@ +#include <limits.h> +#include <unistd.h> +#include <fcntl.h> +#include <string.h> +#include <errno.h> +#include "psxglue.h" + +extern const struct __psx_vtbl * __psx_vtbl; + +char * realpath(const char * restrict filename, char * restrict resolved) +{ + int ecode; + char buf[PATH_MAX]; + + ecode = filename + ? __psx_vtbl->fs_rpath( + AT_FDCWD,filename, + O_NONBLOCK|O_CLOEXEC, + buf,sizeof(buf)) + : -EINVAL; + + if (ecode < 0) { + errno = -ecode; + return 0; + } + + return resolved + ? strcpy(resolved,buf) + : strdup(buf); +} |