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