|
|
1.1 root 1: /*
2: * Change or add value to environment.
3: *
4: * $Log: putenv.c,v $
5: * Revision 1.3 93/02/10 16:53:40 bin
6: * *** empty log message ***
7: *
8: * 87/02/05 Allan Cornish
9: * Initial revision.
10: */
11: #include <stdio.h>
12: #include <errno.h>
13:
14: /**
15: *
16: * int
17: * putenv( s ) - change or add value to environment
18: * char * s;
19: *
20: * Input: s = pointer to string of the form 'NAME=value'
21: *
22: * Action: The function putenv makes the value of the environment
23: * variable 'name' equal to 'value' by altering an existing
24: * variable or creating a new one. In either case, the string
25: * created by 'string' becomes part of the environment,
26: * so altering the string will change the environment.
27: * The space used by string is no longer used once a new
28: * string-defining name is passed to the function putenv.
29: *
30: * Return: 0 = environment updated.
31: * * = insufficient memory, or invalid argument.
32: *
33: * Notes: The third argument to main [envp] is not changed.
34: */
35:
36: int
37: putenv( string )
38: char * string;
39: {
40: register char **epp;
41: register int len;
42: static char ** lastenv;
43: extern char ** environ;
44:
45: /*
46: * Paranoia.
47: */
48: if ( string == NULL ) {
49: errno = EFAULT;
50: return -1;
51: }
52:
53: /*
54: * Validate string, which must be of form NAME=value.
55: */
56: for ( len = 0; string[len] != '='; len++ ) {
57: if ( string[len] == '\0' ) {
58: errno = EINVAL;
59: return -1;
60: }
61: }
62:
63: /*
64: * Update len to include the '='.
65: */
66: len++;
67:
68: /*
69: * Search for existing value.
70: */
71: for ( epp = environ; *epp != NULL; epp++ ) {
72:
73: /*
74: * Variable already in environment.
75: */
76: if ( strncmp( string, *epp, len ) == 0 ) {
77:
78: /*
79: * Update environment.
80: * NOTE: should release previous value if malloc'ed.
81: */
82: *epp = string;
83: return 0;
84: }
85: }
86:
87: /*
88: * Allocate new environment array.
89: */
90: len = (epp - environ + 2) * sizeof(*epp);
91: if ( (epp = malloc(len)) == NULL ) {
92: errno = ENOMEM;
93: return -1;
94: }
95:
96: /*
97: * Copy old environment to new environment.
98: */
99: len = 0;
100: while ( epp[len] = environ[len] )
101: len++;
102:
103: /*
104: * Append new variable and NULL terminator.
105: */
106: epp[len++] = string;
107: epp[len++] = NULL;
108:
109: /*
110: * Release last malloc'ed environment array.
111: */
112: if ( lastenv != NULL )
113: free( lastenv );
114:
115: /*
116: * Install new environment.
117: */
118: environ = epp;
119: lastenv = epp;
120:
121: return 0;
122: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.