SummaryRefsLogTreeCommitDiffStats
path: root/environment.scm
blob: e4d59a86799f316aba7ea1abf7a7dc03bed8929c (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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)))))