Ñèñòåìíîå ïðîãðàììèðîâàíèå â UNIX ñðåäñòâàìè Free Pascal

       

Óïðàâëåíèå ôàéëàìè


Óïðàæíåíèå 13.41. Ñîñòàâüòå àíàëîã êîìàíäû rm.

uses linux,sysutils;

var

  f:text;

  d:boolean;

  k:char;

  s:string;

begin

  writeln('ââåäèòå èìÿ ôàéëà, êîòîðûé íóæíî óäàëèòü');

  readln(s);

  assign(f,s);

 

  if s='' then



  begin

    writeln('ïîâòîðèòå ïîïûòêó');

    exit;

  end;

  writeln('ïîäòâåðäèòå óäàëåíèå ôàéëà Y/N');

  readln(k);

  if (k='Y') or (k='y') then

  begin

    d:=deletefile(s);

    if d then

      writeln('ôàéë óäàëåí')

    else

      writeln('ôàéë íå óäàëåí');

  end

  else

    writeln('ôàéë íå óäàëåí');

end.

 

Óïðàæíåíèå 13.42. Èñïîëüçóÿ ñèñòåìíûé âûçîâ fstat, íàïèøèòå ïðîãðàììó, îïðåäåëÿþùóþ òèï ôàéëà: îáû÷íûé ôàéë, êàòàëîã, óñòðîéñòâî, FIFO-ôàéë.

uses linux,strings,sysutils;

function gettype(mode:integer):string;

begin

  if S_ISREG(mode) then

    gettype:='ôàéë'

  else

    if S_ISDIR(mode) then

      gettype:='êàòàëîã'

    else

      if S_ISCHR(mode) then

        gettype:='áàéòîîðèåíòèðîâàííîå óñòðîéñòâî'

      else

        if S_ISBLK(mode) then

          gettype:='áëî÷íîîðèåíòèðîâàííîå óñòðîéñòâî'

        else

          if S_ISFIFO(mode) then

            gettype:='FIFO-ôàéë'

          else

            gettype:='äðóãîå';

end;

var

  st:stat;

  name:array[0..255] of char;

begin

  if paramcount = 0 then

    name:='.'

  else

    name:=fexpand(paramstr(1));

    if not fstat(pchar(name),st) then

      writeln('Îøèáêà âûçîâà stat äëÿ ',name)

    else

      write(gettype(st.mode));

end.

 

Óïðàæíåíèå 13.43. Ñîñòàâüòå àíàëîã êîìàíäû chgrp.

Uses linux;

Var

  UID,GID:Longint;

  F:Text;

  Code:Integer;

begin

  Writeln('This will only work if you are root.');

  if ParamCount<3 then

    begin

      Writeln('Error!!!');

      Writeln('Format: ./task <Filename> <UID> <GID>');

      Halt(1);

    end;

  val(Paramstr(2),UID,Code);

  if Code<>0 then

    begin

      Writeln('Error!!!');

      Writeln('Format: ./task <Filename> <UID> <GID>');




ààààà Halt(1);

ààà end;

à val(Paramstr(3),GID,Code);

à if Code<>0 then

ààà begin

ààààà Writeln('Error!!!');

ààààà Writeln('Format: ./task <Filename> <UID> <GID>');

ààààà Halt(1);

ààà end;

à if not Chown(ParamStr(1),UID,GID)à then

à if LinuxError=Sys_EPERM then

àààà Writeln('You are not root!')

à else

àààà Writeln(' Chmod failed with exit code: ',LinuxError)

à else

àààà Writeln('Changed owner successfully!');

end.

 

Lÿ¨ðöýõýøõ 13.44. Tþ¸ªðò¹ªõ ðýðûþó úþüðýôv mkdir.

Program Tabs;

begin

{$I-}

if ParamCount=1 then

à begin

ààà MkDir(ParamStr(1));

ààà if IOResult <> 0 then Writeln('Cannot create directory')

ààà else Writeln('New directory created');

à end

else Writeln('Error');

end.

 

Lÿ¨ðöýõýøõ 13.45. Tþ¸ªðò¹ªõ ðýðûþó úþüðýôv chmod.

uses linux;

var

à f,ch:string;

à n,i:byte;

à d:integer;

begin

à if paramcount<>2 then

à begin

ààà writeln('L¸ÿþû¹÷ºùªõ: ',paramstr(0),' ÿ¨ðòð_ôþ¸ªºÿð ¯ðùû/úðªðûþó');

ààà exit;

à end;

à f:=paramstr(2);

à ch:=paramstr(1);

à n:=length(ch);

à d:=0;

à for i:=1 to n do

ààà if not (ch[i] in ['0'..'7']) then

ààà begin

ààààà writeln('¦¨ðòð ôþ¸ªºÿð ôþûöýv ñvª¹ ò òþ¸¹üõ¨ø¢ýþü ¯þ¨üðªõ');

ààààà exit;

ààà end

ààà else

ààààà d:=d*8+byte(ch[i])-byte('0');

à if not chmod(f,d) then

ààà writeln('+°øñú𠺸ªðýþòúø ÿ¨ðò ôþ¸ªºÿð ',ch,' ôû  ',f);

end.

Lÿ¨ðöýõýøõ 13.46. Tþ¸ªðò¹ªõ ðýðûþó úþüðýôv chown.

uses linux,strings,sysutils,crt;

type

à plong=^longint;

procedure perror(s:pchar);cdecl;external 'c';

function strchr(s:string;c:char):boolean;

var

à i:integer;

begin

à for i:=1 to length(s) do

ààà if s[i]=c then

ààà begin

ààààà strchr:=true;

ààààà exit;

ààà end;

à strchr:=false;

end;

procedure getall(w:string;name:string;var uid,gid:integer);

var ts,nam1,namb1,namb2:string;

ààà tx:text;

ààà d:integer;

ààà f:boolean;

begin

à assign(tx,w);

à reset(tx);

à f:=false;

à while not EOF (tx) and not f do



à begin

àààààà readln(tx,ts);

àààààà d:=pos(':',ts);

àààààà nam1:=copy(ts,1,d-1);

àààààà delete(ts,1,d+2);

àààààà d:=pos(':',ts);

àààààà namb1:=copy(ts,1,d-1);

àààààà delete(ts,1,d);

àààààà val(namb1,d);

àààààà uid:=d;

àààààà d:=pos(':',ts);

àààààà namb2:=copy(ts,1,d-1);

àààààà val(namb2,d);

àààààà gid:=d;

àààààà if nam1=name then

àààààààà f:=true;

à end;

à if not f then

à begin

ààà uid:=-1;

ààà gid:=-1;

à end;

à close(tx);ààààà

end;

var

à username,groupname,fname:string;

à uid,gid:integer;à

à posit,temp:integer;

begin

à if paramcount<>2 then

à begin

ààà writeln('L¸ÿþû¹÷ºùªõ: ',paramstr(0),' òûðôõûõ¡[:ó¨ºÿÿð] ¯ðùû');

ààà exit;àà

à end;

à username:=paramstr(1);

à fname:=paramstr(2);

à posit:=0;

à posit:=pos(':',username);

à if posit<>0 then

à begin

ààà groupname:=copy(username,posit+1,length(username)-posit);

ààà username[0]:=char(posit-1);

ààà getall('/etc/passwd',username,uid,gid);

ààà getall('/etc/group',groupname,gid,temp);

à end

à else

ààà getall('/etc/passwd',username,uid,gid);

à if (uid=-1) or (gid=-1) then

à begin

ààà writeln('=õòõ¨ýþõ øü  òûðôõû¹¡ð (ó¨ºÿÿv)');

ààà exit;

à end;

à if not chown(fname,uid,gid) then

ààà perror('+°øñúð òv÷þòð chown');

end.

Lÿ¨ðöýõýøõ 13.47. Tþ÷ôðùªõ ÿ¨þó¨ðüüº chmodr, ¨õúº¨¸øòýþ ø÷üõý ¦•º¦ ÿ¨ðòð ôþ¸ªºÿð ôû  ò¸õ¿ ¯ðùûþò úðªðûþóð ø òûþöõýýv¿ ò ýõóþ ÿþôúðªðûþóþò. Lü  úðªðûþóð ø ÿ¨ðòð ºúð÷vò𦪸  ò úþüðýôýþù ¸ª¨þúõ.

uses linux,strings,sysutils,crt;

function gettype(mode:integer):char;

begin

à if S_ISREG(mode) then

ààà gettype:='-'

à else

ààà if S_ISDIR(mode) then

ààààà gettype:='d'

ààà else

ààààà if S_ISCHR(mode) then

ààààààà gettype:='c'

ààààà else

ààààààà if S_ISBLK(mode) then

ààààààààà gettype:='b'

ààààààà else

ààààààààà if S_ISFIFO(mode) then

ààààààààààà gettype:='p'

ààààààààà else

ààààààààààà gettype:='l';

end;

function obhod(prava:integer;name:pchar):boolean;

var

à flag:boolean;

à d:PDIR;

à el:pdirent;



à st:stat;

à res:integer;

à polniypath:array [0..2000] of char;

à ch:string;

à n,i:byte;

begin

à flag:=true;

à d:=opendir(name);

à if d=nil then

à begin

ààà writeln('+°øñúð þªú¨vªø  úðªðûþóð ',name);

ààà exit;

à end;

à el:=readdir(d);

à while el<>nil do

à begin

ààà polniypath:=name;

ààà if strcomp(name,'/')=0 then

ààààà strcat(polniypath,el^.name)

ààà else

ààà begin

ààààà if name[strlen(name)-1]<>'/' then

ààààààààà strcat(polniypath,'/');

ààààà strcat(polniypath,el^.name);

ààà end;

ààà

ààà if not fstat(pchar(polniypath),st) then

ààààààà writeln('+°øñúð òv÷þòð stat ôû  ',polniypath)

ààà else

ààà begin

àààààààààà //if not (gettype(st.mode) = 'd') then

àààà àif not chmod(pchar(polniypath),prava) then

ààààààà writeln('+°øñú𠺸ªðýþòúø ÿ¨ðò ôþ¸ªºÿð ',prava,' ôû  ',polniypath);

ààà end;

ààà el:=readdir(d);

à end;

à closedir(d);

à

à d:=opendir(name);

à el:=readdir(d);

à while el<>nil do

à begin

ààà polniypath:=name;

ààà if strcomp(name,'/')=0 then

ààààà strcat(polniypath,el^.name)

ààà else

ààà begin

ààààà if name[strlen(name)-1]<>'/' then

ààààààà strcat(polniypath,'/');

ààààà strcat(polniypath,el^.name);

ààà end;

ààà if not fstat(pchar(polniypath),st) then

àààà àwriteln('+°øñúð òv÷þòð stat ôû  ',polniypath)

ààà else

ààà begin

ààààà if (gettype(st.mode)='d') and

àààààààà (strcomp(el^.name,'.')<>0) and

àààààààà (strcomp(el^.name,'..')<>0) then

ààààà begin

ààààààà writeln('¦õ¨õ¿þô ò úðªðûþó ',polniypath);ààààà

àà àààààif not obhod(prava,polniypath) then

ààààààààà flag:=false;

ààààà end;

ààà end;

ààà el:=readdir(d);

à end;

à closedir(d);

à if not flag then

ààà writeln(' L úðªðûþóð ',name, ' ýõ ºôðûþ¸¹ ø÷üõýøª¹ ÿ¨ðòð ôþ¸ªºÿð ');

//à writeln('-û  úðªðûþóð ',name, ' ÿþûº¢õý ',flag);

à obhod:=flag;

end;

var

à name:array [0..2000] of char;

à prava,i:integer;

à ch:string;

begin

à if paramcount<>2 then

à begin

ààà writeln('L¸ÿþû¹÷ºùªõ: ',paramstr(0),' ÿ¨ðòð_ôþ¸ªºÿð ¯ðùû/úðªðûþó');



ààà exit;

à end;

à name:=paramstr(2);

ààch:=paramstr(1);

à prava:=0;

à for i:=1 to length(ch) do

ààà if not (ch[i] in ['0'..'7']) then

ààà begin

ààààà writeln('¦¨ðòð ôþ¸ªºÿð ôþûöýv ñvª¹ ò òþ¸¹üõ¨ø¢ýþü ¯þ¨üðªõ');

ààààà exit;

ààà end

ààà else

ààààà prava:=prava*8+byte(ch[i])-byte('0');

à

à obhod(prava,name);

end.

Lÿ¨ðöýõýøõ 13.48. =ðÿø°øªõ ÿ¨þó¨ðüüº, ¸þòüõ•ð¦•ð  úþüðýôv mv ø cp (ò ÷ðòø¸øüþ¸ªø þª ¸òþõóþ ýð÷òðýø ).

uses linux,sysutils;

var

à b:byte;

à s:string;

à f1,f2:file of byte;

begin

à s:=paramstr(0);

à delete(s,1,length(s)-2);

à if s='mv' then

à begin

ààà if paramcount<2 then

ààà begin

ààààà writeln('Error: wrong arguments');

ààààà writeln('òòõôøªõ øü  ¯ðùûð, úþªþ¨vù ¿þªøªõ ÿõ¨õøüõýþò𪹠ø ýþòþõ øü  ¯ðùûð');

ààààà halt(1);

ààà end;

ààà Assign(F1,paramstr(1));

ààà Assign(F2,paramstr(2));

ààà if not frename(paramstr(1),paramstr(2)) then

ààà begin

ààààà writeln('ýõòþ÷üþöýþ ÿõ¨õøüõýþò𪹠');

ààààà halt(1);

ààà end;

à end

à else

ààà if s='cp' then

ààà begin

ààààà if paramcount<2 then

ààààà begin

ààààààà writeln('Error: wrong arguments');

ààààààà writeln('format: cp <fileinp> <fileout>');

ààààààà Halt(1);

ààààà end;

ààààà Assign(f1,paramstr(1));

ààààà Reset(f1);

ààààà Assign(f2,paramstr(2));

ààààà Rewrite(f2);

ààààà while not eof(f1)do

ààààà begin

ààààààà read(f1,b);

ààààààà write(f2,b);

ààààà end;

ààààà close(f1);

ààààà close(f2);

ààà end

ààà else

ààààà writeln('¦õ¨õøüõýºùªõ ÿ¨þó¨ðüüº ò mv / cp');

end.

Lÿ¨ðöýõýøõ 13.49. Tþ¸ªðò¹ªõ ðýðûþó úþüðýôv sync.

procedure sync;cdecl; external 'c';

begin

à sync;

end.

Lÿ¨ðöýõýøõ 13.50. Tþ÷ôðùªõ ÿ¨þó¨ðüüº, òvòþô •º¦ ¸þôõ¨öøüþõ ¸øüòþûø¢õ¸úþù ¸¸vûúø, ð ÷ðªõü Ö ¡õûõòþóþ ¯ðùûð, ýð úþªþ¨vù þýð ºúð÷vòðõª.

uses linux;

var

à name,temp:array [0..1023] of char;

à kol,fd:integer;

begin

à if paramcount<>1 then

à begin

ààà writeln('L¸ÿþû¹÷ºùªõ: ',paramstr(0),' øü _¸¸vûúø');

ààà exit;

à end;

à temp:=paramstr(1);

à kol:=readlink(temp,name,1023);

à if kol=-1 then

à begin

ààà writeln('+°øñú𠢪õýø  ¸¸vûúø ',temp);

ààà exit;

à end;

à name[kol]:=#0;

à writeln('¦þ ¸¸vûúõ ',paramstr(1), ' ýðùôõý ¯ðùû ',name);

à fd:=fdopen(name,Open_RDONLY);

à if fd=-1 then

à begin

ààà writeln('+°øñúð þªú¨vªø  ',name);

ààà exit;

à end;

à kol:=fdread(fd,name,1024);

à while kol>0 do

à begin

ààà fdwrite(1,name,kol);

ààà kol:=fdread(fd,name,1024);

à end;

à fdclose(fd);

end.


Ñîäåðæàíèå ðàçäåëà