READLINK(2)

BEZEICHNUNG
readlink, readlinkat - liest das Ziel eines symbolischen Links

ÜBERSICHT
#include <unistd.h>

ssize_t readlink(const char *Pfadname, char *Puffer, size_t puffergroesse);

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

ssize_t readlinkat(int dirfd, const char *pathname,
                   char *buf, size_t bufsiz);

Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

readlink():
    _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED || _POSIX_C_SOURCE >= 200112L

readlinkat():
    Seit Glibc 2.10:
        _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
    Bis Glibc 2.10:
        _ATFILE_SOURCE

BESCHREIBUNG
readlink() platziert den Inhalt des symbolischen Links Pfadname in den Puffer puffer, der die Größe puffergroesse hat. readlink() hängt kein Null-Byte an puffer. Ist der Puffer zu klein, um den ganzen Inhalt aufzunehmen, verkürzt es den Inhalt (auf die Länge von puffergroesse 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 die leere Zeichenkette sein. In diesem Fall arbeitet der Aufruf auf der durch dirfd referenzierten Datei (die durch die Verwendung des Schalters O_PATH von open(2) erlangt worden sein kann). In diesem Fall kann dirfd auf jede Art von Datei verweisen, nicht nur auf ein Verzeichnis.

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. 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
    puffergroesse ist nicht positiv.

EINVAL
    Die genannte Datei 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 Kernel-Speicher 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 Allokation 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.

BEISPIEL
Das folgende Programm reserviert den von readlink() benötigten Puffer dynamisch mittels der Information, die von lstat() bereitgestellt wird. Dabei wird sichergestellt, dass zwischen den Aufrufen keine Race-Condition entsteht.
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char *argv[])
{
    struct stat sb;
    char *linkname;
    ssize_t r;
    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);
    }
    linkname = malloc(sb.st_size + 1);
    if (linkname == NULL) {
        fprintf(stderr, "insufficient memory\n");
        exit(EXIT_FAILURE);
    }
    r = readlink(argv[1], linkname, sb.st_size + 1);
    if (r == -1) {
        perror("readlink");
        exit(EXIT_FAILURE);
    }
    if (r > sb.st_size) {
        fprintf(stderr, "symlink increased in size "
                        "between lstat() and readlink()\n");
        exit(EXIT_FAILURE);
    }
    linkname[r] = '\0';
    printf("'%s' zeigt auf '%s'\n", argv[1], linkname);
    exit(EXIT_SUCCESS);
}

SIEHE AUCH
readlink(1), lstat(2), stat(2), symlink(2), path_resolution(7), symlink(7)

KOLOPHON
This page is part of release 3.70 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at http://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>, 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>.