readlink(2)

BEZEICHNUNG
readlink, readlinkat - liest das Ziel eines symbolischen Links

BIBLIOTHEK
Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT
#include <unistd.h>

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

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

ssize_t readlinkat(size_t Puffergröße;
                 int Verzdd, const char *restrict Pfad,
                 char Puffer[restrict Puffergröße], 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 Pfad 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 Pfad 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 Pfad relativ ist und Verzdd den besonderen Wert AT_FDCWD annimmt, wird Pfad als relativ zum aktuellen Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie readlink()).

Falls Pfad absolut ist, wird Verzdd ignoriert.

Seit Linux 2.6.39 kann Pfad 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 Pfad 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 Pfad) 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()) Pfad ist relativ und Verzdd ist ein Dateideskriptor, der sich auf eine Datei bezieht, die kein Verzeichnis ist.

STANDARDS
POSIX.1-2024.

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 Pfad relativ 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 <path>\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.