mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-02-03 06:00:34 -08:00
45 lines
1.5 KiB
Common Lisp
45 lines
1.5 KiB
Common Lisp
;;;; -*- Mode: Lisp; Syntax: Common-Lisp; Package: SYSTEM -*-
|
|
;;;;
|
|
;;;; PROCESS.LSP -- External processes
|
|
|
|
;;;; Copyright (c) 2003, Juan Jose Garcia-Ripoll
|
|
;;;;
|
|
;;;; This program is free software; you can redistribute it and/or
|
|
;;;; modify it under the terms of the GNU Library General Public
|
|
;;;; License as published by the Free Software Foundation; either
|
|
;;;; version 2 of the License, or (at your option) any later version.
|
|
;;;;
|
|
;;;; See file '../Copyright' for full details.
|
|
|
|
(in-package "EXT")
|
|
|
|
(defstruct (external-process (:constructor make-external-process ()))
|
|
pid
|
|
input
|
|
output
|
|
(%status :running)
|
|
(%code nil))
|
|
|
|
(defun external-process-status (external-process)
|
|
(let ((status (external-process-%status external-process)))
|
|
(if (eq status :running)
|
|
(ext:external-process-wait external-process nil)
|
|
(values status (external-process-%code external-process)))))
|
|
|
|
;;;
|
|
;;; Backwards compatible SI:SYSTEM call. We avoid ANSI C system()
|
|
;;; because we are consuming the process wait status using a SIGCHLD
|
|
;;; handler -- this breaks some C libraries out there (OS X 32 bit).
|
|
;;;
|
|
(defun system (cmd-string)
|
|
(let ((shell (getenv "SHELL"))
|
|
(option "-c"))
|
|
#+windows
|
|
(let ((comspec (getenv "ComSpec")))
|
|
(when comspec
|
|
(setf shell comspec
|
|
option "/c")))
|
|
(nth-value 1 (run-program shell (list option cmd-string)
|
|
:wait t :output t :input t
|
|
:error t))))
|
|
|