guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/02: syscalls: Add 'add-to-entropy-count'.


From: guix-commits
Subject: 01/02: syscalls: Add 'add-to-entropy-count'.
Date: Sat, 5 Oct 2019 16:05:10 -0400 (EDT)

civodul pushed a commit to branch core-updates
in repository guix.

commit 5e5f7167943b408ae55736a44908a82056c87780
Author: Ludovic Courtès <address@hidden>
Date:   Sat Oct 5 21:54:31 2019 +0200

    syscalls: Add 'add-to-entropy-count'.
    
    * guix/build/syscalls.scm (RNDADDTOENTCNT): New variable.
    (add-to-entropy-count): New procedure.
    * tests/syscalls.scm ("add-to-entropy-count"): New test.
---
 guix/build/syscalls.scm | 28 ++++++++++++++++++++++++++++
 tests/syscalls.scm      | 13 +++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm
index f2fdb4d..bbf2531 100644
--- a/guix/build/syscalls.scm
+++ b/guix/build/syscalls.scm
@@ -68,6 +68,7 @@
             statfs
             free-disk-space
             device-in-use?
+            add-to-entropy-count
 
             processes
             mkdtemp!
@@ -708,6 +709,33 @@ backend device."
 
 
 ;;;
+;;; Random.
+;;;
+
+;; From <uapi/linux/random.h>.
+(define RNDADDTOENTCNT #x40045201)
+
+(define (add-to-entropy-count port-or-fd n)
+  "Add N to the kernel's entropy count (the value that can be read from
+/proc/sys/kernel/random/entropy_avail).  PORT-OR-FD must correspond to
+/dev/urandom or /dev/random.  Raise to 'system-error with EPERM when the
+caller lacks root privileges."
+  (let ((fd  (if (port? port-or-fd)
+                 (fileno port-or-fd)
+                 port-or-fd))
+        (box (make-bytevector (sizeof int))))
+    (bytevector-sint-set! box 0 n (native-endianness)
+                          (sizeof int))
+    (let-values (((ret err)
+                  (%ioctl fd RNDADDTOENTCNT
+                          (bytevector->pointer box))))
+      (unless (zero? err)
+        (throw 'system-error "add-to-entropy-count" "~A"
+               (list (strerror err))
+               (list err))))))
+
+
+;;;
 ;;; Containers.
 ;;;
 
diff --git a/tests/syscalls.scm b/tests/syscalls.scm
index eeb223b..1b3121e 100644
--- a/tests/syscalls.scm
+++ b/tests/syscalls.scm
@@ -567,6 +567,19 @@
   (let ((result (call-with-input-file "/var/run/utmpx" read-utmpx)))
     (or (utmpx? result) (eof-object? result))))
 
+(when (zero? (getuid))
+  (test-skip 1))
+(test-equal "add-to-entropy-count"
+  EPERM
+  (call-with-output-file "/dev/urandom"
+    (lambda (port)
+      (catch 'system-error
+        (lambda ()
+          (add-to-entropy-count port 77)
+          #f)
+        (lambda args
+          (system-error-errno args))))))
+
 (test-end)
 
 (false-if-exception (delete-file temp-file))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]