static void close_handler(int err, const struct sip_msg *msg, const struct sipevent_substate *substate, void *arg) { struct presence *pres = arg; uint32_t wait; pres->sub = mem_deref(pres->sub); info("presence: subscriber closed <%r>: ", &contact_addr(pres->contact)->auri); if (substate) { info("%s", sipevent_reason_name(substate->reason)); wait = wait_term(substate); } else if (msg) { info("%u %r", msg->scode, &msg->reason); wait = wait_fail(++pres->failc); } else { info("%m", err); wait = wait_fail(++pres->failc); } info("; will retry in %u secs (failc=%u)\n", wait, pres->failc); tmr_start(&pres->tmr, wait * 1000, tmr_handler, pres); contact_set_presence(pres->contact, PRESENCE_UNKNOWN); }
static void tmr_handler(void *arg) { struct presence *pres = arg; if (subscribe(pres)) { tmr_start(&pres->tmr, wait_fail(++pres->failc) * 1000, tmr_handler, pres); } }
static void tmr_handler(void *arg) { struct publisher *pub = arg; if (publish(pub)) tmr_start(&pub->tmr, wait_fail(++pub->failc) * 1000, tmr_handler, pub); else pub->failc = 0; }