From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39110) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cw1Lx-0002GT-D2 for guix-patches@gnu.org; Thu, 06 Apr 2017 02:57:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cw1Lq-0004oA-As for guix-patches@gnu.org; Thu, 06 Apr 2017 02:57:09 -0400 Received: from debbugs.gnu.org ([208.118.235.43]:36164) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cw1Lq-0004nP-6k for guix-patches@gnu.org; Thu, 06 Apr 2017 02:57:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1cw1Lp-0002AR-Rs for guix-patches@gnu.org; Thu, 06 Apr 2017 02:57:01 -0400 Subject: bug#26341: [PATCH 1/2] build: syscalls: Allow mount and umount use from static Guile. References: <20170402150157.7149-1-m.othacehe@gmail.com> In-Reply-To: <20170402150157.7149-1-m.othacehe@gmail.com> Resent-Message-ID: From: Mathieu Othacehe Date: Thu, 6 Apr 2017 08:55:44 +0200 Message-Id: <20170406065545.20624-1-m.othacehe@gmail.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: 26341@debbugs.gnu.org * guix/build/syscalls.scm (mount): Use Guile core mount if called from static Guile, otherwise use FFI based mount implementation. (umount): Ditto. This allows to use (guix build syscalls) from a module independently of calling context. --- guix/build/syscalls.scm | 86 +++++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm index 5aae1530f..4bcb2a871 100644 --- a/guix/build/syscalls.scm +++ b/guix/build/syscalls.scm @@ -462,47 +462,57 @@ the returned procedure is called." (define UMOUNT_NOFOLLOW 8) (define mount - (let ((proc (syscall->procedure int "mount" `(* * * ,unsigned-long *)))) - (lambda* (source target type #:optional (flags 0) options - #:key (update-mtab? #f)) - "Mount device SOURCE on TARGET as a file system TYPE. Optionally, FLAGS -may be a bitwise-or of the MS_* constants, and OPTIONS may be a -string. When FLAGS contains MS_REMOUNT, SOURCE and TYPE are ignored. When -UPDATE-MTAB? is true, update /etc/mtab. Raise a 'system-error' exception on -error." - (let-values (((ret err) - (proc (if source - (string->pointer source) - %null-pointer) - (string->pointer target) - (if type - (string->pointer type) - %null-pointer) - flags - (if options - (string->pointer options) - %null-pointer)))) - (unless (zero? ret) - (throw 'system-error "mount" "mount ~S on ~S: ~A" - (list source target (strerror err)) - (list err))) - (when update-mtab? - (augment-mtab source target type options)))))) + ;; If called from the statically linked Guile, use Guile core 'mount'. + ;; Otherwise, use an FFI binding to define 'mount'. + ;; XXX: '#:update-mtab?' is not implemented by core 'mount'. + (if (module-defined? the-scm-module 'mount) + (module-ref the-scm-module 'mount) + (let ((proc (syscall->procedure int "mount" `(* * * ,unsigned-long *)))) + (lambda* (source target type #:optional (flags 0) options + #:key (update-mtab? #f)) + "Mount device SOURCE on TARGET as a file system TYPE. +Optionally, FLAGS may be a bitwise-or of the MS_* +constants, and OPTIONS may be a string. When FLAGS contains +MS_REMOUNT, SOURCE and TYPE are ignored. When UPDATE-MTAB? is true, +update /etc/mtab. Raise a 'system-error' exception on error." + (let-values (((ret err) + (proc (if source + (string->pointer source) + %null-pointer) + (string->pointer target) + (if type + (string->pointer type) + %null-pointer) + flags + (if options + (string->pointer options) + %null-pointer)))) + (unless (zero? ret) + (throw 'system-error "mount" "mount ~S on ~S: ~A" + (list source target (strerror err)) + (list err))) + (when update-mtab? + (augment-mtab source target type options))))))) (define umount - (let ((proc (syscall->procedure int "umount2" `(* ,int)))) - (lambda* (target #:optional (flags 0) - #:key (update-mtab? #f)) - "Unmount TARGET. Optionally FLAGS may be one of the MNT_* or UMOUNT_* + ;; If called from the statically linked Guile, use Guile core 'umount'. + ;; Otherwise, use an FFI binding to define 'umount'. + ;; XXX: '#:update-mtab?' is not implemented by core 'umount'. + (if (module-defined? the-scm-module 'umount) + (module-ref the-scm-module 'umount) + (let ((proc (syscall->procedure int "umount2" `(* ,int)))) + (lambda* (target #:optional (flags 0) + #:key (update-mtab? #f)) + "Unmount TARGET. Optionally FLAGS may be one of the MNT_* or UMOUNT_* constants from ." - (let-values (((ret err) - (proc (string->pointer target) flags))) - (unless (zero? ret) - (throw 'system-error "umount" "~S: ~A" - (list target (strerror err)) - (list err))) - (when update-mtab? - (remove-from-mtab target)))))) + (let-values (((ret err) + (proc (string->pointer target) flags))) + (unless (zero? ret) + (throw 'system-error "umount" "~S: ~A" + (list target (strerror err)) + (list err))) + (when update-mtab? + (remove-from-mtab target))))))) (define (mount-points) "Return the mounts points for currently mounted file systems." -- 2.12.2