readlink(2) System Calls Manual readlink(2) BEZEICHNUNG readlink, readlinkat - liest das Ziel eines symbolischen Links BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include ssize_t readlink(const char *restrict Pfadname, char *restrict Puffer, size_t Puffergrosse); #include /* Definition der AT_*-Konstanten */ #include ssize_t readlinkat(int Verzdd, const char *restrict Pfadname, char *restrict Puffer, size_t Puffergrosse); Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)): readlink(): _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L || /* Glibc <= 2.19: */ _BSD_SOURCE readlinkat(): Seit Glibc 2.10: _POSIX_C_SOURCE >= 200809L Vor Glibc 2.10: _ATFILE_SOURCE BESCHREIBUNG readlink() platziert den Inhalt des symbolischen Links Pfadname in den Puffer, der die Grosse Puffergrosse hat. readlink() hangt kein abschliessendes Nullbyte an Puffer an. Ist der Puffer zu klein, um den ganzen Inhalt aufzunehmen, verkurzt es (stillschweigend) den Inhalt (auf die Lange von Puffergrosse Zeichen). readlinkat() Der Systemaufruf readlinkat() funktioniert, bis auf die hier beschriebenen Unterschiede, genauso wie readlink(). Falls der in Pfadname ubergebene Pfadname relativ ist, wird er als relativ zu dem im Dateideskriptor Verzdd referenzierten Verzeichnis interpretiert (statt relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses, wie es bei readlink() fur einen relativen Pfadnamen erfolgt). Falls Pfadname relativ ist und Verzdd den besonderen Wert AT_FDCWD annimmt, wird Pfadname als relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie readlink()). Falls Pfadname absolut ist, wird Verzdd ignoriert. Seit Linux 2.6.39 kann Pfadname eine leere Zeichenkette sein. In diesem Fall arbeitet der Aufruf auf dem durch Verzdd referenzierten symbolischen Link (der durch die Verwendung der Schalter O_PATH und O_NOFOLLOW von open(2) erlangt worden sein kann). Lesen Sie openat(2) fur eine Beschreibung der Notwendigkeit von readlinkat(). RUCKGABEWERT Bei Erfolg geben diese Aufrufe die Anzahl der Byte zuruck, die in Puffer platziert wurden. (Falls der zuruckgegebene Wert gleich Puffergrosse ist, konnte eine Verkurzung aufgetreten sein.) Bei einem Fehler wird -1 zuruckgegeben und errno so gesetzt, dass es den Fehler angibt. FEHLER EACCES Ein Bestandteil des Pfad-Prafix durfte nicht durchsucht werden. (Siehe auch path_resolution(7).) EBADF (readlinkat()) Der Pfadname ist relativ, aber Verzdd ist weder AT_FDCWD noch ein gultiger Dateideskriptor. EFAULT Puffer uberschreitet den reservierten Adressbereich des Prozesses. EINVAL Puffergrosse ist nicht positiv. EINVAL Die benannte Datei (d.h. die endgultige Dateinamenkomponente von Pfadname) ist kein symbolischer Link. EIO Beim Lesen vom Dateisystem trat ein E/A-Fehler (engl. I/O) auf. ELOOP Beim Ubersetzen des Pfadnamens wurden zu viele symbolische Links vorgefunden. ENAMETOOLONG Ein Pfadname oder eine Komponente eines Pfadnamens war zu lang. ENOENT Die angegebene Datei existiert nicht. ENOMEM Es war nicht genugend Kernelspeicher verfugbar. ENOTDIR Eine Komponente des Pfad-Prafixes ist kein Verzeichnis. ENOTDIR (readlinkat()) Pfadname ist relativ und Verzdd ist ein Dateideskriptor, der sich auf eine Datei bezieht, die kein Verzeichnis ist. STANDARDS POSIX.1-2008. GESCHICHTE readlink() 4.4BSD (erschien erstmalig in 4.2BSD), POSIX.1-2001, POSIX.1-2008. readlinkat() POSIX.1-2008. Linux 2.6.16, Glibc 2.4. Bis einschliesslich Glibc 2.4 wurde der Typ des Ruckgabewerts von readlink() als int deklariert. Heutzutage ist der Typ des Ruckgabewerts als ssize_t deklariert, wie es (neuerdings) in POSIX.1-2001 benotigt wird. Glibc Unter alteren Kerneln, in denen readlinkat() nicht verfugbar ist, weicht die Glibc-Wrapper-Funktion auf readlink() aus. Wenn Pfadname ein relativer Pfadname ist, dann konstruiert die Glibc einen Pfadnamen, der auf jenem symbolischen Link in /proc/self/fd basiert, der dem Argument Verzdd entspricht. ANMERKUNGEN Wenn Sie einen Puffer mit einer festen Grosse verwenden, ist eventuell nicht genug Platz fur die Inhalte des symbolischen Links vorhanden. Die erforderliche Grosse fur den Puffer kann aus dem Wert stat.st_size ermittelt werden, der nach einem Aufruf der Funktion lstat(2) fur den Link zuruckgegeben wird. Allerdings sollte die Anzahl der Byte, die von readlink() und readlinkat() geschrieben wurden, uberpruft werden. Damit kann sichergestellt werden, dass die Grosse des symbolischen Links zwischen den Aufrufen nicht zugenommen hat. Die dynamische Zuweisung des Puffers fur readlink() und readlinkat() behebt ausserdem ein verbreitetes Portabilitatsproblem, wenn Sie PATH_MAX fur die Puffergrosse benutzen. Diese Konstante muss laut POSIX nicht zwingend definiert sein, wenn das System eine solche Beschrankung nicht hat. BEISPIELE Das folgende Programm reserviert den von readlink() benotigten Puffer dynamisch mittels der Information, die von lstat(2) bereitgestellt wird. Dabei wird in Fallen, in denen lstat(2) die Grosse Null zuruckliefert, auf einen Puffer der Grosse PATH_MAX zuruckgefallen. #include #include #include #include #include int main(int argc, char *argv[]) { char *buf; ssize_t nbytes, bufsiz; struct stat sb; if (argc != 2) { fprintf(stderr, "Aufruf: %s \n", argv[0]); exit(EXIT_FAILURE); } if (lstat(argv[1], &sb) == -1) { perror("lstat"); exit(EXIT_FAILURE); } /* Einen zur Linkgrosse hinzufugen, so dass bestimmt werden kann, ob der von readlink() zuruckgelieferte Puffer abgeschnitten wurde. */ bufsiz = sb.st_size + 1; /* Einige magische Symlinks unter (beispielsweise) /proc und /sys geben >>st_size<< als Null zuruck. In diesem Fall wird PATH_MAX als eine >>genugend gute<< Schatzung angenommen. */ if (sb.st_size == 0) bufsiz = PATH_MAX; buf = malloc(bufsiz); if (buf == NULL) { perror("malloc"); exit(EXIT_FAILURE); } nbytes = readlink(argv[1], buf, bufsiz); if (nbytes == -1) { perror("readlink"); exit(EXIT_FAILURE); } /* Gibt nur >>nbyte<< von >>buf<< aus, da es kein abschliessenes Nullbyte (>>\0<<) enthalt. */ printf(">>%s<< zeigt auf >>%.*s<<\n", argv[1], (int) nbytes, buf); /* Falls der Ruckgabewert der Puffergrosse entsprach, dann war das Link-Ziel grosser als erwartet (vielleicht weil das Ziel zwischen dem Aufruf von lstat() und dem Aufruf von readlink() geandert wurde). Den Benutzer warnen, dass das zuruckgelieferte Ziel abgeschnitten worden sein kann. */ if (nbytes == bufsiz) printf("(Zuruckgelieferter Puffer konnte abgeschnitten worden sein)\n"); free(buf); exit(EXIT_SUCCESS); } SIEHE AUCH readlink(1), lstat(2), stat(2), symlink(2), realpath(3), path_resolution(7), symlink(7) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Markus Kaufmann , Chris Leick , Mario Blattermann , Dr. Tobias Quathamer und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 1. November 2023 readlink(2)