exporter.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <u.h>
  2. #include <libc.h>
  3. #include "compat.h"
  4. typedef struct Exporter Exporter;
  5. struct Exporter
  6. {
  7. int fd;
  8. Chan **roots;
  9. int nroots;
  10. };
  11. int
  12. mounter(char *mntpt, int how, int fd, int n)
  13. {
  14. char buf[32];
  15. int i, ok, mfd;
  16. ok = 1;
  17. for(i = 0; i < n; i++){
  18. snprint(buf, sizeof buf, "%d", i);
  19. mfd = dup(fd, -1);
  20. if(mount(mfd, -1, mntpt, how, buf) == -1){
  21. close(mfd);
  22. fprint(2, "can't mount on %s: %r\n", mntpt);
  23. ok = 0;
  24. break;
  25. }
  26. close(mfd);
  27. if(how == MREPL)
  28. how = MAFTER;
  29. }
  30. close(fd);
  31. return ok;
  32. }
  33. static void
  34. extramp(void *v)
  35. {
  36. Exporter *ex;
  37. rfork(RFNAMEG);
  38. ex = v;
  39. sysexport(ex->fd, ex->roots, ex->nroots);
  40. shutdown();
  41. exits(nil);
  42. }
  43. int
  44. exporter(Dev **dt, int *fd, int *sfd)
  45. {
  46. Chan **roots;
  47. Exporter ex;
  48. int p[2], i, n, ed;
  49. for(n = 0; dt[n] != nil; n++)
  50. ;
  51. if(!n){
  52. werrstr("no devices specified");
  53. return 0;
  54. }
  55. ed = errdepth(-1);
  56. if(waserror()){
  57. werrstr(up->error);
  58. return 0;
  59. }
  60. roots = smalloc(n * sizeof *roots);
  61. for(i = 0; i < n; i++){
  62. (*dt[i]->reset)();
  63. (*dt[i]->init)();
  64. roots[i] = (*dt[i]->attach)("");
  65. }
  66. poperror();
  67. errdepth(ed);
  68. if(pipe(p) < 0){
  69. werrstr("can't make pipe: %r");
  70. return 0;
  71. }
  72. *sfd = p[0];
  73. *fd = p[1];
  74. ex.fd = *sfd;
  75. ex.roots = roots;
  76. ex.nroots = n;
  77. kproc("exporter", extramp, &ex);
  78. return n;
  79. }