Provided by: manpages-de-dev_2.5-1_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 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. 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  genauso  wie  readlink(),  außer  den  hier
       beschriebenen Unterschieden.

       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 Für  einen  Bestandteil  des  Pfad-Präfix  fehlt  die  Sucherlaubnis.  (Siehe  auch
              path_resolution(7).)

       EFAULT Puffer überschreitet den reservierten Adressbereich dieses 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 ein Bestandteil 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  Kernels,  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.

BEISPIEL

       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 wir 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("(Der zurückgegebene Puffer könnte verkürzt 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  4.15  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>,   Dr.   Tobias   Quathamer
       <toddy@debian.org>,  Mario Blättermann <mario.blaettermann@gmail.com> 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>.