plucky (2) linkat.2.gz

Provided by: manpages-pl-dev_4.25.1-1_all bug

NAZWA

       link, linkat - tworzy kolejną nazwę pliku

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <unistd.h>

       int link(const char *oldpath, const char *newpath);

       #include <fcntl.h>           /* Definicja stałych AT_* */
       #include <unistd.h>

       int linkat(int olddirfd, const char *oldpath,
                  int newdirfd, const char *newpath, int flags);

   Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

       linkat():
           Od glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Przed glibc 2.10:
               _ATFILE_SOURCE

OPIS

       link() tworzy nowe dowiązanie (nazywane też dowiązaniem zwykłym albo twardym) do istniejącego pliku.

       Jeśli plik newpath już istnieje, to nie będzie nadpisany.

       Ta  nowa  nazwa może być używana dokładnie tak samo jak stara, w dowolnych operacjach; obie nazwy odnoszą
       się do tego samego pliku (i w związku z  tym  mają  te  same  uprawnienia  i  własność).  Nie  można  też
       powiedzieć, która nazwa jest „oryginalna”.

   linkat()
       Wywołanie systemowe linkat() operuje w dokładnie taki sam sposób jak link(), z wyjątkiem różnic opisanych
       tutaj.

       Jeśli ścieżka podana w oldpath jest względna, jest  ona  interpretowana  względem  katalogu,  do  którego
       odnosi się deskryptor pliku olddirfd (zamiast względem bieżącego katalogu roboczego procesu wywołującego,
       jak ma to miejsce w link() w przypadku ścieżek względnych).

       Jeśli oldpath jest względna, a olddirfd ma wartość specjalną AT_FDCWD,  to  oldpath  jest  interpretowana
       względem bieżącego katalogu roboczego procesu wywołującego (czyli tak jak robi to link()).

       Jeśli oldpath jest bezwzględna, to olddirfd jest ignorowane.

       Interpretacja   newpath  jest  taka  sama  jak  oldpath,  z  tym  wyjątkiem,  że  ścieżka  względna  jest
       interpretowana względem katalogu, do którego odnosi się deskryptor pliku newdirfd.

       Następujące wartości mogą być zsumowane bitowo (OR) we flags:

       AT_EMPTY_PATH (od Linuksa 2.6.39)
              Jeśli oldpath jest pustym łańcuchem, tworzy dowiązanie do pliku, do którego  odnosi  się  olddirfd
              (który  mógł  być  pozyskany  za pomocą znacznika O_PATH open(2)). W takim przypadku olddirfd może
              odnosić się do dowolnego typu pliku, z wyjątkiem katalogu. Zwykle nie  zadziała  to,  gdy  licznik
              dowiązań  wskazuje  zero  (pliki utworzone z O_TMPFILE i bez O_EXCL są wyjątkiem). Wywołujący musi
              mieć przywilej CAP_DAC_READ_SEARCH (ang. capability), aby użyć tego znacznika. Niniejszy  znacznik
              jest typowo linuksowy; należy zdefiniować _GNU_SOURCE, aby pozyskać jego definicję.

       AT_SYMLINK_FOLLOW (od Linuksa 2.6.18)
              Domyślnie,  linkat(),  nie  rozwija oldpath, jeśli jest ona dowiązaniem symbolicznym (jak link()).
              Można podać znacznik AT_SYMLINK_FOLLOW we  flags,  aby  oldpath  została  rozwiązana,  jeśli  jest
              dowiązaniem   symbolicznym.   Jeśli  zamontowano  procfs,  może  posłużyć  to  za  alternatywę  do
              AT_EMPTY_PATH, podobnie do:

                  linkat(AT_FDCWD, "/proc/self/fd/<fd>", newdirfd,
                         newname, AT_SYMLINK_FOLLOW);

       Przed Linuksem 2.6.18, argument flags nie był używany; wymagane było podanie jego wartości równej 0.

       Więcej informacji o potrzebie wprowadzenia linkat() można znaleźć w podręczniku openat(2).

WARTOŚĆ ZWRACANA

       Po pomyślnym zakończeniu zwracane jest zero. Po błędzie zwracane jest -1  i  ustawiane  errno,  wskazując
       błąd.

BŁĘDY

       EACCES Odmówiono zapisu do katalogu zawierającego newpath lub brak uprawnienia przeszukiwania dla jednego
              z katalogów w składowej ścieżek oldpath lub newpath (zob. też path_resolution(7)).

       EDQUOT Przydział bloków dyskowych użytkownika dotyczący systemu plików został wyczerpany.

       EEXIST newpath już istnieje.

       EFAULT oldpath lub newpath wskazuje poza dostępną dla użytkownika przestrzeń adresową.

       EIO    Wystąpił błąd wejścia/wyjścia.

       ELOOP  Podczas rozwiązywania oldpath lub newpath napotkano zbyt wiele dowiązań symbolicznych.

       EMLINK Plik do którego odnosi się oldpath, osiągnął już maksymalną liczbę prowadzących do niego  dowiązań
              zwykłych.  Przykładowo,  w  systemie  plików  ext4(5)  bez  cechy dir_index, limit liczby dowiązań
              zwykłych wynosi 65 000; na btrfs(5) jest to 65 535 dowiązań.

       ENAMETOOLONG
              oldpath lub newpath było zbyt długie.

       ENOENT Składnik katalogu w oldpath lub newpath nie istnieje, lub jest wiszącym dowiązaniem symbolicznym.

       ENOMEM Brak pamięci jądra.

       ENOSPC Na urządzeniu, zawierającym plik nie ma miejsca na kolejny wpis w katalogu.

       ENOTDIR
              Składnik oldpath lub newpath używany jako katalog nie jest w rzeczywistości katalogiem.

       EPERM  oldpath jest katalogiem.

       EPERM  System plików zawierający oldpath i newpath nie obsługuje tworzenia twardych dowiązań.

       EPERM (od Linuksa 3.6)
              Wywołujący nie ma  uprawnienia  do  utworzenia  dowiązania  zwykłego  do  tego  pliku  (zob.  opis
              /proc/sys/fs/protected_hardlinks w proc(5)).

       EPERM  oldpath została oznaczona jako tylko do odczytu (immutable) lub tylko do nadpisu (append-only; zob
              FS_IOC_SETFLAGS(2const)).

       EROFS  Plik leży na systemie plików tylko dla odczytu.

       EXDEV  oldpath i newpath nie są zamontowane w tym  samym  systemie  plików  (Linux  dopuszcza  montowanie
              systemu  plików  w wielu punktach, ale link() nie działa poprzez różne montowania, nawet gdy w obu
              miejscach zamontowano ten sam system plików).

       Mogą wystąpić następujące dodatkowe błędy dla linkat():

       EBADF  oldpath (newpath) są względne, lecz olddirfd (newdirfd) nie wynosi  ani  AT_FDCWD,  ani  nie  jest
              prawidłowym deskryptorem pliku.

       EINVAL We flags podano nieprawidłową wartość znacznika.

       ENOENT We  flags  podano  AT_EMPTY_PATH, lecz wywołujący nie posiada przywileju CAP_DAC_READ_SEARCH (ang.
              capability).

       ENOENT Próbowano utworzyć dowiązanie do pliku  /proc/self/fd/NN,  odnoszącego  się  do  deskryptora  liku
              utworzonego za pomocą

                  open(path, O_TMPFILE | O_EXCL, mode);

              Zobacz open(2).

       ENOENT Próbowano utworzyć dowiązanie do pliku /proc/self/fd/NN, odnoszącego się do pliku, który usunięto.

       ENOENT oldpath  jest  ścieżką  względną,  a  olddirfd odnosi się do usuniętego katalogu albo newpath jest
              ścieżką względną, a newdirfd odnosi się do usuniętego katalogu.

       ENOTDIR
              oldpath jest względna, a olddirfd jest deskryptorem pliku  odnoszącym  się  do  pliku  innego  niż
              katalog; lub analogicznie dla newpath i newdirfd

       EPERM  We flags podano AT_EMPTY_PATH, oldpath jest łańcuchem pustym, a olddirfd odnosi się do katalogu.

WERSJE

       POSIX.1-2001  twierdzi,  że link() powinien rozwiązywać oldpath, jeśli jest ona dowiązaniem symbolicznym.
       Jednak od Linuksa 2.0, Linux tak nie czyni: jeśli oldpath jest dowiązaniem symbolicznym, to newpath  jest
       tworzona  jako dowiązanie zwykłe (twarde) do samego pliku dowiązania symbolicznego (tj. newpath staje się
       dowiązaniem  symbolicznym  do  tego  samego  pliku,  do  którego  odnosi  się  oldpath).  Niektóre   inne
       implementacje zachowują się w ten sam sposób co Linux. POSIX.1-2008 zmieniło specyfikację link(), czyniąc
       rozwiązywanie oldpath gdy  jest  to  dowiązanie  symboliczne,  zależnym  od  implementacji.  Aby  uzyskać
       precyzyjną  kontrolę  nad  traktowaniem  dowiązań  symbolicznych przy tworzeniu dowiązań zwykłych, należy
       korzystać z linkat().

   glibc
       W starszych jądrach, gdy niedostępne jest linkat() funkcja opakowująca z biblioteki glibc z  konieczności
       korzysta  z  link(),  chyba  że  podano AT_SYMLINK_FOLLOW. Gdy oldpath i newpath są ścieżkami względnymi,
       glibc tworzy ścieżki w zależności od  dowiązań  symbolicznych  w  /proc/self/fd,  które  odnoszą  się  do
       argumentów olddirfd i newdirfd.

STANDARDY

       link() POSIX.1-2008.

HISTORIA

       link() SVr4, 4.3BSD, POSIX.1-2001 (lecz zob. WERSJE).

       linkat()
              POSIX.1-2008.  Linux 2.6.16, glibc 2.4.

UWAGI

       Dowiązania  zwykłe  (twarde),  tworzone  z  pomocą link(), nie mogą wykraczać poza jeden system plików. W
       takich sytuacjach można użyć funkcji symlink(2).

USTERKI

       Na systemach NFS, wartość zwracana może być nieprawidłowa w wypadku gdy  serwer  NFS  dokonuje  tworzenia
       dowiązania  i  umiera  przed  zakomunikowaniem  tego  faktu.  Można  użyć stat(2) aby dowiedzieć się, czy
       dowiązanie zostało utworzone.

ZOBACZ TAKŻE

       ln(1), open(2), rename(2), stat(2), symlink(2), unlink(2), path_resolution(7), symlink(7)

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>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją.  Bliższe informacje o warunkach licencji można uzyskać
       zapoznając się z GNU General Public License w wersji  3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  lub
       nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

       Błędy  w  tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy dyskusyjnej ⟨manpages-pl-
       list@lists.sourceforge.net⟩.