reauth.lisp 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. (in-package :hurd)
  2. (defcfun ("auth_server_authenticate" %auth-server-authenticate)
  3. err
  4. (auth auth-t)
  5. (rendezvous port)
  6. (rendezvous-type msg-type-name)
  7. (newport port)
  8. (newport-type msg-type-name)
  9. (euids :pointer) ; idarray_t*
  10. (euids-count :pointer) ; msg-type-number
  11. (auids :pointer)
  12. (auids-count :pointer)
  13. (egids :pointer)
  14. (egids-count :pointer)
  15. (agids :pointer)
  16. (agis-count :pointer))
  17. (defun user-reauth (auth-server rend-port new-right permit-failure-p)
  18. "Makes an user reauthentication with 'auth-server'."
  19. (let* ((gubuf (foreign-alloc 'uid-t :count 20))
  20. (ggbuf (foreign-alloc 'gid-t :count 20))
  21. (aubuf (foreign-alloc 'uid-t :count 20))
  22. (agbuf (foreign-alloc 'gid-t :count 20))
  23. (gen-uids (%new-ptr))
  24. (gen-gids (%new-ptr))
  25. (aux-uids (%new-ptr))
  26. (aux-gids (%new-ptr))
  27. (gen-uids-len (%new-unsigned 20))
  28. (gen-gids-len (%new-unsigned 20))
  29. (aux-uids-len (%new-unsigned 20))
  30. (aux-gids-len (%new-unsigned 20)))
  31. (setf (mem-ref gen-uids :pointer) gubuf
  32. (mem-ref gen-gids :pointer) ggbuf
  33. (mem-ref aux-uids :pointer) aubuf
  34. (mem-ref aux-gids :pointer) agbuf)
  35. (with-cleanup (free-memory-list (list
  36. gubuf ggbuf aubuf agbuf
  37. gen-uids gen-gids aux-uids aux-gids
  38. gen-uids-len gen-gids-len aux-uids-len aux-gids-len))
  39. (let ((err (%auth-server-authenticate
  40. auth-server
  41. rend-port
  42. :copy-send
  43. new-right
  44. :copy-send
  45. gen-uids gen-uids-len
  46. aux-uids aux-uids-len
  47. gen-gids gen-gids-len
  48. aux-gids aux-gids-len)))
  49. (let ((uids-len (mem-ref gen-uids-len :unsigned-int))
  50. (gids-len (mem-ref gen-gids-len :unsigned-int))
  51. (uids-ptr (mem-ref gen-uids :pointer))
  52. (gids-ptr (mem-ref gen-gids :pointer))
  53. (auids-len (mem-ref aux-uids-len :unsigned-int))
  54. (agids-len (mem-ref aux-gids-len :unsigned-int))
  55. (auids-ptr (mem-ref aux-uids :pointer))
  56. (agids-ptr (mem-ref aux-gids :pointer)))
  57. (with-cleanup (progn
  58. (unless (pointer-eq gubuf uids-ptr)
  59. (munmap uids-ptr (* +uid-t-size+ uids-len)))
  60. (unless (pointer-eq ggbuf gids-ptr)
  61. (munmap gids-ptr (* +gid-t-size+ gids-len)))
  62. (unless (pointer-eq aubuf auids-ptr)
  63. (munmap auids-ptr (* +uid-t-size+ auids-len)))
  64. (unless (pointer-eq agbuf agids-ptr)
  65. (munmap agids-ptr (* +gid-t-size+ agids-len))))
  66. (cond
  67. ((eq err t)
  68. (make-iouser-mem uids-ptr uids-len gids-ptr gids-len))
  69. (t
  70. (if permit-failure-p
  71. (make-empty-iouser)
  72. nil)))))))))