(* Процедура filedata выводит данные о файле *)
uses linux;

(*
 * Массив octarray используется для определения
 * установки битов прав доступа.
 *)
const
  octarray:array[0..8] of integer= (
              0400, 0200, 0100,
              0040, 0020, 0010,
              0004, 0002, 0001);

(*
 * Мнемонические коды для прав доступа к файлу,
 * длиной 10 символов, включая нулевой символ в конце строки.
 *)
const 
  perms:pchar = 'rwxrwxrwx';

function filedata(pathname:string):integer;
var
  statbuf:tstat;
  descrip:array [0..9] of char;
  j:integer;
begin
  if not fstat (pathname, statbuf) then
  begin
    writeln('Ошибка вызова stat для ', pathname);
    filedata:=-1;
    exit;
  end;

  (* Преобразовать права доступа в удобочитаемую форму *)
  for j:=0 to 8 do
  begin
      (*
       * Проверить, установлены ли права доступа
       * при помощи побитового И
       *)
      if (statbuf.mode and octal(octarray[j]))<>0 then
	descrip[j] := perms[j]
      else
	descrip[j] := '-';
  end;
  descrip[9] := #0;		(* задать строку *)
  (* Вывести информацию о файле *)
  writeln(#10'Файл ', pathname, ':');
  writeln('Размер ',statbuf.size,' байт');
  writeln('User-id ',statbuf.uid,', Group-id ',statbuf.gid,#10);
  writeln('Права доступа: ', descrip);
  filedata:=0;
end;

begin
  if (paramcount > 0) then
      filedata(paramstr(1));
end.
