READLINK(2)

BEZEICHNUNG
readlink - liest das Ziel eines symbolischen Links

ÜBERSICHT
#include <unistd.h>

ssize_t readlink(const char *pfad, char *puffer, size_t puffergroesse);

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

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

BESCHREIBUNG
readlink() platziert den Inhalt des symbolischen Links pfad 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).

RÜCKGABEWERT
Bei Erfolg gibt readlink() 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.

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

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() 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() 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, "Usage: %s <pathname>\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("lstat");
        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' points to '%s'\n", argv[1], linkname);

    exit(EXIT_SUCCESS);
}

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

KOLOPHON
This page is part of release 3.54 of the Linux man-pages project. A description of the project, and information about reporting bugs, 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> und Mario Blättermann <mario.blaettermann@gmail.com> 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>.