105 lines
3.8 KiB
Scheme
105 lines
3.8 KiB
Scheme
;; 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 variable current-environment-mods, and the procedures
|
|
;; append-environment-mods (which is available to user configuration files),
|
|
;; clear-environment-mods and modify-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.
|
|
|
|
|
|
|
|
|
|
(define-module (mcron environment)
|
|
#:export (modify-environment
|
|
clear-environment-mods
|
|
append-environment-mods
|
|
get-current-environment-mods-copy))
|
|
|
|
|
|
|
|
|
|
;; 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 two variables which the user is not
|
|
;; allowed to control are added at the end of the list.
|
|
|
|
(define (impose-default-environment env-alist passwd-entry)
|
|
(append `(("HOME" . ,(passwd:dir passwd-entry))
|
|
("CWD" . ,(passwd:dir passwd-entry))
|
|
("SHELL" . ,(passwd:shell passwd-entry))
|
|
("TERM" . #f)
|
|
("TERMCAP" . #f))
|
|
env-alist
|
|
`(("LOGNAME" . ,(passwd:name passwd-entry))
|
|
("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 '())
|
|
|
|
|
|
|
|
;; Each time a job is added to the system, we take a snapshot of the current
|
|
;; set of environment modifiers.
|
|
|
|
(define (get-current-environment-mods-copy)
|
|
(list-copy 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 in the vixie-specification module
|
|
;; (yuk).
|
|
|
|
(define (append-environment-mods name value)
|
|
(set! current-environment-mods (append current-environment-mods
|
|
(list (cons name value))))
|
|
#t)
|