.\" -*- coding: UTF-8 -*- .\" Copyright 1983-1991, The Regents of the University of California. .\" Copyright 2011, Guillem Jover .\" Copyright 2006-2014, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: BSD-4-Clause-UC .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH readlink 2 "8 lutego 2026 r." "Linux man\-pages 6.18" .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 \fP .P \fBssize_t readlink(\fPsize_t bufsiz; \fB const char *restrict \fP\fIpath\fP\fB,\fP \fB char \fP\fIbuf\fP\fB[restrict \fP\fIbufsiz\fP\fB], size_t \fP\fIbufsiz\fP\fB);\fP .P \fB#include \fP/* Definicja stałych \fBAT_*\fP */ \fB#include \fP .P \fBssize_t readlinkat(\fPsize_t bufsiz; \fB int \fP\fIdirfd\fP\fB, const char *restrict \fP\fIpath\fP\fB,\fP \fB char \fP\fIbuf\fP\fB[restrict \fP\fIbufsiz\fP\fB], size_t \fP\fIbufsiz\fP\fB);\fP .P .fi .RS -4 Wymagane ustawienia makr biblioteki glibc (patrz \fBfeature_test_macros\fP(7)): .RE .P \fBreadlink\fP(): .nf .\" || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L || /* glibc <= 2.19: */ _BSD_SOURCE .fi .P \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 \fIpath\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. .P Jeśli ścieżka podana w \fIpath\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()). .P Jeśli \fIpath\fP jest względna a \fIdirfd\fP ma wartość specjalną \fBAT_FDCWD\fP, to \fIpath\fP jest interpretowana w odniesieniu do bieżącego katalogu roboczego procesu wywołującego (jak \fBreadlink\fP()). .P Jeśli ścieżka \fIpath\fP jest bezwzględna, to \fIdirfd\fP jest ignorowane. .P .\" commit 65cfc6722361570bfe255698d9cd4dccaf47570d Od Linuksa 2.6.39, \fIpath\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). .P 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()) \fIpath\fP jest względna, 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 \fIpath\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()) \fIpath\fP jest względna, a \fIdirfd\fP jest deskryptorem pliku odnoszącym się do pliku zamiast do katalogu. .SH STANDARDY POSIX.1\-2024. .SH HISTORIA .TP \fBreadlink\fP() 4.4BSD (pojawiło się pierwotnie w 4.2BSD), POSIX.1\-2001, POSIX.1\-2008. .TP \fBreadlinkat\fP() POSIX.1\-2008. Linux 2.6.16, glibc 2.4. .P 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. .SS 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 \fIpath\fP jest względna, glibc konstruuje ścieżkę na bazie dowiązania symbolicznego w \fI/proc/self/fd\fP, które odpowiada argumentowi \fIdirfd\fP. .SH UWAGI 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. .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. .P .\" SRC BEGIN (readlink.c) .EX #include #include #include #include #include #include \& 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>\[rs]n", 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]\[rs]0\[aq]). */ printf("\[aq]%s\[aq] wskazuje na \[aq]%.*s\[aq]\[rs]n", 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)\[rs]n"); \& 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 Tłumaczenie niniejszej strony podręcznika: Przemek Borys , Andrzej Krzysztofowicz i Michał Kułach . .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 .