mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 17:29:33 +02:00
+ flock implemented in pascal
git-svn-id: trunk@2499 -
This commit is contained in:
parent
fa1e63d391
commit
5e84d37b2d
@ -70,5 +70,44 @@ end;
|
|||||||
|
|
||||||
|
|
||||||
Function fpFlock (fd,mode : longint) : cint;
|
Function fpFlock (fd,mode : longint) : cint;
|
||||||
|
{
|
||||||
|
var
|
||||||
|
fl : flock;
|
||||||
|
cmd : cint;
|
||||||
|
}
|
||||||
begin
|
begin
|
||||||
|
{
|
||||||
|
{ initialize the flock struct to set lock on entire file }
|
||||||
|
fillchar(fl,sizeof(fl),0);
|
||||||
|
|
||||||
|
{ In non-blocking lock, use F_SETLK for cmd, F_SETLKW otherwise }
|
||||||
|
if (operation and LOCK_NB)<>0 then
|
||||||
|
begin
|
||||||
|
cmd:=F_SETLK;
|
||||||
|
{ turn off this bit }
|
||||||
|
operation:=operation and not(LOCK_NB);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
cmd:=F_SETLKW;
|
||||||
|
|
||||||
|
case operation of
|
||||||
|
LOCK_UN:
|
||||||
|
fl.l_type:=fl.l_type or F_UNLCK;
|
||||||
|
LOCK_SH:
|
||||||
|
fl.l_type:=fl.l_type or F_RDLCK;
|
||||||
|
LOCK_EX:
|
||||||
|
fl.l_type:=fl.l_type or F_WRLCK;
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
errno:=EINVAL;
|
||||||
|
result:=-1
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
result:=fpFcntl(fd,cmd,@fl);
|
||||||
|
|
||||||
|
if (result=-1) and (errno=EACCES)
|
||||||
|
errno:=EWOULDBLOCK;
|
||||||
|
}
|
||||||
end;
|
end;
|
Loading…
Reference in New Issue
Block a user