Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8097 maxcodehac 1
MODULE unix;    (* connect to unix host *)
2
IMPORT SYSTEM, _unix;
3
(* provide some Oberon friendly POSIX without need for SYSTEM *)
4
 
5
CONST   RTLD_LAZY* = 1;
6
                O_RDONLY* = 0;
7
                O_NEWFILE* = 0C2H;  (* O_RDWR | O_CREAT | O_EXCL *)
8
                (* O_RDONLY=0, O_WRONLY=1, O_RDWR=2, O_CREAT=0x40, O_EXCL=0x80, O_TRUNC=0x200 *)
9
                FD_SETSIZE* = 1024;   (* fd for select() must be smaller than FD_SETSIZE *)
10
                BIT_DEPTH* = _unix.BIT_DEPTH;
11
                LEN_FD_SET = FD_SETSIZE DIV BIT_DEPTH;
12
 
13
TYPE
14
        timespec* = RECORD
15
                tv_sec*, tv_usec* :INTEGER
16
        END;
17
        fd_set* = POINTER TO RECORD   (* for select() *)
18
                bits* :ARRAY LEN_FD_SET OF SET   (* 1024 bits *)
19
        END;
20
 
21
VAR
22
        dlopen* :PROCEDURE [linux] (name, flags :INTEGER) :INTEGER;
23
        dlsym* :PROCEDURE [linux] (p, name :INTEGER) :INTEGER;
24
        dlclose* :PROCEDURE [linux] (p :INTEGER) :INTEGER;
25
        close* :PROCEDURE [linux] (fd :INTEGER) :INTEGER;
26
        exit* :PROCEDURE [linux] (n :INTEGER);
27
        malloc* :PROCEDURE [linux] (sz :INTEGER) :INTEGER;
28
 
29
PROCEDURE open* (path :ARRAY OF CHAR; flag, perm :INTEGER) :INTEGER;
30
BEGIN RETURN _unix._open (SYSTEM.ADR(path[0]), flag, perm) END open;
31
 
32
PROCEDURE read* (fd :INTEGER; VAR buf :ARRAY OF BYTE; len :INTEGER) :INTEGER;
33
BEGIN RETURN _unix._read (fd, SYSTEM.ADR(buf[0]), len) END read;
34
 
35
PROCEDURE readByte* (fd :INTEGER; VAR n :BYTE) :INTEGER;
36
BEGIN RETURN _unix._read (fd, SYSTEM.ADR(n), 1) END readByte;
37
 
38
PROCEDURE write* (fd :INTEGER; buf :ARRAY OF BYTE; len :INTEGER) :INTEGER;
39
BEGIN RETURN _unix._write (fd, SYSTEM.ADR(buf[0]), len) END write;
40
 
41
PROCEDURE writeByte* (fd :INTEGER; n :BYTE) :INTEGER;
42
BEGIN RETURN _unix._write (fd, SYSTEM.ADR(n), 1) END writeByte;
43
 
44
 
45
PROCEDURE FD_ZERO* (VAR selectSet :fd_set);
46
VAR i :INTEGER;
47
BEGIN FOR i := 0 TO LEN_FD_SET-1 DO selectSet.bits[i] := {} END END FD_ZERO;
48
 
49
PROCEDURE FD_SET* (fd :INTEGER; VAR selectSet :fd_set);   (* set fd bit in a select() fd_set *)
50
BEGIN INCL(selectSet.bits[fd DIV BIT_DEPTH], fd MOD BIT_DEPTH)
51
END FD_SET;
52
 
53
PROCEDURE select* (cnt :INTEGER; readfds, writefds, exceptfds :fd_set; timeout :timespec) :INTEGER;
54
VAR n1, n2, n3 :INTEGER;
55
BEGIN
56
        n1 := 0; IF readfds # NIL THEN n1 := SYSTEM.ADR (readfds.bits[0]) END;
57
        n2 := 0; IF writefds # NIL THEN n2 := SYSTEM.ADR (writefds.bits[0]) END;
58
        n3 := 0; IF exceptfds # NIL THEN n3 := SYSTEM.ADR (exceptfds.bits[0]) END;
59
RETURN _unix._select (cnt, n1, n2, n3, SYSTEM.ADR(timeout))
60
END select;
61
 
62
 
63
PROCEDURE finish*;
64
BEGIN _unix.finish; END finish;
65
 
66
BEGIN
67
        dlopen := _unix._dlopen;
68
        dlsym := _unix._dlsym;
69
        dlclose := _unix._dlclose;
70
        close := _unix._close;
71
        exit := _unix._exit;
72
        malloc := _unix._malloc;
73
END unix.
74