static void resp_handler(int err, const struct sip_msg *msg, void *arg) { struct sip_req *sr = arg; info("baresip.sipreq.resp_handler()\n"); if (err || sip_request_loops(&sr->ls, msg->scode)) goto out; if (msg->scode < 200) { return; } else if (msg->scode < 300) { ; } else { switch (msg->scode) { case 401: case 407: err = sip_auth_authenticate(sr->auth, msg); if (err) { err = (err == EAUTH) ? 0 : err; break; } err = request(sr); if (err) break; return; case 403: sip_auth_reset(sr->auth); break; } } out: if (sr->resph) sr->resph(err, msg, sr->arg); /* destroy now */ mem_deref(sr); }
static void response_handler(int err, const struct sip_msg *msg, void *arg) { const struct sip_hdr *minexp; struct sipreg *reg = arg; reg->wait = failwait(reg->failc + 1); if (err || sip_request_loops(®->ls, msg->scode)) { reg->failc++; goto out; } if (msg->scode < 200) { return; } else if (msg->scode < 300) { reg->registered = true; reg->wait = reg->expires; sip_msg_hdr_apply(msg, true, SIP_HDR_CONTACT, contact_handler, reg); reg->wait *= 900; reg->failc = 0; if (reg->regid > 0 && !reg->terminated && !reg->ka) start_outbound(reg, msg); } else { if (reg->terminated && !reg->registered) goto out; switch (msg->scode) { case 401: case 407: err = sip_auth_authenticate(reg->auth, msg); if (err) { err = (err == EAUTH) ? 0 : err; break; } err = request(reg, false); if (err) break; return; case 403: sip_auth_reset(reg->auth); break; case 423: minexp = sip_msg_hdr(msg, SIP_HDR_MIN_EXPIRES); if (!minexp || !pl_u32(&minexp->val) || !reg->expires) break; reg->expires = pl_u32(&minexp->val); err = request(reg, false); if (err) break; return; } ++reg->failc; } out: if (!reg->expires) { mem_deref(reg); } else if (reg->terminated) { if (!reg->registered || request(reg, true)) mem_deref(reg); } else { tmr_start(®->tmr, reg->wait, tmr_handler, reg); reg->resph(err, msg, reg->arg); } }