Bläddra i källkod

* fixed solaris flock type
* fixed and enabled solaris flock implementation based on fcntl (although
tests/test/units/sysutils/tfile2 still fails for solaris, because
fcntl removes all locks as soon as you close a single file descriptor
referring to a file, while flock doesn't)

git-svn-id: trunk@12632 -

Jonas Maebe 16 år sedan
förälder
incheckning
6851d6d8e0
2 ändrade filer med 18 tillägg och 14 borttagningar
  1. 4 2
      rtl/solaris/ostypes.inc
  2. 14 12
      rtl/solaris/unxfunc.inc

+ 4 - 2
rtl/solaris/ostypes.inc

@@ -66,6 +66,8 @@ TYPE
    PStat             = ^Stat;
 
    flock    = record
+                l_type  : cshort;       { lock type: read/write, etc. }
+                l_whence: cshort;       { type of l_start }
                 {$ifdef 64bitfs}
                 l_start : off64_t;      { starting offset }
                 l_len   : off64_t;      { len = 0 means until end of file }
@@ -73,9 +75,9 @@ TYPE
                 l_start : off_t;        { starting offset }
                 l_len   : off_t;        { len = 0 means until end of file }
                 {$endif}
+                l_sysid : cint;
                 l_pid   : pid_t;        { lock owner }
-                l_type  : cshort;       { lock type: read/write, etc. }
-                l_whence: cshort;       { type of l_start }
+                l_pas   : array[0..3] of clong;
                 end;
    TFlock   = flock;
    pFlock   = ^flock;

+ 14 - 12
rtl/solaris/unxfunc.inc

@@ -74,29 +74,32 @@ begin
  AssignPipe:=ret;
 end;
 
+{ should probably be defined in ostypes.inc for all OSes }
+const
+  F_RDLCK =        01;      (* Read lock *)
+  F_WRLCK =        02;      (* Write lock *)
+  F_UNLCK =        03;      (* Remove lock(s) *)
+
 
 Function fpFlock (fd,mode : longint) : cint;
-{
   var
     fl : flock;
     cmd : cint;
-}
   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
+		if (mode and LOCK_NB)<>0 then
 		  begin
 			  cmd:=F_SETLK;
 			  { turn off this bit }
-			  operation:=operation and not(LOCK_NB);	
+			  mode:=mode and not(LOCK_NB);	
 			end
 		else
 			cmd:=F_SETLKW;
 	
-		case operation of
+		case mode of
 		  LOCK_UN:
 			  fl.l_type:=fl.l_type or F_UNLCK;
   		LOCK_SH:
@@ -105,15 +108,14 @@ Function fpFlock (fd,mode : longint) : cint;
 			  fl.l_type:=fl.l_type or F_WRLCK;
 		  else
 		    begin
-			    errno:=EINVAL;
-			    result:=-1
+			    errno:=ESysEINVAL;
+			    fpFlock:=-1;
 			    exit;
 			  end;
 		end;
 	
-		result:=fpFcntl(fd,cmd,@fl);
+		fpFlock:=fpFcntl(fd,cmd,fl);
 	
-		if (result=-1) and (errno=EACCES)
-			errno:=EWOULDBLOCK;
-}
+		if (fpFlock=-1) and (errno=ESysEACCES) then
+			errno:=ESysEWOULDBLOCK;
   end;