_unix.ob07 2.6 KB

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