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 |