readlink

READLINK(2)                 Linux-Programmierhandbuch                READLINK(2)



BEZEICHNUNG
       readlink, readlinkat - liest das Ziel eines symbolischen Links

ÜBERSICHT
       #include <unistd.h>

       ssize_t readlink(const char *Pfadname, char *Puffer, size_t Puffergröße);

       #include <fcntl.h>           /* Definition der AT_*-Konstanten */
       #include <unistd.h>

       int readlinkat(int dirfd, const char *Pfadname,
                      char *Puffer, size_t Puffergröße);

   Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

       readlink():
           _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L
               || /* Glibc-Versionen <= 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 Größe Puffergröße hat. readlink() hängt kein NULL-Byte an
       Puffer an. Ist der Puffer zu klein, um den ganzen Inhalt aufzunehmen,
       verkürzt es (stillschweigend) den Inhalt (auf die Länge von Puffergröße
       Zeichen).

   readlinkat()
       Der Systemaufruf readlinkat() funktioniert, bis auf die hier
       beschriebenen Unterschiede, genauso wie readlink().

       Falls der in Pfadname übergebene Pfadname relativ ist, wird er als
       relativ zu dem im Dateideskriptor dirfd referenzierten Verzeichnis
       interpretiert (statt relativ zum aktuellen Arbeitsverzeichnis des
       aufrufenden Prozesses, wie es bei readlink() für einen relativen
       Pfadnamen erfolgt).

       Falls Pfadname relativ ist und dirfd den besonderen Wert AT_FDCWD
       annimmt, wird Pfadname als relativ zum aktuellen Arbeitsverzeichnis des
       aufrufenden Prozesses interpretiert (wie readlink()).

       Falls Pfadname absolut ist wird dirfd ignoriert.

       Seit Linux 2.6.39 kann Pfadname eine leere Zeichenkette sein. In diesem
       Fall arbeitet der Aufruf auf dem durch dirfd 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) für eine Beschreibung der Notwendigkeit von
       readlinkat().

RÜCKGABEWERT
       Bei Erfolg geben diese Aufrufe die Anzahl der Byte zurück, die in Puffer
       platziert wurden. (Falls der zurückgegebene Wert gleich Puffergröße ist,
       könnte eine Verkürzung aufgetreten sein.) Bei einem Fehler wird -1
       zurückgegeben und errno so gesetzt, dass es den Fehler angibt.

FEHLER
       EACCES Ein Bestandteil des Pfad-Präfix durfte nicht durchsucht werden.
              (Siehe auch path_resolution(7).)

       EFAULT Puffer überschreitet den reservierten Adressbereich des Prozesses.

       EINVAL Puffergröße ist nicht positiv.

       EINVAL Die benannte Datei (d.h. die endgültige Dateinamenkomponente von
              Pfadname) ist kein symbolischer Link.

       EIO    Beim Lesen vom Dateisystem trat ein E/A-Fehler (engl. I/O) auf.

       ELOOP  Beim Übersetzen 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 genügend Kernelspeicher verfügbar.

       ENOTDIR
              Eine Komponente des Pfad-Präfixes ist kein Verzeichnis.

       Die folgenden zusätzlichen Fehler können bei readlinkat() auftreten:

       EBADF  dirfd ist kein zulässiger Dateideskriptor.

       ENOTDIR
              Pfadname ist relativ und dirfd ist ein Dateideskriptor, der sich
              auf eine Datei bezieht, die kein Verzeichnis ist.

VERSIONEN
       readlinkat() wurde zu Linux in Kernel 2.6.16 hinzugefügt;
       Bibliotheksunterstützung wurde zu Glibc in Version 2.4 hinzugefügt.

KONFORM ZU
       readlink(): 4.4BSD (readlink() erschien erstmalig in 4.2BSD),
       POSIX.1-2001, POSIX.1-2008.

       readlinkat(): POSIX.1-2008.

ANMERKUNGEN
       In Glibc-Versionen bis einschließlich Glibc 2.4 wurde der Typ des
       Rückgabewerts von readlink() als int deklariert. Heutzutage ist der Typ
       des Rückgabewerts als ssize_t deklariert, wie es (neuerdings) in
       POSIX.1-2001 benötigt wird.

       Wenn Sie einen Puffer mit einer festen Größe verwenden, ist eventuell
       nicht genug Platz für die Inhalte des symbolischen Links vorhanden. Die
       erforderliche Größe für den Puffer kann aus dem Wert stat.st_size
       ermittelt werden, der nach einem Aufruf der Funktion lstat(2) für den
       Link zurückgegeben wird. Allerdings sollte die Anzahl der Byte, die von
       readlink() und readlinkat() geschrieben wurden, überprüft werden. Damit
       kann sichergestellt werden, dass die Größe des symbolischen Links
       zwischen den Aufrufen nicht zugenommen hat. Die dynamische Zuweisung des
       Puffers für readlink() und readlinkat() behebt außerdem ein verbreitetes
       Portabilitätsproblem, wenn Sie PATH_MAX für die Puffergröße benutzen.
       Diese Konstante muss laut POSIX nicht zwingend definiert sein, wenn das
       System eine solche Beschränkung nicht hat.

   Anmerkungen zur Glibc
       Unter älteren Kerneln, in denen readlinkat() nicht verfügbar 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
       dirfd entspricht.

BEISPIELE
       Das folgende Programm reserviert den von readlink() benötigten Puffer
       dynamisch mittels der Information, die von lstat(2) bereitgestellt wird.
       Dabei wird in Fällen, in denen lstat(2) die Größe Null zurückliefert, auf
       einen Puffer der Größe PATH_MAX zurückgefallen.

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <limits.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

       int
       main(int argc, char *argv[])
       {
           struct stat sb;
           char *buf;
           ssize_t nbytes, bufsiz;

           if (argc != 2) {
               fprintf(stderr, "Aufruf: %s <Pfadname>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           if (lstat(argv[1], &sb) == -1) {
               perror("lstat");
               exit(EXIT_FAILURE);
           }

           /* Einen zur Linkgröße hinzufügen, so dass bestimmt werden
              kann, ob der von readlink() zurückgelieferte Puffer
              abgeschnitten wurde. */

           bufsiz = sb.st_size + 1;

           /* Einige magische Symlinks unter (beispielsweise) /proc und /sys
              geben 'st_size' als Null zurück. In diesem Fall wird PATH_MAX als
              eine »genügend gute« Schätzung 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);
           }

           printf("'%s' zeigt auf '%.*s'\n", argv[1], (int) nbytes, buf);

           /* Falls der Rückgabewert der Puffergröße entsprach, dann war das
              Link-Ziel größer als erwartet (vielleicht weil das Ziel zwischen
              dem Aufruf von lstat() und dem Aufruf von readlink() geändert
              wurde). Den Benutzer warnen, dass das zurückgelieferte Ziel
              abgeschnitten worden sein kann. */

           if (nbytes == bufsiz)
               printf("(Zurückgelieferter Puffer könnte 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)

KOLOPHON
       Diese Seite ist Teil der Veröffentlichung 5.08 des Projekts
       Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie
       Fehler gemeldet werden können sowie die aktuelle Version dieser Seite
       finden sich unter https://www.kernel.org/doc/man-pages/.


ÜBERSETZUNG
       Die deutsche Übersetzung dieser Handbuchseite wurde von Markus Kaufmann
       <markus.kaufmann@gmx.de>, Chris Leick <c.leick@vollbio.de>, Mario
       Blättermann <mario.blaettermann@gmail.com>, Dr. Tobias Quathamer
       <toddy@debian.org> und Helge Kreutzmann <debian@helgefjell.de> erstellt.

       Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General
       Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen.
       Es wird KEINE HAFTUNG übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
       Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.



Linux                             9. Juni 2020                       READLINK(2)