From 3725aedd02d9b24c1239610066dd62387ef4d5a9 Mon Sep 17 00:00:00 2001 From: dale_mellor Date: Fri, 4 Jul 2003 08:09:04 +0000 Subject: Initial version. Production quality, fully complete source but contains known bugs (lots!) --- environment.scm | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 environment.scm (limited to 'environment.scm') diff --git a/environment.scm b/environment.scm new file mode 100644 index 0000000..e4d59a8 --- /dev/null +++ b/environment.scm @@ -0,0 +1,121 @@ +;; Copyright (C) 2003 Dale Mellor +;; +;; This program 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 2, or (at your option) +;; any later version. +;; +;; This program 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 this program; if not, write to the Free Software +;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, +;; USA. + + + +;; This file defines the global variable current-environment-mods, and the +;; procedures append-environment-mods (which is available to user configuration +;; files), clear-environment-mods, modify-environment, and +;; parse-vixie-environment. The idea is that the current-environment-mods is a +;; list of pairs of environment names and values, and represents the cumulated +;; environment settings in a configuration file. When a job definition is seen +;; in a configuration file, the current-environment-mods are copied into the +;; internal job description, and when the job actually runs these environment +;; modifications are applied to the UNIX environment in which the job runs. + + + +;; The env-alist is an association list of variable names and values. Variables +;; later in the list will take precedence over variables before. We return a +;; fixed-up version in which some variables are given specific default values +;; (which the user can override), and one variable which the user is not allowed +;; to control is added at the end of the list. + +(define (impose-default-environment env-alist passwd-entry) + (append (list (cons "HOME" (passwd:dir passwd-entry)) + (cons "CWD" (passwd:dir passwd-entry)) + (cons "SHELL" (passwd:shell passwd-entry)) + '("TERM" . #f) + '("TERMCAP" . #f)) + env-alist + (list (cons "LOGNAME" (passwd:name passwd-entry)) + (cons "USER" (passwd:name passwd-entry))))) + + + + +;; Modify the UNIX environment for the current process according to the given +;; association list of variables, with the default variable values imposed. + +(define (modify-environment env-alist passwd-entry) + (for-each (lambda (variable) + (setenv (car variable) (cdr variable))) + (impose-default-environment env-alist passwd-entry))) + + + + +;; As we parse configuration files, we build up an alist of environment +;; variables here. + +(define current-environment-mods '()) + + + + +;; When we start to parse a new configuration file, we want to start with a +;; fresh environment (actually an umodified version of the pervading mcron +;; environment). + +(define (clear-environment-mods) + (set! current-environment-mods '())) + + + + +;; Procedure to add another environment setting to the alist above. This is used +;; both implicitly by the Vixie parser, and can be used directly by users in +;; scheme configuration files. The return value is purely for the convenience of +;; the parse-vixie-environment procedure below. + +(define (append-environment-mods name value) + (set! current-environment-mods (append current-environment-mods + (list (cons name value)))) + #t) + + + + +;; Procedure to act on an environment variable specification in a Vixie-style +;; configuration file, by adding an entry to the alist above. Returns #t if the +;; operation was successful, #f if the line could not be interpreted as an +;; environment specification. + +(define parse-vixie-environment-regexp1 + (make-regexp + "^[ \t]*([[:alpha:]_][[:alnum:]_]*)[ \t]*=[ \t]*\"(.*)\"[ \t]*$")) +(define parse-vixie-environment-regexp2 + (make-regexp + "^[ \t]*([[:alpha:]_][[:alnum:]_]*)[ \t]*=[ \t]*\'(.*)\'[ \t]*$")) +(define parse-vixie-environment-regexp3 + (make-regexp + "^[ \t]*([[:alpha:]_][[:alnum:]_]*)[ \t]*=[ \t]*(.*[^ \t])[ \t]*$")) +(define parse-vixie-environment-regexp4 + (make-regexp + "^[ \t]*([[:alpha:]_][[:alnum:]_]*)[ \t]*=[ \t]*$")) + +(use-modules (srfi srfi-2)) + +(define (parse-vixie-environment string) + (let ((match (or (regexp-exec parse-vixie-environment-regexp1 string) + (regexp-exec parse-vixie-environment-regexp2 string) + (regexp-exec parse-vixie-environment-regexp3 string)))) + (if match + (append-environment-mods (match:substring match 1) + (match:substring match 2)) + (and-let* ((match (regexp-exec parse-vixie-environment-regexp4 string))) + (append-environment-mods (match:substring match 1) #f))))) -- cgit v1.2.3