.\" -*- coding: UTF-8 -*-
.\" Copyright (c) 1983, 1991 The Regents of the University of California.
.\" And Copyright (C) 2011 Guillem Jover <guillem@hadrons.org>
.\" And Copyright (C) 2006, 2014 Michael Kerrisk
.\" All rights reserved.
.\"
.\" SPDX-License-Identifier: BSD-4-Clause-UC
.\"
.\"     @(#)readlink.2	6.8 (Berkeley) 3/10/91
.\"
.\" Modified Sat Jul 24 00:10:21 1993 by Rik Faith (faith@cs.unc.edu)
.\" Modified Tue Jul  9 23:55:17 1996 by aeb
.\" Modified Fri Jan 24 00:26:00 1997 by aeb
.\" 2011-09-20, Guillem Jover <guillem@hadrons.org>:
.\"     Added text on dynamically allocating buffer + example program
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH readlink 2 "5 lutego 2023 r." "Linux man\-pages 6.03" 
.SH NAZWA
readlink, readlinkat \- odczytuje wartość dowiązania symbolicznego
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#include <unistd.h>\fP
.PP
\fBssize_t readlink(const char *restrict \fP\fIpathname\fP\fB, char *restrict \fP\fIbuf\fP\fB,\fP
\fB                 size_t \fP\fIbufsiz\fP\fB);\fP
.PP
\fB#include <fcntl.h>            \fP/* Definicja stałych \fBAT_*\fP */
\fB#include <unistd.h>\fP
.PP
\fBssize_t readlinkat(int \fP\fIdirfd\fP\fB, const char *restrict \fP\fIpathname\fP\fB,\fP
\fB                 char *restrict \fP\fIbuf\fP\fB, size_t \fP\fIbufsiz\fP\fB);\fP
.PP
.fi
.RS -4
Wymagane ustawienia makr biblioteki glibc (patrz \fBfeature_test_macros\fP(7)):
.RE
.PP
\fBreadlink\fP():
.nf
.\"    || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
    _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L
        || /* glibc <= 2.19: */ _BSD_SOURCE
.fi
.PP
\fBreadlinkat\fP():
.nf
    Od glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    Przed glibc 2.10:
        _ATFILE_SOURCE
.fi
.SH OPIS
\fBreadlink\fP() umieszcza zawartość dowiązania symbolicznego \fIpathname\fP w
buforze \fIbuf\fP, którego wielkość wynosi \fIbufsiz\fP. \fBreadlink\fP() nie dokleja
do bufora \fIbuf\fP końcowego bajtu null. W przypadku, gdy bufor jest za mały,
aby pomieścić całą zawartość dowiązania, jest ona (po cichu) obcinana (do
ilości znaków równej długości \fIbufsiz\fP).
.SS readlinkat()
Wywołanie systemowe \fBreadlinkat\fP() operuje w dokładnie taki sam sposób jak
\fBreadlink\fP(), z wyjątkiem różnic opisanych tutaj.
.PP
Jeśli ścieżka podana w \fIpathname\fP jest względna, jest to interpretowane w
odniesieniu do katalogu do którego odnosi się deskryptor pliku \fIdirfd\fP
(zamiast w odniesieniu do bieżącego katalogu roboczego procesu wywołującego,
jak w stosunku do ścieżek względnych robi to \fBreadlink\fP()).
.PP
Jeśli \fIpathname\fP jest względna a \fIdirfd\fP ma wartość specjalną \fBAT_FDCWD\fP,
to \fIpathname\fP jest interpretowana w odniesieniu do bieżącego katalogu
roboczego procesu wywołującego (jak \fBreadlink\fP()).
.PP
Jeśli ścieżka \fIpathname\fP jest bezwzględna, to \fIdirfd\fP jest ignorowane.
.PP
.\" commit 65cfc6722361570bfe255698d9cd4dccaf47570d
Od Linuksa 2.6.39, \fIpathname\fP może być łańcuchem pustym; wówczas wywołanie
działa na dowiązaniu symbolicznym, do którego odnosi się \fIdirfd\fP (które
powinno być uzyskane za pomocą \fBopen\fP(2) ze znacznikami \fBO_PATH\fP i
\fBO_NOFOLLOW\fP).
.PP
Więcej informacji o potrzebie wprowadzenia \fBreadlinkat\fP() można znaleźć w
podręczniku \fBopenat\fP(2).
.SH "WARTOŚĆ ZWRACANA"
W przypadku powodzenia, te wywołania zwracają liczbę bajtów umieszczonych w
\fIbuf\fP (jeśli wartość zwracana równa się \fIbufsiz\fP, to mogło dojść do
obcięcia). W razie wystąpienia błędu zwracane jest \-1 i ustawiane \fIerrno\fP
wskazując błąd.
.SH BŁĘDY
.TP 
\fBEACCES\fP
Brak praw do przeszukiwania składowej ścieżki (patrz także
\fBpath_resolution\fP(7)).
.TP 
\fBEBADF\fP
(\fBreadlinkat\fP())  \fIpathname\fP jest względne, lecz \fIdirfd\fP nie wynosi ani
\fBAT_FDCWD\fP, ani nie jest prawidłowym deskryptorem pliku.
.TP 
\fBEFAULT\fP
\fIbuf\fP wskazuje poza przydzieloną procesowi przestrzeń adresową.
.TP 
\fBEINVAL\fP
.\" At the glibc level, bufsiz is unsigned, so this error can only occur
.\" if bufsiz==0.  However, the in the kernel syscall, bufsiz is signed,
.\" and this error can also occur if bufsiz < 0.
.\" See: http://thread.gmane.org/gmane.linux.man/380
.\" Subject: [patch 0/3] [RFC] kernel/glibc mismatch of "readlink" syscall?
\fIbufsiz\fP nie jest dodatnie.
.TP 
\fBEINVAL\fP
Nazwany plik (tj. ostatnia składowa ścieżki \fIpathname\fP) nie jest
dowiązaniem symbolicznym.
.TP 
\fBEIO\fP
Podczas odczytu z systemu plików wystąpił błąd wejścia/wyjścia.
.TP 
\fBELOOP\fP
Natrafiono na zbyt wiele dowiązań symbolicznych podczas tłumaczenia ścieżki.
.TP 
\fBENAMETOOLONG\fP
Scieżka, lub składnik ścieżki, były za długie.
.TP 
\fBENOENT\fP
Plik wskazywany przez nazwę nie istnieje.
.TP 
\fBENOMEM\fP
Brak pamięci jądra.
.TP 
\fBENOTDIR\fP
Składowa ścieżki nie jest katalogiem.
.TP 
\fBENOTDIR\fP
(\fBreadlinkat\fP())  \fIpathname\fP jest względna, a \fIdirfd\fP jest deskryptorem
pliku odnoszącym się do pliku zamiast do katalogu.
.SH WERSJE
\fBreadlinkat\fP() dodano w Linuksie 2.6.16; obsługa w bibliotece została
dodana w glibc 2.4.
.SH STANDARDY
\fBreadlink\fP(): 4.4BSD (\fBreadlink\fP() pojawiło się pierwotnie w 4.2BSD),
POSIX.1\-2001, POSIX.1\-2008.
.PP
\fBreadlinkat\fP(): POSIX.1\-2008.
.SH UWAGI
Do glibc 2.4 włącznie, zwracany typ \fBreadlink\fP() był zadeklarowany jako
\fIint\fP. Obecnie, zwracany typ jest zadeklarowany jako \fIssize_t\fP, zgodnie z
(nowym) wymaganiem POSIX.1\-2001.
.PP
Używanie bufora o statycznym rozmiarze, może nie dać wystarczająco dużo
miejsca na zawartość dowiązania symbolicznego. Wymagany rozmiar bufora można
uzyskać z wartości \fIstat.st_size\fP, zwracanej przez wywołanie \fBlstat\fP(2),
na dowiązaniu. Jednak należy sprawdzić liczbę bajtów zapisanych przez
\fBreadlink\fP() i \fBreadlinkat\fP() aby upewnić się, że rozmiar dowiązania
symbolicznego nie zmienił się między tymi wywołaniami. Dynamicznie
przydzielany bufor \fBreadlink\fP() i \fBreadlinkat\fP() rozwiązuje również częsty
problem z przenośnością, gdy korzysta się \fBPATH_MAX\fP jako rozmiaru bufora,
bowiem zdefiniowanie tej stałej nie jest gwarantowane przez POSIX, jeśli
system nie posiada takiego limitu.
.SS "Uwagi dla glibc"
Na starszych wersjach jądra Linuxa gdzie \fBreadlinkat\fP() nie było dostępne,
funkcja opakowująca z glibc wraca do używania \fBreadlink\fP(). Kiedy
\fIpathname\fP jest względną ścieżką, glibc konstruuje ścieżkę na bazie
dowiązania symbolicznego w \fI/proc/self/fd\fP, które odpowiada argumentowi
\fIdirfd\fP.
.SH PRZYKŁADY
Poniższy program dynamicznie przydziela bufor, potrzebny \fBreadlink\fP(), na
podstawie informacji zapewnionych przez \fBlstat\fP(2), alternatywnie używając
bufora o rozmiarze \fBPATH_MAX\fP, w przypadku gdy \fBlstat\fP(2) zwróci rozmiar
zerowy.
.PP
.\" SRC BEGIN (readlink.c)
.EX
#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, "Użycie: %s <ścieżka>\en", argv[0]);
        exit(EXIT_FAILURE);
    }

    if (lstat(argv[1], &sb) == \-1) {
        perror("lstat");
        exit(EXIT_FAILURE);
    }

    /* Dodaje jeden do rozmiaru dowiązania, dzięki czemu można
       sprawdzić, czy bufor zwrócony przez readlink() był obcięty. */

    bufsiz = sb.st_size + 1;

    /* Niektóre magiczne dowiązania symboliczne np. w /proc i /sys
       zgłaszają \[aq]st_size\[aq] równy zero. W takim przypadku
       używa PATH_MAX jako "wystarczającego" oszacowania. */

    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);
    }

    /* Wypisuje jedynie \[aq]nbytes\[aq] z \[aq]buf\[aq], dzięki czemu nie zawiera
       kończącego znaku null (\[aq]\e0\[aq]). */
    printf("\[aq]%s\[aq] wskazuje na \[aq]%.*s\[aq]\en", argv[1], (int) nbytes, buf);

    /* Jeśli wartość zwracana jest równa rozmiarowi bufora, to dowiązanie
       docelowe było dłuższe niż oczekiwano (być może cel zmienił się
       pomiędzy wywołaniem lstat() i wywołaniem readlink()). Ostrzega
       użytkownika, że zwracany cel mógł być przycięty. */

    if (nbytes == bufsiz)
        printf("(Zwracany bufor mógł być przycięty)\en");

    free(buf);
    exit(EXIT_SUCCESS);
}
.EE
.\" SRC END
.SH "ZOBACZ TAKŻE"
\fBreadlink\fP(1), \fBlstat\fP(2), \fBstat\fP(2), \fBsymlink\fP(2), \fBrealpath\fP(3),
\fBpath_resolution\fP(7), \fBsymlink\fP(7)
.PP
.SH TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są:
Przemek Borys <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>
i
Michał Kułach <michal.kulach@gmail.com>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
