READLINK(2)

NAAM
readlink, readlinkat - lees waarde van een symbolische koppeling

SAMENVATTING
#include <unistd.h>

ssize_t readlink(const char *restrict pathname, char *restrict buf,
                 size_t bufsiz);

#include <fcntl.h>            /* Definition of AT_* constants */
#include <unistd.h>

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

    Test Macro´s in glibc (zie feature_test_macros(7)):

readlink():
    _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L
        || /* Glibc <= 2.19: */ _BSD_SOURCE

readlinkat():
    Vanaf glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    Voor glibc 2.10:
        _ATFILE_SOURCE

BESCHRIJVING
readlink() places the contents of the symbolic link pathname in the buffer buf, which has size bufsiz. readlink() does not append a terminating null byte to buf. It will (silently) truncate the contents (to a length of bufsiz characters), in case the buffer is too small to hold all of the contents.

  readlinkat()
De readlinkat() systeem aanroep werkt op exact dezelfde manier als readlink(), behalve voor de hier beschreven verschillen.

Als de padnaam gegeven in padnaam relatief is, dan wordt deze geïnterpreteerd als zijnde relatief aan de map die gerefereerd wordt door de file beschrijving dirfd (in plaats van relatief aan de huidige werkmap van het aanroepende proces, zoals gedaan door readlink() voor een relatieve padnaam).

Als padnaam relatief is en dirfd de speciale waarde AT_FDCWD heeft, dan wordt padnaam geïnterpreteerd als relatief aan de huidige werkmap van het aanroepende proces (zoals readlink()).

Als padnaam absoluut is, dan wordt mapbi genegeerd.

Vanaf Linux 2.6.39 mag padnaam een lege tekenreeks zijn, in welk geval de aanroep uitgaat van de symbolische koppeling zoals aangewezen door dirfd (die moet verkregen zijn door gebruik van open(2) met de O_PATH en O_NOFOLLOW vlaggen).

Zie openat(2) voor de uitleg over de noodzaak van readlinkat().

EIND WAARDE
Bij succes, geven deze aanroepen het aantal bytes terug dat in de buffer werd geplaatst (als de teruggegeven waarde gelijk is aan bufsiz, dan kan afbreken zijn opgetreden.) Bij de fout wordt -1 teruggegeven en wordt errno gezet om de fout aan te geven.

FOUTEN

EACCES
    Zoek toestemming werd geweigerd voor een deel van het pad voorvoegsel. (Zie ook path_resolution(7).)

EBADF
    (readlinkat()) pathname is relative but dirfd is neither AT_FDCWD nor a valid file descriptor.

EFAULT
    buf strekt zich uit voorbij de aan het proces toegewezen adres ruimte.

EINVAL
    bufmaat is niet positief.

EINVAL
    Het genoemde bestand (m.a.w. de uiteindelijke bestandsnaam component van padnaam is geen symbolische koppeling.

EIO Een In/Uit fout trad op terwijl er van het bestandsysteem gelezen werd.

ELOOP
    Teveel symbolische koppelingen werden tegengekomen bij het vertalen van de padnaam.

ENAMETOOLONG
    Een padnaam, of een deel van een padnaam, was te lang.

ENOENT
    Het genoemde bestand bestaat niet.

ENOMEM
    Onvoldoende kernelgeheugen voorhanden.

ENOTDIR
    Een deel van het pad-voorvoegsel is geen map.

ENOTDIR
    (readlinkat()) pathname is relative and dirfd is a file descriptor referring to a file other than a directory.

VERSIES
readlinkat() is toegevoegd aan Linux in kernel 2.6.16; bibliotheek ondersteuning werd toegevoegd aan glibc in versie 2.4.

VOLDOET AAN
readlink(): 4.4BSD (readlink() verscheen voor het eerst in 4.2BSD), POSIX.1-2001, POSIX.1-2008.

readlinkat(): POSIX.1-2008.

OPMERKINGEN
In de versies van glibc tot en met glibc 2.4 was het uitvoer type van readlink() gedeclareerd als int. Tegenwoordig is het uitvoer type gedeclareerd als ssize_t, als (nieuw) vereist in POSIX.1-2001.

Gebruik van een buffer met een statische grootte kan niet genoeg ruimte opleveren voor de inhoud van de symbolische koppeling. De vereiste grootte van de buffer kan worden verkregen van de stat_st_size waarde zoals teruggegeven door lstat(2) op de koppeling. Echter moet het aantal door readlink() en readlinkat() geschreven bytes gecontroleerd worden om er van zeker te zijn dat de grootte van de symbolische koppeling niet toenam tussen de twee aanroepen in. Het dynamisch toewijzen van de buffer voor readlink() en readlinkat() adresseert ook een vaak voorkomend portabiliteit probleem bij het gebruik van PATH_MAX voor de buffer grootte, omdat deze constante niet gegarandeerd gedefinieerd wordt conform POSIX als het systeem niet deze limiet heeft.

  Glibc-opmerkingen
Op ouder kernels waar readlinkat() niet beschikbaar is valt de glibc omwikkel functie terug op het gebruik van readlink(). Wanneer padnaam een relatieve padnaam is dan construeert glibc een padnaam gebaseerd op de symbolische koppeling in /proc/self/fd die overeenkomt met het dirfd argument.

VOORBEELDEN
Het volgende programma wijst de door readlink() benodigde buffer dynamisch toe aan de hand van de informatie voorzien door lstat(2), met terug vallende naar een buffer van PATH_MAX grootte in die gevallen waar lstat(2) een grootte van nul meldt.

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <limits.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    int
    main(int argc, char *argv[])
    {
        struct stat sb;
        char *buf;
        ssize_t nbytes, bufsiz;
        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);
        }
        /* Tel een op bij de grootte van de koppeling, zodat we kunnen bepalen of
           de buffer teruggegeven door readlink() werd afgekapt. */
        bufsiz = sb.st_size + 1;
        /* Een aantal magische koppelingen onder  (bijvoorbeeld) /proc and /sys
           rapporteren 'st_size' als nul. In dat geval, gebruik  PATH_MAX als
           een "goed genoeg" schatting. */
        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);
        }
        /* Print only 'nbytes' of 'buf', as it doesn't contain a terminating
           null byte ('\0'). */
        printf("'%s' points to '%.*s'\n", argv[1], (int) nbytes, buf);
        /* Als de teruggegeven waarde gelijk was aan de buffer grootte, dan was
           het koppeling doel groter dan verwacht (misschien omdat het
           het doel werd verandert tussen de aanroep van lstat() en de aanroep van
           readlink()). Waarschuw de gebruiker dat de teruggegeven waarde kan zijn
           afgebroken. */
        if (nbytes == bufsiz)
            printf("(Returned buffer may have been truncated)\n");
        free(buf);
        exit(EXIT_SUCCESS);
    }

ZIE OOK
readlink(1), lstat(2), stat(2), symlink(2), realpath(3), path_resolution(7), symlink(7)

COLOFON
Deze pagina is onderdeel van release 5.13 van het Linux man-pages-project. Een beschrijving van het project, informatie over het melden van bugs en de nieuwste versie van deze pagina zijn op https://www.kernel.org/doc/man-pages/ te vinden.

VERTALING
De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema <joshb@xs4all.nl>, Mario Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com> Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID. Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-dutch@lists.debian.org.