83 lines
1.8 KiB
Plaintext
83 lines
1.8 KiB
Plaintext
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");
|
|
}
|