pgrp.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #include "dat.h"
  2. #include "fns.h"
  3. #include "error.h"
  4. static Ref pgrpid;
  5. static Ref mountid;
  6. Pgrp*
  7. newpgrp(void)
  8. {
  9. Pgrp *p;
  10. p = malloc(sizeof(Pgrp));
  11. if(p == nil)
  12. error(Enomem);
  13. p->r.ref = 1;
  14. p->pgrpid = incref(&pgrpid);
  15. p->progmode = 0644;
  16. return p;
  17. }
  18. void
  19. closepgrp(Pgrp *p)
  20. {
  21. Mhead **h, **e, *f, *next;
  22. if(p == nil || decref(&p->r) != 0)
  23. return;
  24. wlock(&p->ns);
  25. p->pgrpid = -1;
  26. e = &p->mnthash[MNTHASH];
  27. for(h = p->mnthash; h < e; h++) {
  28. for(f = *h; f; f = next) {
  29. wlock(&f->lock);
  30. cclose(f->from);
  31. mountfree(f->mount);
  32. f->mount = nil;
  33. next = f->hash;
  34. wunlock(&f->lock);
  35. putmhead(f);
  36. }
  37. }
  38. wunlock(&p->ns);
  39. cclose(p->dot);
  40. cclose(p->slash);
  41. free(p);
  42. }
  43. void
  44. pgrpinsert(Mount **order, Mount *m)
  45. {
  46. Mount *f;
  47. m->order = 0;
  48. if(*order == 0) {
  49. *order = m;
  50. return;
  51. }
  52. for(f = *order; f; f = f->order) {
  53. if(m->mountid < f->mountid) {
  54. m->order = f;
  55. *order = m;
  56. return;
  57. }
  58. order = &f->order;
  59. }
  60. *order = m;
  61. }
  62. /*
  63. * pgrpcpy MUST preserve the mountid allocation order of the parent group
  64. */
  65. void
  66. pgrpcpy(Pgrp *to, Pgrp *from)
  67. {
  68. int i;
  69. Mount *n, *m, **link, *order;
  70. Mhead *f, **tom, **l, *mh;
  71. wlock(&from->ns);
  72. if(waserror()){
  73. wunlock(&from->ns);
  74. nexterror();
  75. }
  76. order = 0;
  77. tom = to->mnthash;
  78. for(i = 0; i < MNTHASH; i++) {
  79. l = tom++;
  80. for(f = from->mnthash[i]; f; f = f->hash) {
  81. rlock(&f->lock);
  82. if(waserror()){
  83. runlock(&f->lock);
  84. nexterror();
  85. }
  86. mh = malloc(sizeof(Mhead));
  87. if(mh == nil)
  88. error(Enomem);
  89. mh->from = f->from;
  90. mh->r.ref = 1;
  91. incref(&mh->from->r);
  92. *l = mh;
  93. l = &mh->hash;
  94. link = &mh->mount;
  95. for(m = f->mount; m; m = m->next) {
  96. n = newmount(mh, m->to, m->mflag, m->spec);
  97. m->copy = n;
  98. pgrpinsert(&order, m);
  99. *link = n;
  100. link = &n->next;
  101. }
  102. poperror();
  103. runlock(&f->lock);
  104. }
  105. }
  106. /*
  107. * Allocate mount ids in the same sequence as the parent group
  108. */
  109. lock(&mountid.lk);
  110. for(m = order; m; m = m->order)
  111. m->copy->mountid = mountid.ref++;
  112. unlock(&mountid.lk);
  113. to->progmode = from->progmode;
  114. to->slash = cclone(from->slash);
  115. to->dot = cclone(from->dot);
  116. to->nodevs = from->nodevs;
  117. poperror();
  118. wunlock(&from->ns);
  119. }
  120. Fgrp*
  121. newfgrp(Fgrp *old)
  122. {
  123. Fgrp *new;
  124. int n;
  125. new = malloc(sizeof(Fgrp));
  126. if(new == nil)
  127. error(Enomem);
  128. new->r.ref = 1;
  129. n = DELTAFD;
  130. if(old != nil){
  131. lock(&old->l);
  132. if(old->maxfd >= n)
  133. n = (old->maxfd+1 + DELTAFD-1)/DELTAFD * DELTAFD;
  134. new->maxfd = old->maxfd;
  135. unlock(&old->l);
  136. }
  137. new->nfd = n;
  138. new->fd = malloc(n*sizeof(Chan*));
  139. if(new->fd == nil){
  140. free(new);
  141. error(Enomem);
  142. }
  143. return new;
  144. }
  145. Fgrp*
  146. dupfgrp(Fgrp *f)
  147. {
  148. int i;
  149. Chan *c;
  150. Fgrp *new;
  151. int n;
  152. new = malloc(sizeof(Fgrp));
  153. if(new == nil)
  154. error(Enomem);
  155. new->r.ref = 1;
  156. lock(&f->l);
  157. n = DELTAFD;
  158. if(f->maxfd >= n)
  159. n = (f->maxfd+1 + DELTAFD-1)/DELTAFD * DELTAFD;
  160. new->nfd = n;
  161. new->fd = malloc(n*sizeof(Chan*));
  162. if(new->fd == nil){
  163. unlock(&f->l);
  164. free(new);
  165. error(Enomem);
  166. }
  167. new->maxfd = f->maxfd;
  168. new->minfd = f->minfd;
  169. for(i = 0; i <= f->maxfd; i++) {
  170. if(c = f->fd[i]){
  171. incref(&c->r);
  172. new->fd[i] = c;
  173. }
  174. }
  175. unlock(&f->l);
  176. return new;
  177. }
  178. void
  179. closefgrp(Fgrp *f)
  180. {
  181. int i;
  182. Chan *c;
  183. if(f != nil && decref(&f->r) == 0) {
  184. for(i = 0; i <= f->maxfd; i++)
  185. if(c = f->fd[i])
  186. cclose(c);
  187. free(f->fd);
  188. free(f);
  189. }
  190. }
  191. Mount*
  192. newmount(Mhead *mh, Chan *to, int flag, char *spec)
  193. {
  194. Mount *m;
  195. m = malloc(sizeof(Mount));
  196. if(m == nil)
  197. error(Enomem);
  198. m->to = to;
  199. m->head = mh;
  200. incref(&to->r);
  201. m->mountid = incref(&mountid);
  202. m->mflag = flag;
  203. if(spec != 0)
  204. kstrdup(&m->spec, spec);
  205. return m;
  206. }
  207. void
  208. mountfree(Mount *m)
  209. {
  210. Mount *f;
  211. while(m) {
  212. f = m->next;
  213. cclose(m->to);
  214. m->mountid = 0;
  215. free(m->spec);
  216. free(m);
  217. m = f;
  218. }
  219. }
  220. void
  221. closesigs(Skeyset *s)
  222. {
  223. int i;
  224. if(s == nil || decref(&s->r) != 0)
  225. return;
  226. for(i=0; i<s->nkey; i++)
  227. freeskey(s->keys[i]);
  228. free(s);
  229. }
  230. void
  231. freeskey(Signerkey *key)
  232. {
  233. if(key == nil || decref(&key->r) != 0)
  234. return;
  235. free(key->owner);
  236. (*key->pkfree)(key->pk);
  237. free(key);
  238. }