;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; bash-utils.scm ;; Copyright (C) 2025 Cor Legemaat ;; ;; This file is part of ebuild-autogen: you can redistribute it and/or modify it ;; under the terms of the GNU Affero General Public License as published by the ;; Free Software Foundation, version 3 of the License. ;; ;; ebuild-autogen is distributed in the hope that it will be useful, but WITHOUT ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ;; more details. ;; ;; You should have received a copy of the GNU General Public License along with ;; ebuild-autogen. If not, see . ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-module (ebuild bash-utils) #:use-module (rnrs io ports) #:use-module (ice-9 expect) #:use-module (ice-9 popen) #:use-module (ice-9 rdelim)) (define-public bash-source-vars (lambda (source var-list) "" (let* ((in-pipe (pipe)) (out-pipe (pipe O_NONBLOCK)) (pid (spawn "bash" '("bash") #:input (car in-pipe) #:output (cdr out-pipe))) (answ '()) (expect-port (car out-pipe)) (expect-timeout 1)) ;; Make line buffered. (setvbuf (cdr in-pipe) 'line) (setvbuf (cdr out-pipe) 'line) ;; Do the sourcing stuff. (write-line source (cdr in-pipe)) ;; Eliminate extra data to stdout from sourcing. (write-line "echo \"Done sourcing!\"" (cdr in-pipe)) (expect ((lambda (s eof?) (string=? s "Done sourcing!\n")) (lambda () #t))) ;; Read the variables. (set! answ (map (lambda (var) (write-line (string-append "echo \"${" var "}\"") (cdr in-pipe)) (cons var (get-line (car out-pipe)))) var-list)) ;; Tel bash to exit. (write-line "exit 0" (cdr in-pipe)) ;; Close my side of the pipes (close-port (car in-pipe)) (close-port (cdr out-pipe)) ;; Close bash's side of the pipes. (close-port (cdr in-pipe)) (close-port (car out-pipe)) ;; Finish. (waitpid pid) answ)))