_post.c 843 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <fcall.h>
  4. #include <thread.h>
  5. #include <9p.h>
  6. #include <auth.h>
  7. #include "post.h"
  8. Postcrud*
  9. _post1(Srv *s, char *name, char *mtpt, int flag)
  10. {
  11. Postcrud *p;
  12. p = emalloc9p(sizeof *p);
  13. if(!s->nopipe){
  14. if(pipe(p->fd) < 0)
  15. sysfatal("pipe: %r");
  16. s->infd = s->outfd = p->fd[1];
  17. s->srvfd = p->fd[0];
  18. }
  19. if(name)
  20. if(postfd(name, s->srvfd) < 0)
  21. sysfatal("postfd %s: %r", name);
  22. p->s = s;
  23. p->mtpt = mtpt;
  24. p->flag = flag;
  25. return p;
  26. }
  27. void
  28. _post2(void *v)
  29. {
  30. Srv *s;
  31. s = v;
  32. rfork(RFNOTEG);
  33. rendezvous((ulong)s, 0);
  34. close(s->srvfd);
  35. srv(s);
  36. }
  37. void
  38. _post3(Postcrud *p)
  39. {
  40. rfork(RFFDG);
  41. rendezvous((ulong)p->s, 0);
  42. close(p->s->infd);
  43. if(p->mtpt){
  44. if(amount(p->s->srvfd, p->mtpt, p->flag, "") == -1)
  45. sysfatal("mount %s: %r", p->mtpt);
  46. }else
  47. close(p->s->srvfd);
  48. free(p);
  49. }