.\" -*- coding: UTF-8 -*-
.\"This manpage is Copyright (C) 2015 Anna Schumaker <Anna.Schumaker@Netapp.com>
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH copy_file_range 2 "5 lutego 2023 r." "Linux man\-pages 6.03" 
.SH NAZWA
copy_file_range \- kopiuje zakres danych z jednego pliku do drugiego
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#define _GNU_SOURCE\fP
\fB#include <unistd.h>\fP
.PP
\fBssize_t copy_file_range(int \fP\fIfd_in\fP\fB, off64_t *_Nullable \fP\fIoff_in\fP\fB,\fP
\fB                        int \fP\fIfd_out\fP\fB, off64_t *_Nullable \fP\fIoff_out\fP\fB,\fP
\fB                        size_t \fP\fIlen\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP
.fi
.SH OPIS
Wywołanie systemowe \fBcopy_file_range\fP() przeprowadza kopiowanie wewnątrz
jądra pomiędzy dwoma deskryptorami plików, bez dodatkowego kosztu transferu
danych z jądro do przestrzeni użytkownika, a następnie z powrotem do
jądra. Kopiuje maksymalnie \fIlen\fP bajtów danych ze źródłowego deskryptora
pliku \fIfd_in\fP do docelowego deskryptora pliku \fIfd_out\fP, nadpisując
wszelkie dane, które istniały w żądanym zakresie pliku docelowego.
.PP
\fIoff_in\fP jest objęte następującą semantyką i podobne stwierdzenia odnoszą
się do \fIoff_out\fP:
.IP \[bu] 3
Jeśli \fIoff_in\fP wynosi NULL, to bajty są odczytywane z \fIfd_in\fP począwszy od
przesunięcia pliku, a przesunięcie pliku jest dostosowywane o liczbę
skopiowanych bajtów.
.IP \[bu]
Jeśli \fIoff_in\fP nie wynosi NULL, to \fIoff_in\fP musi wskazywać na bufor
określający początkowe przesunięcie, od którego zostaną odczytane bajty z
\fIfd_in\fP. Przesunięcie pliku \fIfd_in\fP nie jest zmieniane, ale \fIoff_in\fP jest
odpowiednio dostosowywane.
.PP
\fIfd_in\fP i \fIfd_out\fP mogą odnosić się do tego samego pliku. Jeśli odnoszą
się do tego samego pliku, to zakres źródłowy i docelowy nie mogą na siebie
nachodzić.
.PP
Argument \fIflags\fP jest przeznaczony na przyszłe rozszerzenia i obecnie musi
być ustawiony na 0.
.SH "WARTOŚĆ ZWRACANA"
Po pomyślnym zakończeniu, \fBcopy_file_range\fP() zwróci liczbę bajtów
skopiowanych pomiędzy dwoma plikami. Może być to długość mniejsza od
pierwotnie żądanej. Jeśli przesunięcie pliku \fIfd_in\fP znajduje się na końcu,
lub za końcem, pliku, to nie są kopiowane żadne bajty, a
\fBcopy_file_range\fP() zwraca zero.
.PP
W razie wystąpienia błędu \fBcopy_file_range\fP zwraca \-1 i ustawia \fIerrno\fP,
wskazując błąd.
.SH BŁĘDY
.TP 
\fBEBADF\fP
Jeden lub więcej deskryptorów plików nie jest prawidłowych.
.TP 
\fBEBADF\fP
\fIfd_in\fP nie jest otwarty do odczytu; albo \fIfd_out\fP nie jest otwarty do
zapisu.
.TP 
\fBEBADF\fP
Znacznik \fBO_APPEND\fP jest ustawiony na opis otwartego pliku (ODF,
zob. \fBopen\fP(2)), do którego odnosi się deskryptor pliku \fIfd_out\fP.
.TP 
\fBEFBIG\fP
Podjęto próbę zapisu w pozycji poza maksymalnym przesunięciem pliku
obsługiwanym przez jądro.
.TP 
\fBEFBIG\fP
Podjęto próbę zapisu zakresu, który przekracza maksymalny dopuszczalny
rozmiar pliku. Maksymalny rozmiar pliku różni się pomiędzy implementacjami
systemów plików i może być inny niż maksymalne dopuszczalne przesunięcie
pliku.
.TP 
\fBEFBIG\fP
Podjęto próbę zapisu poza limit zasobu procesu dotyczący rozmiaru
pliku. Może to też spowodować otrzymanie przez proces sygnału \fBSIGXFSZ\fP.
.TP 
\fBEINVAL\fP
Argument \fIflags\fP nie wynosi 0.
.TP 
\fBEINVAL\fP
\fIfd_in\fP i \fIfd_out\fP odnoszą się do tego samego pliku, a źródłowy i docelowy
zakres nachodzą na siebie.
.TP 
\fBEINVAL\fP
\fIfd_in\fP albo \fIfd_out\fP nie jest zwykłym plikiem.
.TP 
\fBEIO\fP
Przy kopiowaniu wystąpił niskopoziomowy błąd wejścia/wyjścia.
.TP 
\fBEISDIR\fP
\fIfd_in\fP albo \fIfd_out\fP odnoszą się do katalogu.
.TP 
\fBENOMEM\fP
Brak pamięci.
.TP 
\fBENOSPC\fP
Na docelowym systemie plików nie ma wystarczająco dużo miejsca, aby ukończyć
kopiowanie.
.TP 
\fBEOPNOTSUPP\fP (od Linuksa 5.19)
.\" commit 868f9f2f8e004bfe0d3935b1976f625b2924893b
System plików nie obsługuje tej operacji.
.TP 
\fBEOVERFLOW\fP
Żądany zakres źródłowy lub docelowy jest zbyt duży, aby dało się go
przedstawić w podanych typach danych.
.TP 
\fBEPERM\fP
\fIfd_out\fP odnosi się do niezmiennego pliku (ang. immutable).
.TP 
\fBETXTBSY\fP
\fIfd_in\fP albo \fIfd_out\fP odnoszą się do aktywnego pliku wymiany.
.TP 
\fBEXDEV\fP (przed Linuksem 5.3)
.\" commit 5dae222a5ff0c269730393018a5539cc970a4726
Pliki, do których odnoszą się \fIfd_in\fP i \fIfd_out\fP nie są położone w tym
samym systemie plików.
.TP 
\fBEXDEV\fP (od Linuksa 5.19)
.\" commit 868f9f2f8e004bfe0d3935b1976f625b2924893b
Pliki, do których odnoszą się \fIfd_in\fP i \fIfd_out\fP nie są położone w tym
samym systemie plików, a źródłowy i docelowy system plików nie jest tego
samego typu lub nie obsługuje kopii pomiędzy systemami plików.
.SH WERSJE
.\" https://sourceware.org/git/?p=glibc.git;a=commit;f=posix/unistd.h;h=bad7a0c81f501fbbcc79af9eaa4b8254441c4a1f
Wywołanie systemowe \fBcopy_file_range\fP() pojawiło się pierwotnie w Linuksie
4.5, lecz glibc 2.27 dostarcza emulację w przestrzeni użytkownika tam, gdzie
wywołanie nie jest dostępne.
.PP
W Linuksie 5.3 doszło do znaczącej modyfikacji implementacji w jądrze. Jasno
zdefiniowano miejsca w API, którym wcześniej tego brakowało, a granice API
są znacznie ściślej sprawdzane, niż we wcześniejszych jądrach.
.PP
Od Linuksa 5.19, możliwe jest kopiowanie pomiędzy systemami plików, jeśli
oba są tego samego typu i dany system plików zaimplementował wsparcie tej
operacji. W USTERKACH opisano zachowanie przed Linuksem 5.19.
.PP
Aplikacje powinny dostosować się do zachowania i wymogów Linuksa 5.19, które
zostało również przeportowane na wcześniejsze stabilne jądra.
.SH STANDARDY
Wywołanie systemowe \fBcopy_file_range\fP() jest niestandardowym rozszerzeniem
Linuksa i GNU.
.SH UWAGI
Jeśli \fIfd_in\fP jest rzadkim (ang. sparse) plikiem, to \fBcopy_file_range\fP()
może wykroczyć poza istniejące dziury w żądanym zakresie. Użytkownicy mogą
zechcieć wywoływać \fBcopy_file_range\fP() w pętli, korzystając z operacji
\fBSEEK_DATA\fP i \fBSEEK_HOLE\fP wywołania \fBlseek\fP(2), aby odnaleźć położenie
segmentów danych.
.PP
\fBcopy_file_range\fP() daje systemom plików sposobność na implementację
technik \[Bq]przyspieszonego kopiowania\[rq], takich jak korzystanie z
dowiązań lekkich (reflinków tj. dwóch lub więcej i\-węzłów, które dzielą
wskaźniki do tych samych bloków dyskowych kopii przy zapisie) lub kopiowania
po stronie serwera (w przypadku NFS).
.SH USTERKI
W Linuksie 5.3 do Linuksa 5.18, kopie pomiędzy systemami plików były
zaimplementowane w jądrze, jeśli operacja nie była obsługiwana przez
poszczególne systemy plików. Jednak w niektórych wirtualnych systemach
plików, kopiowanie się nie powodziło, a mimo to wywołanie wciąż zgłaszało
sukces.
.SH PRZYKŁADY
.\" SRC BEGIN (copy_file_range.c)
.EX
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
    int          fd_in, fd_out;
    off64_t      len, ret;
    struct stat  stat;

    if (argc != 3) {
        fprintf(stderr, "Użycie: %s <źródło> <cel>\en", argv[0]);
        exit(EXIT_FAILURE);
    }

    fd_in = open(argv[1], O_RDONLY);
    if (fd_in == \-1) {
        perror("open (argv[1])");
        exit(EXIT_FAILURE);
    }

    if (fstat(fd_in, &stat) == \-1) {
        perror("fstat");
        exit(EXIT_FAILURE);
    }

    len = stat.st_size;

    fd_out = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0644);
    if (fd_out == \-1) {
        perror("open (argv[2])");
        exit(EXIT_FAILURE);
    }

    do {
        ret = copy_file_range(fd_in, NULL, fd_out, NULL, len, 0);
        if (ret == \-1) {
            perror("copy_file_range");
            exit(EXIT_FAILURE);
        }

        len \-= ret;
    } while (len > 0 && ret > 0);

    close(fd_in);
    close(fd_out);
    exit(EXIT_SUCCESS);
}
.EE
.\" SRC END
.SH "ZOBACZ TAKŻE"
\fBlseek\fP(2), \fBsendfile\fP(2), \fBsplice\fP(2)
.PP
.SH TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika:
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 .
