summaryrefslogtreecommitdiffhomepage
path: root/src/misc
diff options
context:
space:
mode:
Diffstat (limited to 'src/misc')
-rw-r--r--src/misc/nt32/realpath.c30
-rw-r--r--src/misc/nt64/realpath.c30
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);
+}