[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH 3/3] libc: POSIX: readlink()



+ libc: POSIX: readlink()
---
 src/modules/include/unistd.h |    2 ++
 src/modules/lib/posix/link.c |   29 +++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/src/modules/include/unistd.h b/src/modules/include/unistd.h
index 152d7ca..010b0e2 100644
--- a/src/modules/include/unistd.h
+++ b/src/modules/include/unistd.h
@@ -71,6 +71,8 @@ int unlink(const char* filename);
 /// Ein Verzeichnis loeschen
 int rmdir(const char* dirname);
 
+/// Ziel eines symbolischen Links auslesen
+ssize_t readlink(const char* path, char* buf, size_t bufsize);
 
 // Makros fuer access()
 #define F_OK 1
diff --git a/src/modules/lib/posix/link.c b/src/modules/lib/posix/link.c
index 804cf05..745c17a 100644
--- a/src/modules/lib/posix/link.c
+++ b/src/modules/lib/posix/link.c
@@ -28,6 +28,7 @@
 
 #include <unistd.h>
 #include <errno.h>
+#include <stdio.h>
 
 /**
  * Einen Hardlink erstellen.
@@ -44,3 +45,31 @@ int link(const char* oldpath, const char* newpath)
     return -1;
 }
 
+
+/**
+ * Liest den Zielpfad einsr symbolischen Links aus.
+ *
+ * Der ausgelesene Pfad wird nicht nullterminiert. Wenn der Zielpfad laenger
+ * als die Puffergroesse ist, wird der Pfad abgeschnitten.
+ *
+ * @param path Pfad zum symbolischen Link
+ * @param buf Puffer, in dem der Dateiname gespeichert werden soll
+ * @param bufsiz Laenge des Puffers
+ *
+ * @return Laenge des Zielpfads; -1 im Fehlerfall.
+ */
+ssize_t readlink(const char* path, char* buf, size_t bufsize)
+{
+    ssize_t len;
+
+    FILE* file = fopen(path, "lr");
+    if (file == NULL) {
+        errno = EIO;
+        return -1;
+    }
+
+    len = fread(buf, 1, bufsize, file);
+    fclose(file);
+
+    return len;
+}
-- 
1.6.0.2