env.c 1.2 KB

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