getroot.lisp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. (in-package :hurd)
  2. (defcfun ("fsys_getroot" %fsys-getroot)
  3. err
  4. (control port)
  5. (dotdot port)
  6. (dotdot-poly msg-type-name)
  7. (uids :pointer)
  8. (uids-count msg-type-number)
  9. (gids :pointer)
  10. (gids-count msg-type-number)
  11. (flags open-flags)
  12. (do-retry :pointer)
  13. (retry-name :pointer)
  14. (file port-pointer))
  15. (defun fsys-getroot (control dotdot dotdot-poly user flags)
  16. "Returns a file to the root of the filesystem. See hurd/fsys.defs for details."
  17. (with-foreign-pointer (root (foreign-type-size 'port))
  18. (with-foreign-pointer (retry-name 2048)
  19. (with-foreign-pointer (do-retry (foreign-type-size 'retry-type))
  20. (let ((uids (get-foreign-uids user))
  21. (gids (get-foreign-gids user)))
  22. (with-cleanup (free-memory-list (list (first uids) (first gids)))
  23. (let ((return-code (%fsys-getroot control
  24. dotdot
  25. dotdot-poly
  26. (first uids) (second uids) ; pointer and size
  27. (first gids) (second gids) ; pointer and size
  28. flags
  29. do-retry
  30. retry-name
  31. root)))
  32. (select-error return-code (values
  33. (mem-ref do-retry 'retry-type)
  34. (foreign-string-to-lisp retry-name)
  35. (mem-ref root 'port))))))))))