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