static void response_handler(int err, const struct sip_msg *msg, void *arg) { struct sipnot *not = arg; DEBUG_WARNING("re.sipevent.notify.response_handler()\n"); if (err) { if (err == ETIMEDOUT) not->subscribed = false; goto out; } if (sip_request_loops(¬->ls, msg->scode)) { not->subscribed = false; goto out; } if (msg->scode < 200) { return; } else if (msg->scode < 300) { (void)sip_dialog_update(not->dlg, msg); } else { switch (msg->scode) { case 401: case 407: err = sip_auth_authenticate(not->auth, msg); if (err) { err = (err == EAUTH) ? 0 : err; break; } err = notify_request(not, false); if (err) break; return; } not->subscribed = false; } out: if (not->termsent) { mem_deref(not); } else if (not->terminated) { if (!not->subscribed || notify_request(not, true)) mem_deref(not); } else if (!not->subscribed) { sipnot_terminate(not, err, msg, -1); } else if (not->notify_pending) { (void)notify_request(not, true); } }
int notify_create_request(const knot_zone_contents_t *zone, uint8_t *buffer, size_t *size) { const knot_rrset_t *soa_rrset = knot_node_rrset( knot_zone_contents_apex(zone), KNOT_RRTYPE_SOA); if (soa_rrset == NULL) { return KNOT_ERROR; } return notify_request(soa_rrset, buffer, size); }
int sipnot_notify(struct sipnot *not) { if (not->expires == 0) { return 0; } if (not->req) { not->notify_pending = true; return 0; } return notify_request(not, true); }
static bool terminate(struct sipnot *not, enum sipevent_reason reason) { not->terminated = true; not->reason = reason; not->closeh = internal_close_handler; if (not->req) { mem_ref(not); return true; } if (not->subscribed && !notify_request(not, true)) { mem_ref(not); return true; } return false; }