Provided by: manpages-de-dev_4.21.0-2_all bug

BEZEICHNUNG

       readlink, readlinkat - liest das Ziel eines symbolischen Links

BIBLIOTHEK

       Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT

       #include <unistd.h>

       ssize_t readlink(const char *restrict Pfadname, char *restrict Puffer,
                        size_t Puffergröße);

       #include <fcntl.h>            /* Definition der AT_*-Konstanten */
       #include <unistd.h>

       ssize_t readlinkat(int Verzdd, const char *restrict Pfadname,
                        char *restrict Puffer, size_t Puffergröße);

   Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)):

       readlink():
           _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L
               || /* Glibc <= 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 abschließendes Nullbyte 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).)

       EBADF  (readlinkat()) Der Pfadname ist relativ, aber Verzdd ist weder  AT_FDCWD  noch  ein
              gültiger Dateideskriptor.

       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.

       ENOTDIR
              (readlinkat()) Pfadname ist relativ und Verzdd ist ein  Dateideskriptor,  der  sich
              auf eine Datei bezieht, die kein Verzeichnis ist.

VERSIONEN

       readlinkat()  wurde  zu  Linux 2.6.16 hinzugefügt; Bibliotheksunterstützung wurde zu Glibc
       2.4 hinzugefügt.

STANDARDS

       readlink(): 4.4BSD (readlink() erschien erstmalig in 4.2BSD), POSIX.1-2001, POSIX.1-2008.

       readlinkat(): POSIX.1-2008.

ANMERKUNGEN

       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 <limits.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/stat.h>
       #include <unistd.h>

       int
       main(int argc, char *argv[])
       {
           char         *buf;
           ssize_t      nbytes, bufsiz;
           struct stat  sb;

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

           /* Gibt nur »nbyte« von »buf« aus, da es kein abschließenes
              Nullbyte (»\0«) enthält. */
           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)

Ü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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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 ⟨debian-l10n-german@lists.debian.org⟩.