Provided by: manpages-de-dev_1.11-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():
           _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED ||
           _POSIX_C_SOURCE >= 200112L

       readlinkat():
           Seit Glibc 2.10:
               _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
           Bis 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 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.
       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 genannte Datei 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 Kernel-Speicher 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() bereitgestellt  wird.  Dabei  wird  sichergestellt,  dass
       zwischen den Aufrufen keine Race-Condition entsteht.

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

       int
       main(int argc, char *argv[])
       {
           struct stat sb;
           char *linkname;
           ssize_t r;

           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);
           }

           linkname = malloc(sb.st_size + 1);
           if (linkname == NULL) {
               fprintf(stderr, "insufficient memory\n");
               exit(EXIT_FAILURE);
           }

           r = readlink(argv[1], linkname, sb.st_size + 1);

           if (r == -1) {
               perror("readlink");
               exit(EXIT_FAILURE);
           }

           if (r > sb.st_size) {
               fprintf(stderr, "symlink increased in size "
                               "between lstat() and readlink()\n");
               exit(EXIT_FAILURE);
           }

           linkname[r] = '\0';

           printf("'%s' zeigt auf '%s'\n", argv[1], linkname);

           free(linkname);

           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.04  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 http://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>.