mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 03:19:47 +01:00 
			
		
		
		
	* fix shmget to use size_t as per manpage * directly use external, don't depend on ipccdecl.inc (may be removed if confirmed) git-svn-id: trunk@7973 -
		
			
				
	
	
		
			119 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
{
 | 
						|
    This file is part of the Free Pascal run time library.
 | 
						|
    Copyright (c) 2001 by Free Pascal development team
 | 
						|
 | 
						|
    Linux IPC implemented with ipccall
 | 
						|
 | 
						|
    See the file COPYING.FPC, included in this distribution,
 | 
						|
    for details about the copyright.
 | 
						|
 | 
						|
    This program is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
						|
 | 
						|
 ***********************************************************************}
 | 
						|
{ The following definitions come from linux/ipc.h }
 | 
						|
 | 
						|
Function ftok (Path : pchar; ID : cint) : TKey;
 | 
						|
Var Info : TStat;
 | 
						|
begin
 | 
						|
  If fpstat(path,info)<0 then
 | 
						|
    ftok:=-1
 | 
						|
  else
 | 
						|
    begin
 | 
						|
    ftok:= (info.st_ino and $FFFF) or ((info.st_dev and $ff) shl 16) or (byte(ID) shl 24)
 | 
						|
    end;
 | 
						|
end;
 | 
						|
 | 
						|
Const
 | 
						|
  CALL_SEMOP   = 1;
 | 
						|
  CALL_SEMGET  = 2;
 | 
						|
  CALL_SEMCTL  = 3;
 | 
						|
  CALL_MSGSND  = 11;
 | 
						|
  CALL_MSGRCV  = 12;
 | 
						|
  CALL_MSGGET  = 13;
 | 
						|
  CALL_MSGCTL  = 14;
 | 
						|
  CALL_SHMAT   = 21;
 | 
						|
  CALL_SHMDT   = 22;
 | 
						|
  CALL_SHMGET  = 23;
 | 
						|
  CALL_SHMCTL  = 24;
 | 
						|
 | 
						|
{ generic call that handles all IPC calls }
 | 
						|
 | 
						|
function ipccall(Call,First,Second,Third : cint; P : Pointer) : ptrint;
 | 
						|
begin
 | 
						|
 ipccall:=do_syscall(syscall_nr_ipc,call,first,second,third,ptrint(P));
 | 
						|
// ipcerror:=fpgetErrno;
 | 
						|
end;
 | 
						|
 | 
						|
function shmget(key: Tkey; size:size_t; flag:cint):cint;
 | 
						|
begin
 | 
						|
  shmget:=ipccall (CALL_SHMGET,key,size,flag,nil);
 | 
						|
end;
 | 
						|
 | 
						|
Function shmat (shmid:cint; shmaddr:pointer; shmflg:cint):pointer;
 | 
						|
Var raddr : pchar;
 | 
						|
    error : ptrint;
 | 
						|
begin
 | 
						|
  error:=ipccall(CALL_SHMAT,shmid,shmflg,cint(@raddr),shmaddr);
 | 
						|
  If Error<0 then
 | 
						|
    shmat:=pchar(error)
 | 
						|
  else
 | 
						|
    shmat:=raddr;
 | 
						|
end;
 | 
						|
 | 
						|
function shmdt (shmaddr:pointer): cint;
 | 
						|
begin
 | 
						|
  shmdt:=ipccall(CALL_SHMDT,0,0,0,shmaddr);
 | 
						|
end;
 | 
						|
 | 
						|
function shmctl(shmid:cint; cmd:cint; buf: pshmid_ds): cint;
 | 
						|
begin
 | 
						|
 shmctl:=ipccall(CALL_SHMCTL,shmid,cmd,0,buf);
 | 
						|
end;
 | 
						|
 | 
						|
function msgget(key:Tkey; msgflg:cint):cint;
 | 
						|
begin
 | 
						|
  msgget:=ipccall(CALL_MSGGET,key,msgflg,0,Nil);
 | 
						|
end;
 | 
						|
 | 
						|
function msgsnd(msqid:cint; msgp: PMSGBuf; msgsz: size_t; msgflg:cint):cint;
 | 
						|
begin
 | 
						|
  msgsnd:=ipccall(Call_MSGSND,msqid,msgsz,msgflg,msgp);
 | 
						|
end;
 | 
						|
 | 
						|
function msgrcv(msqid:cint; msgp: PMSGBuf; msgsz: size_t; msgtyp:cint; msgflg:cint):cint;
 | 
						|
Type
 | 
						|
  TIPC_Kludge = Record
 | 
						|
    msgp   : pmsgbuf;
 | 
						|
    msgtyp : cint;
 | 
						|
  end;
 | 
						|
Var
 | 
						|
   tmp : TIPC_Kludge;
 | 
						|
begin
 | 
						|
  tmp.msgp   := msgp;
 | 
						|
  tmp.msgtyp := msgtyp;
 | 
						|
  msgrcv:=ipccall(CALL_MSGRCV,msqid,msgsz,msgflg,@tmp);
 | 
						|
end;
 | 
						|
 | 
						|
Function msgctl(msqid:cint; cmd: cint; buf: PMSQid_ds): cint;
 | 
						|
begin
 | 
						|
  msgctl:=ipccall(CALL_MSGCTL,msqid,cmd,0,buf);
 | 
						|
end;
 | 
						|
 | 
						|
Function semget(key:Tkey; nsems:cint; semflg:cint): cint;
 | 
						|
begin
 | 
						|
  semget:=ipccall (CALL_SEMGET,key,nsems,semflg,Nil);
 | 
						|
end;
 | 
						|
 | 
						|
Function semop(semid:cint; sops: psembuf; nsops:cuint): cint;
 | 
						|
begin
 | 
						|
  semop:=ipccall (CALL_SEMOP,semid,cint(nsops),0,Pointer(sops));
 | 
						|
end;
 | 
						|
 | 
						|
Function semctl(semid:cint; semnum:cint; cmd:cint; var arg: tsemun): cint;
 | 
						|
begin
 | 
						|
  semctl:=ipccall(CALL_SEMCTL,semid,semnum,cmd,@arg);
 | 
						|
end;
 | 
						|
 |