]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/9sys/getenv.c
merge
[plan9front.git] / sys / src / libc / 9sys / getenv.c
1 #include <u.h>
2 #include <libc.h>
3
4 char*
5 getenv(char *name)
6 {
7         enum { HUNK = 100, };
8         char *s, *p;
9         int f, r, n;
10
11         if(name[0]=='\0' || strcmp(name, ".")==0 || strcmp(name, "..")==0 || strchr(name, '/')!=nil
12         || strlen(name) >= HUNK-5){
13                 werrstr("bad env name: %s", name);
14                 return nil;
15         }
16         if((s = malloc(HUNK)) == nil)
17                 return nil;
18         snprint(s, HUNK, "/env/%s", name);
19         n = 0;
20         r = -1;
21         f = open(s, OREAD|OCEXEC);
22         if(f >= 0){
23                 while((r = read(f, s+n, HUNK)) > 0){
24                         n += r;
25                         r = -1;
26                         if((p = realloc(s, n+HUNK)) == nil)
27                                 break;
28                         s = p;
29                 }
30                 close(f);
31         }
32         if(r < 0 || (p = realloc(s, n+1)) == nil){
33                 free(s);
34                 return nil;
35         }
36         s = p;
37         setmalloctag(s, getcallerpc(&name));
38         while(n > 0 && s[n-1] == '\0')
39                 n--;
40         s[n] = '\0';
41         while(--n >= 0){
42                 if(s[n] == '\0')
43                         s[n] = ' ';
44         }
45         return s;
46 }