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, API;
  3.  
  4. (* how to find C declarations:
  5. - gcc -E        preprocess only (to stdout) (preprocessor expand)
  6. - grep -r  name  /usr/include/*
  7. - ldd progfile
  8. - objdump -T progfile  (-t) (-x)
  9. *)
  10.  
  11. CONST   RTLD_LAZY = 1;
  12.         BIT_DEPTH* = API.BIT_DEPTH;
  13.  
  14. VAR sym, libc, libdl :INTEGER;
  15.  
  16.         _dlopen* :PROCEDURE [linux] (name, flags :INTEGER) :INTEGER;
  17.         _dlsym* :PROCEDURE [linux] (p, name :INTEGER) :INTEGER;
  18.         _dlclose* :PROCEDURE [linux] (p :INTEGER) :INTEGER;
  19.         _open* :PROCEDURE [linux] (name, flags, mode :INTEGER) :INTEGER;
  20.         _close* :PROCEDURE [linux] (fd :INTEGER) :INTEGER;
  21.         _read* :PROCEDURE [linux] (fd, buf, sz :INTEGER): INTEGER;
  22.         _write* :PROCEDURE [linux] (fd, buf, sz :INTEGER) :INTEGER;
  23.         _exit* :PROCEDURE [linux] (n :INTEGER);
  24.         _malloc* :PROCEDURE [linux] (sz :INTEGER) :INTEGER;
  25.         _select* :PROCEDURE [linux] (cnt, readfds, writefds, exceptfds, timeout :INTEGER) :INTEGER;
  26.  
  27.         (* error message to stderr *)
  28. PROCEDURE writeChar (c :CHAR);
  29. VAR ri :INTEGER;
  30. BEGIN ri := _write (2, SYSTEM.ADR(c), 1); ASSERT (ri = 1) END writeChar;
  31.  
  32. PROCEDURE writeString (s :ARRAY OF CHAR);
  33. VAR i :INTEGER;
  34. BEGIN i := 0; WHILE s[i] # 0X DO writeChar (s[i]); INC(i) END; END writeString;
  35.  
  36. PROCEDURE nl;
  37. BEGIN writeChar (0AX) END nl;
  38.  
  39.  
  40. PROCEDURE getSymAdr (lib :INTEGER; name :ARRAY OF CHAR; adr :INTEGER);
  41. BEGIN
  42.         sym := _dlsym (lib, SYSTEM.ADR(name[0]));
  43.         IF sym = 0 THEN writeString ("error: dlsym: "); writeString (name); nl END;
  44.         ASSERT (sym # 0);
  45.         SYSTEM.PUT (adr, sym)
  46. END getSymAdr;
  47.  
  48.  
  49. PROCEDURE finish*;
  50. VAR ri :INTEGER;
  51. BEGIN
  52.         IF libc # 0 THEN ri := _dlclose (libc); libc := 0 END;
  53.         IF libdl # 0 THEN ri := _dlclose (libdl); libdl := 0 END;
  54. END finish;
  55.  
  56.  
  57. BEGIN
  58.         _dlopen := API.dlopen;
  59.         _dlsym := API.dlsym;
  60.         libc := _dlopen (SYSTEM.SADR("libc.so.6"), RTLD_LAZY); ASSERT (libc # 0);
  61.                 (* getSymAdr is not used for write() to get writeString() error message going *);
  62.         sym := _dlsym (libc, SYSTEM.SADR("write")); ASSERT (sym # 0); SYSTEM.PUT (SYSTEM.ADR(_write), sym);
  63.  
  64.         libdl := _dlopen (SYSTEM.SADR("libdl.so.2"), RTLD_LAZY); ASSERT (libdl # 0);
  65.         getSymAdr (libdl, "dlclose", SYSTEM.ADR(_dlclose));
  66.  
  67.         getSymAdr (libc, "open", SYSTEM.ADR(_open));
  68.         getSymAdr (libc, "close", SYSTEM.ADR(_close));
  69.         getSymAdr (libc, "read", SYSTEM.ADR(_read));
  70.         getSymAdr (libc, "exit", SYSTEM.ADR(_exit));
  71.         getSymAdr (libc, "malloc", SYSTEM.ADR(_malloc));
  72.         getSymAdr (libc, "select", SYSTEM.ADR(_select));
  73. END _unix.
  74.  
  75.