| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- process main {
- call("dbus_start", {{"--session", "--nopidfile"}}) dbus_start;
- println("Got dbus: ", dbus_start.dbus_address);
- rprintln("Lost dbus");
- }
- template dbus_start {
- alias("_arg0") dbus_args;
- var("false") retrying;
- backtrack_point() retry_point;
- If (retrying) {
- println("dbus_start: retrying in one second");
- sleep("1000", "0");
- };
- retrying->set("true");
- listfrom({"/usr/bin/dbus-daemon"}, dbus_args, {"--print-address"}) dbus_command;
- sys.start_process(dbus_command, "r") proc;
- If (proc.is_error) {
- println("dbus_start: error starting process");
- retry_point->go();
- };
- var("") dbus_address;
- blocker() finished_blocker;
- process_manager() mgr;
- mgr->start("dbus_start__waiter", {});
- mgr->start("dbus_start__reader", {});
- finished_blocker->use();
- }
- template dbus_start__waiter {
- alias("_caller.proc") proc;
- alias("_caller.retry_point") retry_point;
- proc->wait();
- println("dbus_start: process terminated");
- retry_point->go();
- }
- template dbus_start__reader {
- alias("_caller.proc") proc;
- alias("_caller.retry_point") retry_point;
- alias("_caller.dbus_address") dbus_address;
- alias("_caller.finished_blocker") finished_blocker;
- proc->read_pipe() rpipe;
- If (rpipe.is_error) {
- println("dbus_start: read pipe error");
- retry_point->go();
- };
- value("") buffer;
- backtrack_point() read_point;
- rpipe->read() data;
- If (data.not_eof) {
- buffer->append(data);
- explode("\n", buffer, "2") exp;
- value(exp) exp;
- num_greater(exp.length, "1") found;
- If (found) {
- exp->get("0") address;
- dbus_address->set(address);
- finished_blocker->up();
- };
- read_point->go();
- };
- println("dbus_start: read pipe eof");
- }
|