[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