xref: /inferno-os/emu/port/env.c (revision 7ef44d652ae9e5e1f5b3465d73684e4a54de73c0)
1 #include	"dat.h"
2 #include	"fns.h"
3 #include	"error.h"
4 
5 Egrp*
6 newegrp(void)
7 {
8 	Egrp	*e;
9 
10 	e = smalloc(sizeof(Egrp));
11 	if (e == nil)
12 		error(Enomem);
13 	e->r.ref = 1;
14 	return e;
15 }
16 
17 void
18 closeegrp(Egrp *e)
19 {
20 	Evalue *el, *nl;
21 
22 	if(e == nil || decref(&e->r) != 0)
23 		return;
24 	for (el = e->entries; el != nil; el = nl) {
25 		free(el->var);
26 		if (el->val)
27 			free(el->val);
28 		nl = el->next;
29 		free(el);
30 	}
31 	free(e);
32 }
33 
34 void
35 egrpcpy(Egrp *to, Egrp *from)
36 {
37 	Evalue *e, *ne, **last;
38 
39 	last = &to->entries;
40 	qlock(&from->l);
41 	for (e = from->entries; e != nil; e = e->next) {
42 		ne = smalloc(sizeof(Evalue));
43 		ne->var = smalloc(strlen(e->var)+1);
44 		strcpy(ne->var, e->var);
45 		if (e->val) {
46 			ne->val = smalloc(e->len);
47 			memmove(ne->val, e->val, e->len);
48 			ne->len = e->len;
49 		}
50 		ne->qid.path = ++to->path;
51 		*last = ne;
52 		last = &ne->next;
53 	}
54 	qunlock(&from->l);
55 }
56 
57 void
58 ksetenv(char *var, char *val, int conf)
59 {
60 	Chan *c;
61 	char buf[2*KNAMELEN];
62 
63 	USED(conf);
64 	snprint(buf, sizeof(buf), "#e/%s", var);
65 	if(waserror())
66 		return;
67 	c = namec(buf, Acreate, OWRITE, 0600);
68 	poperror();
69 	if(!waserror()){
70 		if(!waserror()){
71 			devtab[c->type]->write(c, val, strlen(val), 0);
72 			poperror();
73 		}
74 		poperror();
75 	}
76 	cclose(c);
77 }
78