From 2543ecd2bb6816caac8930c319661f1b3a64f6be Mon Sep 17 00:00:00 2001 From: Timothy Sample Date: Tue, 4 Dec 2018 12:48:15 -0500 Subject: [PATCH] Add the exec built-in * geesh/built-ins/exec.scm: New file. * Makefile.am: Add it. * geesh/built-ins.scm (*special-built-ins*): Add exec. --- Makefile.am | 1 + geesh/built-ins.scm | 2 +- geesh/built-ins/exec.scm | 49 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 geesh/built-ins/exec.scm diff --git a/Makefile.am b/Makefile.am index a3ee5cc..e0d165c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -48,6 +48,7 @@ MODULES = \ geesh/built-ins/dot.scm \ geesh/built-ins/echo.scm \ geesh/built-ins/eval.scm \ + geesh/built-ins/exec.scm \ geesh/built-ins/export.scm \ geesh/built-ins/false.scm \ geesh/built-ins/pwd.scm \ diff --git a/geesh/built-ins.scm b/geesh/built-ins.scm index 9de65b7..258d3d6 100644 --- a/geesh/built-ins.scm +++ b/geesh/built-ins.scm @@ -37,7 +37,7 @@ ("break" . ,(@@ (geesh built-ins break) main)) ("continue" . ,(@@ (geesh built-ins continue) main)) ("eval" . ,(@@ (geesh built-ins eval) main)) - ("exec" . ,undefined) + ("exec" . ,(@@ (geesh built-ins exec) main)) ("exit" . ,undefined) ("export" . ,(@@ (geesh built-ins export) main)) ("readonly" . ,(@@ (geesh built-ins readonly) main)) diff --git a/geesh/built-ins/exec.scm b/geesh/built-ins/exec.scm new file mode 100644 index 0000000..444095c --- /dev/null +++ b/geesh/built-ins/exec.scm @@ -0,0 +1,49 @@ +;;; The Geesh Shell Interpreter +;;; Copyright 2018 Timothy Sample +;;; +;;; This file is part of Geesh. +;;; +;;; Geesh is free software: you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation, either version 3 of the License, or +;;; (at your option) any later version. +;;; +;;; Geesh 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 Geesh. If not, see . + +(define-module (geesh built-ins exec) + #:use-module (geesh environment) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1)) + +;;; Commentary: +;;; +;;; The 'exec' utility. +;;; +;;; Code: + +(define (main . args) + (match args + ((name . args) + (flush-all-ports) + (with-environ (get-environ) + (lambda () + (catch 'system-error + (lambda () + (apply execlp name name args) + EXIT_SUCCESS) + (lambda args + (format (current-error-port) + "~a: exec: ~a: ~a.~%" + (car (program-arguments)) name + (strerror (system-error-errno args))) + EXIT_FAILURE))))) + (_ (format (current-error-port) + "~a: exec: Invalid options ~s.~%" + (car (program-arguments)) args) + EXIT_FAILURE)))