Provided by: manpages-de-dev_4.13-4_all bug

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 Verzdd, 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
       Verzdd  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 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) 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  Verzdd ist kein zulässiger Dateideskriptor.

       ENOTDIR
              Pfadname ist relativ und Verzdd 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 Verzdd 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.10  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 die
       Mailingliste der Übersetzer.

Linux                                             9. Juni 2020                                       READLINK(2)