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