Добавил:
Mendeleev
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal / examples / 12 / copyfile11
.pasuses linux;
var
i, input, output, filesize:longint;
source, target:pchar;
args:tmmapargs;
const
endchar:char=#0;
type
oearray=array [0..0] of char;
poearray=^oearray;
begin
(* рТПЧЕТЛБ ЮЙУМБ ЧИПДОЩИ РБТБНЕФТПЧ *)
if paramcount <> 2 then
begin
writeln(stderr, 'уЙОФБЛУЙУ: copyfile ЙУФПЮОЙЛ ГЕМШ');
halt (1);
end;
(* пФЛТЩФШ ЧИПДОПК Й ЧЩИПДОПК ЖБКМЩ *)
input := fdopen (paramstr(1), Open_RDONLY);
if input = -1 then
begin
writeln(stderr, 'пЫЙВЛБ РТЙ ПФЛТЩФЙЙ ЖБКМБ ', paramstr(1));
halt (1);
end;
output := fdopen (paramstr(2), Open_RDWR or Open_CREAT or Open_TRUNC, octal(0666));
if output = -1 then
begin
fdclose (input);
writeln(stderr, 'пЫЙВЛБ РТЙ ПФЛТЩФЙЙ ЖБКМБ ', paramstr(2));
halt (2);
end;
(* уПЪДБФШ ЧФПТПК ЖБКМ У ФЕН ЦЕ ТБЪНЕТПН, ЮФП Й РЕТЧЩК. *)
filesize := fdseek (input, 0, SEEK_END);
fdseek (output, filesize - 1, SEEK_SET);
fdwrite (output, endchar, 1);
(* пФПВТБЪЙФШ Ч РБНСФШ ЧИПДОПК Й ЧЩИПДОПК ЖБКМЩ. *)
args.fd:=input;
args.flags:=MAP_SHARED;
args.prot:=PROT_READ;
args.size:=filesize;
args.address:=0;
args.offset:=0;
source:=pchar(mmap(args));
if longint(source) = -1 then
begin
writeln(stderr, 'пЫЙВЛБ ПФПВТБЦЕОЙС ЖБКМБ 1 Ч РБНСФШ');
halt (1);
end;
args.fd:=output;
args.flags:=MAP_SHARED;
args.prot:=PROT_WRITE;
args.size:=filesize;
args.address:=0;
args.offset:=0;
target:=pchar(mmap(args));
if longint(target) = -1 then
begin
writeln(stderr, 'пЫЙВЛБ ПФПВТБЦЕОЙС ЖБКМБ 2 Ч РБНСФШ');
halt (1);
end;
(* лПРЙТПЧБОЙЕ *)
for i:=0 to filesize-1 do
poearray(target)^[i] := poearray(source)^[i];
(* пФНЕОЙФШ ПФПВТБЦЕОЙЕ ПВПЙИ ЖБКМПЧ *)
munmap (source, filesize);
munmap (target, filesize);
(* ъБЛТЩФШ ПВБ ЖБКМБ *)
fdclose (input);
fdclose (output);
halt (0);
end.