Subversion Repositories Kolibri OS

Rev

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

  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.  
  75.