{ This file is part of the Free Pascal run time librar~y. Copyright (c) 2000 by Marco van de Voort member of the Free Pascal development team. System unit for the *BSD's. 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. **********************************************************************} { These things are set in the makefile, } { But you can override them here.} { If you use an aout system, set the conditional AOUT} { $Define AOUT} Unit System; Interface {$define FPC_USE_SIGPROCMASK} {$define FPC_USE_SIGALTSTACK} {$ifndef FPC_USE_LIBC} {$define FPC_USE_SYSCALL} {$endif} {$define FPC_IS_SYSTEM} {$I sysunixh.inc} {$ifdef Darwin} var argc:cardinal; argv:PPchar; envp:PPchar; {$endif} CONST SIGSTKSZ = 40960; Implementation {$I system.inc} {***************************************************************************** Misc. System Dependent Functions *****************************************************************************} procedure System_exit; begin Fpexit(cint(ExitCode)); End; Function ParamCount: Longint; Begin Paramcount:=argc-1 End; function BackPos(c:char; const s: shortstring): integer; var i: integer; Begin for i:=length(s) downto 0 do if s[i] = c then break; if i=0 then BackPos := 0 else BackPos := i; end; { variable where full path and filename and executable is stored } { is setup by the startup of the system unit. } var execpathstr : shortstring; function paramstr(l: longint) : string; begin { stricly conforming POSIX applications } { have the executing filename as argv[0] } // if l=0 then // begin // paramstr := execpathstr; // end // else paramstr:=strpas(argv[l]); end; Procedure Randomize; Begin randseed:=longint(Fptime(nil)); End; {***************************************************************************** SystemUnit Initialization *****************************************************************************} function reenable_signal(sig : longint) : boolean; var e,oe : TSigSet; i,j : byte; begin fillchar(e,sizeof(e),#0); fillchar(oe,sizeof(oe),#0); { set is 1 based PM } dec(sig); i:=sig mod 32; j:=sig div 32; e[j]:=1 shl i; fpsigprocmask(SIG_UNBLOCK,@e,@oe); reenable_signal:=geterrno=0; end; {$i sighnd.inc} var act: SigActionRec; Procedure InstallSignals; var oldact: SigActionRec; begin { Initialize the sigaction structure } { all flags and information set to zero } FillChar(act, sizeof(SigActionRec),0); { initialize handler } act.sa_handler :=@SignalToRunError; act.sa_flags:=SA_SIGINFO; FpSigAction(SIGFPE,act,oldact); FpSigAction(SIGSEGV,act,oldact); FpSigAction(SIGBUS,act,oldact); FpSigAction(SIGILL,act,oldact); end; procedure SetupCmdLine; var bufsize, len,j, size,i : longint; found : boolean; buf : pchar; procedure AddBuf; begin reallocmem(cmdline,size+bufsize); move(buf^,cmdline[size],bufsize); inc(size,bufsize); bufsize:=0; end; begin GetMem(buf,ARG_MAX); size:=0; bufsize:=0; i:=0; while (iARG_MAX-2 then len:=ARG_MAX-2; found:=false; for j:=1 to len do if argv[i][j]=' ' then begin found:=true; break; end; if bufsize+len>=ARG_MAX-2 then AddBuf; if found then begin buf[bufsize]:='"'; inc(bufsize); end; move(argv[i]^,buf[bufsize],len); inc(bufsize,len); if found then begin buf[bufsize]:='"'; inc(bufsize); end; if i