Provided by: manpages-de-dev_4.27.0-1_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.

STANDARDS

       POSIX.1-2008.

GESCHICHTE

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

       readlinkat()
              POSIX.1-2008. Linux 2.6.16, Glibc 2.4.

       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.

   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.

ANMERKUNGEN

       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.

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 <sys/types.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 <pathname>\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 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.

Linux man-pages 6.9.1                             15. Juni 2024                                      readlink(2)