badvpn/ncd/examples/dbus_start.ncd
2012-12-02 13:04:27 +00:00

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");
}