static int mwi_subscribe(struct ua *ua) { const char *routev[1]; struct mwi *mwi; int err; mwi = mem_zalloc(sizeof(*mwi), destructor); if (!mwi) return ENOMEM; list_append(&mwil, &mwi->le, mwi); mwi->ua = ua; routev[0] = ua_outbound(ua); info("mwi: subscribing to messages for %s\n", ua_aor(ua)); err = sipevent_subscribe(&mwi->sub, uag_sipevent_sock(), ua_aor(ua), NULL, ua_aor(ua), "message-summary", NULL, 600, ua_cuser(ua), routev, routev[0] ? 1 : 0, auth_handler, ua_prm(ua), true, NULL, notify_handler, close_handler, mwi, "Accept:" " application/simple-message-summary\r\n"); if (err) { warning("mwi: subscribe ERROR: %m\n", err); } if (err) mem_deref(mwi); return err; }
static int subscribe(struct presence *pres) { const char *routev[1]; struct ua *ua; char uri[256]; int err; /* We use the first UA */ ua = uag_find_aor(NULL); if (!ua) { warning("presence: no UA found\n"); return ENOENT; } pl_strcpy(&contact_addr(pres->contact)->auri, uri, sizeof(uri)); routev[0] = ua_outbound(ua); err = sipevent_subscribe(&pres->sub, uag_sipevent_sock(), uri, NULL, ua_aor(ua), "presence", NULL, 600, ua_cuser(ua), routev, routev[0] ? 1 : 0, auth_handler, ua_prm(ua), true, NULL, notify_handler, close_handler, pres, "%H", ua_print_supported, ua); if (err) { warning("presence: sipevent_subscribe failed: %m\n", err); } return err; }
int sip_req_send(struct ua *ua, const char *method, const char *uri, sip_resp_h *resph, void *arg, const char *fmt, ...) { const char *routev[1]; struct sip_req *sr; int err; info("baresip.sipreq.sip_req_send()\n"); if (!ua || !method || !uri || !fmt) return EINVAL; routev[0] = ua_outbound(ua); sr = mem_zalloc(sizeof(*sr), destructor); if (!sr) return ENOMEM; sr->resph = resph; sr->arg = arg; err = str_dup(&sr->method, method); if (fmt) { va_list ap; va_start(ap, fmt); err |= re_vsdprintf(&sr->fmt, fmt, ap); va_end(ap); } if (err) goto out; err = sip_dialog_alloc(&sr->dlg, uri, uri, NULL, ua_aor(ua), routev[0] ? routev : NULL, routev[0] ? 1 : 0); if (err) goto out; err = sip_auth_alloc(&sr->auth, auth_handler, ua_prm(ua), true); if (err) goto out; err = request(sr); out: if (err) mem_deref(sr); return err; }
static void stream_start_keepalive(struct stream *s) { const char *rtpkeep; if (!s) return; rtpkeep = ua_prm(call_get_ua(s->call))->rtpkeep; s->rtpkeep = mem_deref(s->rtpkeep); if (rtpkeep && sdp_media_rformat(s->sdp, NULL)) { int err; err = rtpkeep_alloc(&s->rtpkeep, rtpkeep, IPPROTO_UDP, s->rtp, s->sdp); if (err) { warning("stream: rtpkeep_alloc failed: %m\n", err); } } }
static int notifier_alloc(struct notifier **notp, struct sipevent_sock *sock, const struct sip_msg *msg, const struct sipevent_event *se, struct ua *ua) { struct notifier *not; int err; if (!sock || !msg || !se) return EINVAL; not = mem_zalloc(sizeof(*not), destructor); if (!not) return ENOMEM; not->sock = mem_ref(sock); not->ua = mem_ref(ua); err = sipevent_accept(¬->not, sock, msg, NULL, se, 200, "OK", 600, 600, 600, ua_cuser(not->ua), "application/pidf+xml", auth_handler, ua_prm(not->ua), true, sipnot_close_handler, not, NULL); if (err) { warning("presence: sipevent_accept failed: %m\n", err); goto out; } list_append(¬ifierl, ¬->le, not); out: if (err) mem_deref(not); else if (notp) *notp = not; return err; }