getids.lisp 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. (in-package :hurd)
  2. (defcfun ("auth_getids" %auth-getids)
  3. err
  4. (auth auth-t)
  5. (eff-uids :pointer)
  6. (num-eff-uids :pointer)
  7. (avail-uids :pointer)
  8. (num-avail-uids :pointer)
  9. (eff-gids :pointer)
  10. (num-eff-gids :pointer)
  11. (avail-gids :pointer)
  12. (num-avail-gids :pointer))
  13. (defun auth-getids (handle)
  14. "Return the current user id's, effective and available."
  15. (let ((eff-uids (%new-ptr))
  16. (num-eff-uids (%new-unsigned 10))
  17. (avail-uids (%new-ptr))
  18. (num-avail-uids (%new-unsigned 20))
  19. (eff-gids (%new-ptr))
  20. (num-eff-gids (%new-unsigned 10))
  21. (avail-gids (%new-ptr))
  22. (num-avail-gids (%new-unsigned 20))
  23. (eff-uids-buf (foreign-alloc 'uid-t :count 10))
  24. (avail-uids-buf (foreign-alloc 'uid-t :count 20))
  25. (eff-gids-buf (foreign-alloc 'gid-t :count 10))
  26. (avail-gids-buf (foreign-alloc 'gid-t :count 20)))
  27. (with-cleanup (free-memory-list
  28. (list eff-uids-buf avail-uids-buf eff-gids-buf avail-gids-buf
  29. eff-uids avail-uids eff-gids avail-gids
  30. num-eff-uids num-avail-uids num-eff-gids num-avail-gids))
  31. (setf (mem-ref eff-uids :pointer) eff-uids-buf
  32. (mem-ref avail-uids :pointer) avail-uids-buf
  33. (mem-ref eff-gids :pointer) eff-gids-buf
  34. (mem-ref avail-gids :pointer) avail-gids-buf)
  35. (let ((ret (%auth-getids handle
  36. eff-uids
  37. num-eff-uids
  38. avail-uids
  39. num-avail-uids
  40. eff-gids
  41. num-eff-gids
  42. avail-gids
  43. num-avail-gids)))
  44. (select-error ret
  45. (let ((eff-uids-ptr (mem-ref eff-uids :pointer))
  46. (num-eff-uids1 (mem-ref num-eff-uids :unsigned-int))
  47. (avail-uids-ptr (mem-ref avail-uids :pointer))
  48. (num-avail-uids1 (mem-ref num-avail-uids :unsigned-int))
  49. (eff-gids-ptr (mem-ref eff-gids :pointer))
  50. (num-eff-gids1 (mem-ref num-eff-gids :unsigned-int))
  51. (avail-gids-ptr (mem-ref avail-gids :pointer))
  52. (num-avail-gids1 (mem-ref num-avail-gids :unsigned-int)))
  53. (with-cleanup (progn
  54. (unless (pointer-eq eff-uids-ptr
  55. eff-uids-buf)
  56. (munmap eff-uids-ptr (* +uid-t-size+ num-eff-uids1)))
  57. (unless (pointer-eq avail-uids-ptr
  58. avail-uids-buf)
  59. (munmap avail-uids-ptr (* +uid-t-size+ num-avail-uids1)))
  60. (unless (pointer-eq eff-gids-ptr
  61. eff-gids-buf)
  62. (munmap eff-gids-ptr (* +gid-t-size+ num-eff-gids1)))
  63. (unless (pointer-eq avail-gids-ptr
  64. avail-gids-buf)
  65. (munmap avail-gids-ptr (* +gid-t-size+ num-avail-gids1))))
  66. (values
  67. (make-iouser-mem eff-uids-ptr num-eff-uids1
  68. eff-gids-ptr num-eff-gids1)
  69. (make-iouser-mem avail-uids-ptr num-avail-uids1
  70. avail-gids-ptr num-avail-gids1)))))))))