Postfix3.3.1
clean_env.c
[詳解]
1 /*++
2 /* NAME
3 /* clean_env 3
4 /* SUMMARY
5 /* clean up the environment
6 /* SYNOPSIS
7 /* #include <clean_env.h>
8 /*
9 /* void clean_env(preserve_list)
10 /* const char **preserve_list;
11 /*
12 /* void update_env(preserve_list)
13 /* const char **preserve_list;
14 /* DESCRIPTION
15 /* clean_env() reduces the process environment to the bare minimum.
16 /* The function takes a null-terminated list of arguments.
17 /* Each argument specifies the name of an environment variable
18 /* that should be preserved, or specifies a name=value that should
19 /* be entered into the new environment.
20 /*
21 /* update_env() applies name=value settings, but otherwise does not
22 /* change the process environment.
23 /* DIAGNOSTICS
24 /* Fatal error: out of memory.
25 /* SEE ALSO
26 /* safe_getenv(3), guarded getenv()
27 /* LICENSE
28 /* .ad
29 /* .fi
30 /* The Secure Mailer license must be distributed with this software.
31 /* AUTHOR(S)
32 /* Wietse Venema
33 /* IBM T.J. Watson Research
34 /* P.O. Box 704
35 /* Yorktown Heights, NY 10598, USA
36 /*
37 /* Wietse Venema
38 /* Google, Inc.
39 /* 111 8th Avenue
40 /* New York, NY 10011, USA
41 /*--*/
42 
43 /* System library. */
44 
45 #include <sys_defs.h>
46 #include <stdlib.h>
47 #include <unistd.h>
48 #include <string.h>
49 
50 /* Utility library. */
51 
52 #include <msg.h>
53 #include <argv.h>
54 #include <safe.h>
55 #include <clean_env.h>
56 
57 /* clean_env - clean up the environment */
58 
59 void clean_env(char **preserve_list)
60 {
61  extern char **environ;
62  ARGV *save_list;
63  char *value;
64  char **cpp;
65  char *eq;
66 
67  /*
68  * Preserve or specify selected environment variables.
69  */
70 #define STRING_AND_LENGTH(x, y) (x), (ssize_t) (y)
71 
72  save_list = argv_alloc(10);
73  for (cpp = preserve_list; *cpp; cpp++)
74  if ((eq = strchr(*cpp, '=')) != 0)
75  argv_addn(save_list, STRING_AND_LENGTH(*cpp, eq - *cpp),
76  STRING_AND_LENGTH(eq + 1, strlen(eq + 1)), (char *) 0);
77  else if ((value = safe_getenv(*cpp)) != 0)
78  argv_add(save_list, *cpp, value, (char *) 0);
79 
80  /*
81  * Truncate the process environment, if available. On some systems
82  * (Ultrix!), environ can be a null pointer.
83  */
84  if (environ)
85  environ[0] = 0;
86 
87  /*
88  * Restore preserved environment variables.
89  */
90  for (cpp = save_list->argv; *cpp; cpp += 2)
91  if (setenv(cpp[0], cpp[1], 1))
92  msg_fatal("setenv(%s, %s): %m", cpp[0], cpp[1]);
93 
94  /*
95  * Cleanup.
96  */
97  argv_free(save_list);
98 }
99 
100 /* update_env - apply name=value settings only */
101 
102 void update_env(char **preserve_list)
103 {
104  char **cpp;
105  ARGV *save_list;
106  char *eq;
107 
108  /*
109  * Extract name=value settings.
110  */
111  save_list = argv_alloc(10);
112  for (cpp = preserve_list; *cpp; cpp++)
113  if ((eq = strchr(*cpp, '=')) != 0)
114  argv_addn(save_list, STRING_AND_LENGTH(*cpp, eq - *cpp),
115  STRING_AND_LENGTH(eq + 1, strlen(eq + 1)), (char *) 0);
116 
117  /*
118  * Apply name=value settings.
119  */
120  for (cpp = save_list->argv; *cpp; cpp += 2)
121  if (setenv(cpp[0], cpp[1], 1))
122  msg_fatal("setenv(%s, %s): %m", cpp[0], cpp[1]);
123 
124  /*
125  * Cleanup.
126  */
127  argv_free(save_list);
128 }
ARGV * argv_free(ARGV *argvp)
Definition: argv.c:136
Definition: argv.h:17
char ** argv
Definition: argv.h:20
void argv_add(ARGV *argvp,...)
Definition: argv.c:197
ARGV * argv_alloc(ssize_t len)
Definition: argv.c:149
void clean_env(char **preserve_list)
Definition: clean_env.c:59
#define STRING_AND_LENGTH(x, y)
void argv_addn(ARGV *argvp,...)
Definition: argv.c:219
char * safe_getenv(const char *)
Definition: safe_getenv.c:38
NORETURN msg_fatal(const char *fmt,...)
Definition: msg.c:249
void update_env(char **preserve_list)
Definition: clean_env.c:102