summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libshell/realpath.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/libshell/realpath.c')
-rw-r--r--mdk-stage1/dietlibc/libshell/realpath.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/mdk-stage1/dietlibc/libshell/realpath.c b/mdk-stage1/dietlibc/libshell/realpath.c
new file mode 100644
index 000000000..1377018e5
--- /dev/null
+++ b/mdk-stage1/dietlibc/libshell/realpath.c
@@ -0,0 +1,31 @@
+#include <limits.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include "dietfeatures.h"
+
+char *realpath(const char *path, char *resolved_path) {
+ int fd=open(".",O_RDONLY);
+ char *tmp="";
+ if (chdir(path)) {
+#ifdef WANT_THREAD_SAFE
+ if (*__errno_location()==ENOTDIR)
+#else
+ if (errno==ENOTDIR)
+#endif
+ {
+ if ((tmp=strrchr(path,'/'))) {
+ memmove(resolved_path,path,tmp-path);
+ resolved_path[tmp-path]=0;
+ if (chdir(resolved_path)) { resolved_path=0; goto abort; }
+ }
+ }
+ }
+ if (!getcwd(resolved_path,PATH_MAX)) { resolved_path=0; goto abort; }
+ strcat(resolved_path,tmp);
+abort:
+ fchdir(fd);
+ close(fd);
+ return resolved_path;
+}