dbus_start.ncd 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. process main {
  2. call("dbus_start", {{"--session", "--nopidfile"}}) dbus_start;
  3. println("Got dbus: ", dbus_start.dbus_address);
  4. rprintln("Lost dbus");
  5. }
  6. template dbus_start {
  7. alias("_arg0") dbus_args;
  8. var("false") retrying;
  9. backtrack_point() retry_point;
  10. If (retrying) {
  11. println("dbus_start: retrying in one second");
  12. sleep("1000", "0");
  13. };
  14. retrying->set("true");
  15. listfrom({"/usr/bin/dbus-daemon"}, dbus_args, {"--print-address"}) dbus_command;
  16. sys.start_process(dbus_command, "r") proc;
  17. If (proc.is_error) {
  18. println("dbus_start: error starting process");
  19. retry_point->go();
  20. };
  21. var("") dbus_address;
  22. blocker() finished_blocker;
  23. process_manager() mgr;
  24. mgr->start("dbus_start__waiter", {});
  25. mgr->start("dbus_start__reader", {});
  26. finished_blocker->use();
  27. }
  28. template dbus_start__waiter {
  29. alias("_caller.proc") proc;
  30. alias("_caller.retry_point") retry_point;
  31. proc->wait();
  32. println("dbus_start: process terminated");
  33. retry_point->go();
  34. }
  35. template dbus_start__reader {
  36. alias("_caller.proc") proc;
  37. alias("_caller.retry_point") retry_point;
  38. alias("_caller.dbus_address") dbus_address;
  39. alias("_caller.finished_blocker") finished_blocker;
  40. proc->read_pipe() rpipe;
  41. If (rpipe.is_error) {
  42. println("dbus_start: read pipe error");
  43. retry_point->go();
  44. };
  45. value("") buffer;
  46. backtrack_point() read_point;
  47. rpipe->read() data;
  48. If (data.not_eof) {
  49. buffer->append(data);
  50. explode("\n", buffer, "2") exp;
  51. value(exp) exp;
  52. num_greater(exp.length, "1") found;
  53. If (found) {
  54. exp->get("0") address;
  55. dbus_address->set(address);
  56. finished_blocker->up();
  57. };
  58. read_point->go();
  59. };
  60. println("dbus_start: read pipe eof");
  61. }