SummaryRefsLogTreeCommitDiffStats
path: root/environment.scm
diff options
context:
space:
mode:
Diffstat (limited to 'environment.scm')
-rw-r--r--environment.scm121
1 files changed, 121 insertions, 0 deletions
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)))))