summaryrefslogtreecommitdiff
path: root/guix/build/syscalls.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2017-01-19 23:20:57 +0100
committerLudovic Courtès <ludo@gnu.org>2017-01-19 23:20:57 +0100
commit57f068bec5349e250ce321262609ca8978a81f7f (patch)
tree1b8cb3772077a6e389614af6f93de883c60c7549 /guix/build/syscalls.scm
parent0691c9c05daf451c7e998ed08cb200a1b417274e (diff)
downloadgnu-guix-57f068bec5349e250ce321262609ca8978a81f7f.tar
gnu-guix-57f068bec5349e250ce321262609ca8978a81f7f.tar.gz
syscalls: Extract 'bytes->string'.
* guix/build/syscalls.scm (bytes->string): New procedure. (bytevector->string-list): Use it.
Diffstat (limited to 'guix/build/syscalls.scm')
-rw-r--r--guix/build/syscalls.scm13
1 files changed, 10 insertions, 3 deletions
diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm
index 2e37846ff0..c06013cd08 100644
--- a/guix/build/syscalls.scm
+++ b/guix/build/syscalls.scm
@@ -900,6 +900,15 @@ bytevector BV at INDEX."
;; The most terrible interface, live from Scheme.
(syscall->procedure int "ioctl" (list int unsigned-long '*)))
+(define (bytes->string bytes)
+ "Read BYTES, a list of bytes, and return the null-terminated string decoded
+from there, or #f if that would be an empty string."
+ (match (take-while (negate zero?) bytes)
+ (()
+ #f)
+ (non-zero
+ (list->string (map integer->char non-zero)))))
+
(define (bytevector->string-list bv stride len)
"Return the null-terminated strings found in BV every STRIDE bytes. Read at
most LEN bytes from BV."
@@ -911,9 +920,7 @@ most LEN bytes from BV."
(reverse result))
(_
(loop (drop bytes stride)
- (cons (list->string (map integer->char
- (take-while (negate zero?) bytes)))
- result))))))
+ (cons (bytes->string bytes) result))))))
(define* (network-interface-names #:optional sock)
"Return the names of existing network interfaces. This is typically limited