nextstep.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:1k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. #include <mach-o/rld.h>
  2. #include <streams/streams.h>
  3. #include <stdlib.h>
  4. static char *lastError = NULL;
  5. static NXStream *
  6. OpenError()
  7. {
  8. return NXOpenMemory(NULL, 0, NX_WRITEONLY);
  9. }
  10. static void
  11. CloseError(NXStream * s)
  12. {
  13. if (s)
  14. NXCloseMemory(s, NX_FREEBUFFER);
  15. }
  16. static void
  17. TransferError(NXStream * s)
  18. {
  19. char    *buffer;
  20. int len,
  21. maxlen;
  22. if (lastError)
  23. free(lastError);
  24. NXGetMemoryBuffer(s, &buffer, &len, &maxlen);
  25. lastError = malloc(len + 1);
  26. strcpy(lastError, buffer);
  27. }
  28. void *
  29. next_dlopen(char *name)
  30. {
  31. int rld_success;
  32. NXStream   *errorStream;
  33. char    *result = NULL;
  34. char   **p;
  35. errorStream = OpenError();
  36. p = calloc(2, sizeof(void *));
  37. p[0] = name;
  38. rld_success = rld_load(errorStream, NULL, p, NULL);
  39. free(p);
  40. if (!rld_success)
  41. {
  42. TransferError(errorStream);
  43. result = (char *) 1;
  44. }
  45. CloseError(errorStream);
  46. return result;
  47. }
  48. int
  49. next_dlclose(void *handle)
  50. {
  51. return 0;
  52. }
  53. void *
  54. next_dlsym(void *handle, char *symbol)
  55. {
  56. NXStream   *errorStream = OpenError();
  57. char symbuf[1024];
  58. unsigned long symref = 0;
  59. sprintf(symbuf, "_%s", symbol);
  60. if (!rld_lookup(errorStream, symbuf, &symref))
  61. TransferError(errorStream);
  62. CloseError(errorStream);
  63. return (void *) symref;
  64. }
  65. char *
  66. next_dlerror(void)
  67. {
  68. return lastError;
  69. }