summaryrefslogtreecommitdiff
path: root/rtl/unix/initc.pp
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/unix/initc.pp')
-rw-r--r--rtl/unix/initc.pp93
1 files changed, 93 insertions, 0 deletions
diff --git a/rtl/unix/initc.pp b/rtl/unix/initc.pp
new file mode 100644
index 0000000000..2632cf35d9
--- /dev/null
+++ b/rtl/unix/initc.pp
@@ -0,0 +1,93 @@
+{
+ $Id: initc.pp,v 1.12 2005/02/14 17:13:31 peter Exp $
+ This file is part of the Free Pascal run time library.
+ Copyright (c) 1999-2000 by Michael Van Canneyt and Peter Vreman,
+ members of the Free Pascal development team
+
+ This file links to libc, and handles the libc errno abstraction.
+
+ 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.
+
+ **********************************************************************}
+unit initc;
+interface
+{$linklib c}
+
+type libcint = longint;
+ plibcint = ^libcint;
+
+function fpgetCerrno:libcint;
+procedure fpsetCerrno(err:libcint);
+
+{$ifdef HASGLOBALPROPERTY}
+property cerrno:libcint read fpgetCerrno write fpsetcerrno;
+{$endif HASGLOBALPROPERTY}
+
+const clib = 'c';
+
+implementation
+// hasn't been divided up in .inc's, because I first want to see hoe
+// this idea works out.
+
+{$ifdef OpenBSD}
+{$define UseOldErrnoDirectLink}
+{$endif}
+
+{$ifdef UseOldErrnoDirectLink}
+Var
+ interrno : libcint;external name {$ifdef OpenBSD} '_errno' {$else} 'h_errno'{$endif};
+
+function fpgetCerrno:libcint;
+
+begin
+ fpgetCerrno:=interrno;
+end;
+
+procedure fpsetCerrno(err:libcint);
+begin
+ interrno:=err;
+end;
+{$else}
+
+
+{$ifdef Linux}
+function geterrnolocation: Plibcint; cdecl;external clib name '__errno_location';
+{$else}
+{$ifdef FreeBSD} // tested on x86
+function geterrnolocation: Plibcint; cdecl;external clib name '__error';
+{$else}
+{$ifdef NetBSD} // from a sparc dump.
+function geterrnolocation: Plibcint; cdecl;external clib name '__errno';
+{$else}
+{$ifdef Darwin}
+function geterrnolocation: Plibcint; cdecl;external clib name '__error';
+{$endif}
+{$endif}
+{$endif}
+{$endif}
+
+function fpgetCerrno:libcint;
+
+begin
+ fpgetCerrno:=geterrnolocation^;
+end;
+
+procedure fpsetCerrno(err:libcint);
+begin
+ geterrnolocation^:=err;
+end;
+
+{$endif}
+
+end.
+{
+ $Log: initc.pp,v $
+ Revision 1.12 2005/02/14 17:13:31 peter
+ * truncate log
+
+}