~ruther/guix-local

b4abdeb63b4e29f89a0a8e54f7b442bb31da87c9 — David Thompson 10 years ago b16d138
build: syscalls: Add mkdtemp!

* guix/build/syscalls.scm (mkdtemp!): New procedure.
* tests/syscalls.scm ("mkdtemp!"): New test.
2 files changed, 24 insertions(+), 0 deletions(-)

M guix/build/syscalls.scm
M tests/syscalls.scm
M guix/build/syscalls.scm => guix/build/syscalls.scm +15 -0
@@ 45,6 45,7 @@
            swapon
            swapoff
            processes
            mkdtemp!

            IFF_UP
            IFF_BROADCAST


@@ 265,6 266,20 @@ user-land process."
                    (scandir "/proc"))
        <))

(define mkdtemp!
  (let* ((ptr  (dynamic-func "mkdtemp" (dynamic-link)))
         (proc (pointer->procedure '* ptr '(*))))
    (lambda (tmpl)
      "Create a new unique directory in the file system using the template
string TMPL and return its file name.  TMPL must end with 'XXXXXX'."
      (let ((result (proc (string->pointer tmpl)))
            (err    (errno)))
        (when (null-pointer? result)
          (throw 'system-error "mkdtemp!" "~S: ~A"
                 (list tmpl (strerror err))
                 (list err)))
        (pointer->string result)))))


;;;
;;; Packed structures.

M tests/syscalls.scm => tests/syscalls.scm +9 -0
@@ 1,5 1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2015 David Thompson <davet@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 67,6 68,14 @@
    (lambda args
      (memv (system-error-errno args) (list EPERM EINVAL ENOENT)))))

(test-assert "mkdtemp!"
  (let* ((tmp (or (getenv "TMPDIR") "/tmp"))
         (dir (mkdtemp! (string-append tmp "/guix-test-XXXXXX"))))
    (and (file-exists? dir)
         (begin
           (rmdir dir)
           #t))))

(test-assert "all-network-interfaces"
  (match (all-network-interfaces)
    (((? string? names) ..1)