~ruther/guix-local

3483f004a98f103acff96effe1309cc620372e79 — Ludovic Courtès 9 years ago 9475fd9
syscalls: Export 'read-utmpx'.

* guix/build/syscalls.scm (read-utmpx-from-port): New procedure.
* tests/syscalls.scm ("read-utmpx, EOF")
("read-utmpx"): New tests.
2 files changed, 21 insertions(+), 1 deletions(-)

M guix/build/syscalls.scm
M tests/syscalls.scm
M guix/build/syscalls.scm => guix/build/syscalls.scm +12 -1
@@ 21,6 21,7 @@
(define-module (guix build syscalls)
  #:use-module (system foreign)
  #:use-module (rnrs bytevectors)
  #:autoload   (ice-9 binary-ports) (get-bytevector-n)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-9)
  #:use-module (srfi srfi-9 gnu)


@@ 142,7 143,8 @@
            utmpx-time
            utmpx-address
            login-type
            utmpx-entries))
            utmpx-entries
            (read-utmpx-from-port . read-utmpx)))

;;; Commentary:
;;;


@@ 1598,4 1600,13 @@ always a positive integer."
      ((? utmpx? entry)
       (loop (cons entry entries))))))

(define (read-utmpx-from-port port)
  "Read a utmpx entry from PORT.  Return either the EOF object or a utmpx
entry."
  (match (get-bytevector-n port sizeof-utmpx)
    ((? eof-object? eof)
     eof)
    ((? bytevector? bv)
     (read-utmpx bv))))

;;; syscalls.scm ends here

M tests/syscalls.scm => tests/syscalls.scm +9 -0
@@ 452,6 452,15 @@
                 #t)))
            entries))))

(test-assert "read-utmpx, EOF"
  (eof-object? (read-utmpx (%make-void-port "r"))))

(unless (access? "/var/run/utmpx" O_RDONLY)
  (tes-skip 1))
(test-assert "read-utmpx"
  (let ((result (call-with-input-file "/var/run/utmpx" read-utmpx)))
    (or (utmpx? result) (eof-object? result))))

(test-end)

(false-if-exception (delete-file temp-file))