Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/heimdal/appl/login/env.c
96309 views
1
/*
2
* Copyright (c) 2000 Kungliga Tekniska Högskolan
3
* (Royal Institute of Technology, Stockholm, Sweden).
4
* All rights reserved.
5
*
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
8
* are met:
9
*
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
*
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
16
*
17
* 3. Neither the name of the Institute nor the names of its contributors
18
* may be used to endorse or promote products derived from this software
19
* without specific prior written permission.
20
*
21
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
* SUCH DAMAGE.
32
*/
33
34
#include "login_locl.h"
35
RCSID("$Id$");
36
37
/*
38
* the environment we will send to execle and the shell.
39
*/
40
41
char **env;
42
int num_env;
43
44
void
45
extend_env(char *str)
46
{
47
env = realloc(env, (num_env + 1) * sizeof(*env));
48
if(env == NULL)
49
errx(1, "Out of memory!");
50
env[num_env++] = str;
51
}
52
53
void
54
add_env(const char *var, const char *value)
55
{
56
int i;
57
char *str;
58
asprintf(&str, "%s=%s", var, value);
59
if(str == NULL)
60
errx(1, "Out of memory!");
61
for(i = 0; i < num_env; i++)
62
if(strncmp(env[i], var, strlen(var)) == 0 &&
63
env[i][strlen(var)] == '='){
64
free(env[i]);
65
env[i] = str;
66
return;
67
}
68
69
extend_env(str);
70
}
71
72
#if !HAVE_DECL_ENVIRON
73
extern char **environ;
74
#endif
75
76
77
void
78
copy_env(void)
79
{
80
char **p;
81
for(p = environ; *p; p++)
82
extend_env(*p);
83
}
84
85
void
86
login_read_env(const char *file)
87
{
88
char **newenv;
89
char *p;
90
int i, j;
91
92
newenv = NULL;
93
i = read_environment(file, &newenv);
94
for (j = 0; j < i; j++) {
95
p = strchr(newenv[j], '=');
96
if (p == NULL)
97
errx(1, "%s: missing = in string %s",
98
file, newenv[j]);
99
*p++ = 0;
100
add_env(newenv[j], p);
101
*--p = '=';
102
free(newenv[j]);
103
}
104
free(newenv);
105
}
106
107