main.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <thread.h>
  4. #include <fcall.h>
  5. #include "playlist.h"
  6. int debug;
  7. char *user;
  8. int srvfd[2];
  9. int aflag;
  10. void
  11. usage(void)
  12. {
  13. sysfatal("usage: %s [-d bitmask] [-s] [-m mountpoint]", argv0);
  14. }
  15. void
  16. post(char *name, int sfd)
  17. {
  18. int fd;
  19. char buf[32];
  20. fd = create(name, OWRITE, 0666);
  21. if(fd < 0)
  22. return;
  23. sprint(buf, "%d", sfd);
  24. if(write(fd, buf, strlen(buf)) != strlen(buf))
  25. sysfatal("srv write: %r");
  26. close(fd);
  27. }
  28. void
  29. threadmain(int argc, char *argv[])
  30. {
  31. char *srvfile;
  32. char *srvpost;
  33. char *mntpt;
  34. int i;
  35. mntpt = "/mnt";
  36. srvpost = nil;
  37. rfork(RFNOTEG);
  38. ARGBEGIN{
  39. case 'a':
  40. aflag = 1;
  41. break;
  42. case 'm':
  43. mntpt = ARGF();
  44. break;
  45. case 'd':
  46. debug = strtoul(ARGF(), nil, 0);
  47. break;
  48. case 's':
  49. srvpost = ARGF();
  50. break;
  51. default:
  52. usage();
  53. }ARGEND
  54. user = strdup(getuser());
  55. quotefmtinstall();
  56. if(debug)
  57. fmtinstall('F', fcallfmt);
  58. volumechan = chancreate(sizeof(volume), 1);
  59. playchan = chancreate(sizeof(Wmsg), 1);
  60. playlistreq = chancreate(sizeof(Wmsg), 0); /* No storage! requires rendez-vous */
  61. workers = chancreate(sizeof(Worker*), 256);
  62. for(i = 1; i < Nqid; i++)
  63. files[i].workers = chancreate(sizeof(Worker*), 256);
  64. if(pipe(srvfd) < 0)
  65. sysfatal("pipe failed: %r");
  66. procrfork(srv, nil, 8192, RFFDG);
  67. close(srvfd[0]); /* don't deadlock if child fails */
  68. procrfork(volumeproc, nil, 8192, RFFDG);
  69. playinit();
  70. if(srvpost){
  71. srvfile = smprint("/srv/playlist.%s", srvpost);
  72. remove(srvfile);
  73. post(srvfile, srvfd[1]);
  74. free(srvfile);
  75. }
  76. if(mount(srvfd[1], -1, mntpt, MBEFORE, "") < 0)
  77. sysfatal("mount failed: %r");
  78. threadexits(nil);
  79. }