unix.ob07 2.8 KB

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