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>.

Linux                                           15. Oktober 2014                                     READLINK(2)