diff --git a/Makefile b/Makefile index e00429b..eb598a7 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ include $(MK) # List of modules MODULES += sip sipevent sipreg sipsess -MODULES += uri http httpauth +MODULES += uri http httpauth msg MODULES += stun turn ice MODULES += natbd MODULES += rtp sdp jbuf telev diff --git a/docs/README b/docs/README index e4bf52c..b1ee8d7 100644 --- a/docs/README +++ b/docs/README @@ -40,6 +40,7 @@ Modules: * mem stable Memory referencing * mod testing Run-time module loading * mqueue testing Thread-safe message queue +* msg unstable Generic message component library * natbd unstable NAT Behavior Discovery using STUN * net unstable Networking routines * rtp testing Real-time Transport Protocol diff --git a/include/re.h b/include/re.h index 575a7f7..209354b 100644 --- a/include/re.h +++ b/include/re.h @@ -15,6 +15,7 @@ extern "C" { #include "re_types.h" #include "re_fmt.h" #include "re_mbuf.h" +#include "re_msg.h" #include "re_list.h" #include "re_sa.h" diff --git a/include/re_http.h b/include/re_http.h index c2869af..6fa96da 100644 --- a/include/re_http.h +++ b/include/re_http.h @@ -81,7 +81,7 @@ struct http_msg { uint16_t scode; struct pl reason; struct list hdrl; - struct pl ctype; + struct msg_ctype ctyp; struct mbuf *mb; uint32_t clen; }; diff --git a/include/re_sip.h b/include/re_sip.h index dad9188..7474b67 100644 --- a/include/re_sip.h +++ b/include/re_sip.h @@ -195,10 +195,10 @@ struct sip_msg { struct sip_taddr to; struct sip_taddr from; struct sip_cseq cseq; + struct msg_ctype ctyp; struct pl callid; struct pl maxfwd; struct pl expires; - struct pl ctype; struct pl clen; struct hash *hdrht; struct mbuf *mb; @@ -346,8 +346,6 @@ void sip_msg_dump(const struct sip_msg *msg); int sip_addr_decode(struct sip_addr *addr, const struct pl *pl); int sip_via_decode(struct sip_via *via, const struct pl *pl); int sip_cseq_decode(struct sip_cseq *cseq, const struct pl *pl); -int sip_param_decode(const struct pl *pl, const char *name, struct pl *val); -int sip_param_exists(const struct pl *pl, const char *name, struct pl *end); /* keepalive */ diff --git a/src/http/auth.c b/src/http/auth.c index 85448d7..68dd171 100644 --- a/src/http/auth.c +++ b/src/http/auth.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include diff --git a/src/http/msg.c b/src/http/msg.c index 7815dc4..c860281 100644 --- a/src/http/msg.c +++ b/src/http/msg.c @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -94,6 +95,7 @@ static inline int hdr_add(struct http_msg *msg, const struct pl *name, enum http_hdrid id, const char *p, ssize_t l) { struct http_hdr *hdr; + int err = 0; hdr = mem_zalloc(sizeof(*hdr), hdr_destructor); if (!hdr) @@ -110,7 +112,7 @@ static inline int hdr_add(struct http_msg *msg, const struct pl *name, switch (id) { case HTTP_HDR_CONTENT_TYPE: - msg->ctype = hdr->val; + err = msg_ctype_decode(&msg->ctyp, &hdr->val); break; case HTTP_HDR_CONTENT_LENGTH: @@ -121,7 +123,10 @@ static inline int hdr_add(struct http_msg *msg, const struct pl *name, break; } - return 0; + if (err) + mem_deref(hdr); + + return err; } diff --git a/src/http/server.c b/src/http/server.c index a9eaf1d..e9762d2 100644 --- a/src/http/server.c +++ b/src/http/server.c @@ -13,6 +13,7 @@ #include #include #include +#include #include diff --git a/src/sip/addr.c b/src/sip/addr.c index 528a51e..72ab21f 100644 --- a/src/sip/addr.c +++ b/src/sip/addr.c @@ -10,6 +10,7 @@ #include #include #include +#include #include diff --git a/src/sip/auth.c b/src/sip/auth.c index 1813e15..1357cad 100644 --- a/src/sip/auth.c +++ b/src/sip/auth.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "sip.h" diff --git a/src/sip/cseq.c b/src/sip/cseq.c index ff2d77f..1be247b 100644 --- a/src/sip/cseq.c +++ b/src/sip/cseq.c @@ -9,6 +9,7 @@ #include #include #include +#include #include diff --git a/src/sip/ctrans.c b/src/sip/ctrans.c index 1096b0c..0ff3266 100644 --- a/src/sip/ctrans.c +++ b/src/sip/ctrans.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "sip.h" diff --git a/src/sip/dialog.c b/src/sip/dialog.c index 89bf032..be152c1 100644 --- a/src/sip/dialog.c +++ b/src/sip/dialog.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "sip.h" diff --git a/src/sip/keepalive.c b/src/sip/keepalive.c index d58163b..1e1594f 100644 --- a/src/sip/keepalive.c +++ b/src/sip/keepalive.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "sip.h" diff --git a/src/sip/keepalive_udp.c b/src/sip/keepalive_udp.c index b6bd250..39efa89 100644 --- a/src/sip/keepalive_udp.c +++ b/src/sip/keepalive_udp.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include "sip.h" diff --git a/src/sip/mod.mk b/src/sip/mod.mk index 09815e9..47e3abe 100644 --- a/src/sip/mod.mk +++ b/src/sip/mod.mk @@ -12,7 +12,6 @@ SRCS += sip/dialog.c SRCS += sip/keepalive.c SRCS += sip/keepalive_udp.c SRCS += sip/msg.c -SRCS += sip/param.c SRCS += sip/reply.c SRCS += sip/request.c SRCS += sip/sip.c diff --git a/src/sip/msg.c b/src/sip/msg.c index 0db1211..2647e0b 100644 --- a/src/sip/msg.c +++ b/src/sip/msg.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "sip.h" @@ -198,7 +199,7 @@ static inline int hdr_add(struct sip_msg *msg, const struct pl *name, if (err) break; - (void)sip_param_decode(&msg->to.params, "tag", &msg->to.tag); + (void)msg_param_decode(&msg->to.params, "tag", &msg->to.tag); msg->to.val = hdr->val; break; @@ -208,7 +209,7 @@ static inline int hdr_add(struct sip_msg *msg, const struct pl *name, if (err) break; - (void)sip_param_decode(&msg->from.params, "tag", + (void)msg_param_decode(&msg->from.params, "tag", &msg->from.tag); msg->from.val = hdr->val; break; @@ -226,7 +227,7 @@ static inline int hdr_add(struct sip_msg *msg, const struct pl *name, break; case SIP_HDR_CONTENT_TYPE: - msg->ctype = hdr->val; + err = msg_ctype_decode(&msg->ctyp, &hdr->val); break; case SIP_HDR_CONTENT_LENGTH: diff --git a/src/sip/param.c b/src/sip/param.c index 74e62a8..e69de29 100644 --- a/src/sip/param.c +++ b/src/sip/param.c @@ -1,74 +0,0 @@ -/** - * @file param.c SIP Parameter decode - * - * Copyright (C) 2010 Creytiv.com - */ -#include -#include -#include -#include -#include -#include -#include - - -/** - * Check if a SIP parameter exists - * - * @param pl Pointer-length string - * @param name SIP Parameter name - * @param val Returned parameter value - * - * @return 0 for success, otherwise errorcode - */ -int sip_param_exists(const struct pl *pl, const char *name, struct pl *val) -{ - struct pl v1, v2; - char xpr[128]; - - if (!pl || !name || !val) - return EINVAL; - - (void)re_snprintf(xpr, sizeof(xpr), ";[ \t\r\n]*%s[ \t\r\n;=]*", name); - - if (re_regex(pl->p, pl->l, xpr, &v1, &v2)) - return ENOENT; - - if (!v2.l && v2.p < pl->p + pl->l) - return ENOENT; - - val->p = v1.p - 1; - val->l = v2.p - val->p; - - return 0; -} - - -/** - * Decode a SIP Parameter - * - * @param pl Pointer-length string - * @param name SIP Parameter name - * @param val Returned parameter value - * - * @return 0 for success, otherwise errorcode - */ -int sip_param_decode(const struct pl *pl, const char *name, struct pl *val) -{ - char expr[128]; - struct pl v; - - if (!pl || !name || !val) - return EINVAL; - - (void)re_snprintf(expr, sizeof(expr), - ";[ \t\r\n]*%s[ \t\r\n]*=[ \t\r\n]*[~ \t\r\n;]+", - name); - - if (re_regex(pl->p, pl->l, expr, NULL, NULL, NULL, &v)) - return ENOENT; - - *val = v; - - return 0; -} diff --git a/src/sip/reply.c b/src/sip/reply.c index 1242ddf..0ca01bb 100644 --- a/src/sip/reply.c +++ b/src/sip/reply.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include "sip.h" @@ -55,7 +56,7 @@ static int vreplyf(struct sip_strans **stp, struct mbuf **mbp, bool trans, break; } - if (!sip_param_exists(&msg->via.params, "rport", &rp)){ + if (!msg_param_exists(&msg->via.params, "rport", &rp)){ err |= mbuf_write_pl_skip(mb, &hdr->val, &rp); err |= mbuf_printf(mb, ";rport=%u", sa_port(&msg->src)); @@ -246,7 +247,7 @@ void sip_reply_addr(struct sa *addr, const struct sip_msg *msg, bool rport) switch (msg->tp) { case SIP_TRANSP_UDP: - if (!sip_param_decode(&msg->via.params, "maddr", &pl)) { + if (!msg_param_decode(&msg->via.params, "maddr", &pl)) { (void)sa_set(addr, &pl,sip_transp_port(msg->tp, port)); break; } diff --git a/src/sip/request.c b/src/sip/request.c index 9d685e9..530f00c 100644 --- a/src/sip/request.c +++ b/src/sip/request.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include "sip.h" @@ -607,7 +608,7 @@ int sip_request(struct sip_request **reqp, struct sip *sip, bool stateful, if (err) goto out; - if (sip_param_decode(&route->params, "maddr", &pl)) + if (msg_param_decode(&route->params, "maddr", &pl)) pl = route->host; err = pl_strdup(&req->host, &pl); @@ -621,7 +622,7 @@ int sip_request(struct sip_request **reqp, struct sip *sip, bool stateful, req->resph = resph; req->arg = arg; - if (!sip_param_decode(&route->params, "transport", &pl)) { + if (!msg_param_decode(&route->params, "transport", &pl)) { if (!pl_strcasecmp(&pl, "udp")) req->tp = SIP_TRANSP_UDP; diff --git a/src/sip/sip.c b/src/sip/sip.c index 5005b23..651628c 100644 --- a/src/sip/sip.c +++ b/src/sip/sip.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include "sip.h" diff --git a/src/sip/strans.c b/src/sip/strans.c index 5d2a08f..13a875c 100644 --- a/src/sip/strans.c +++ b/src/sip/strans.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "sip.h" diff --git a/src/sip/transp.c b/src/sip/transp.c index 1639e25..2fdb5f5 100644 --- a/src/sip/transp.c +++ b/src/sip/transp.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "sip.h" diff --git a/src/sip/via.c b/src/sip/via.c index b4f5732..76e518a 100644 --- a/src/sip/via.c +++ b/src/sip/via.c @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -72,5 +73,5 @@ int sip_via_decode(struct sip_via *via, const struct pl *pl) via->val = *pl; - return sip_param_decode(&via->params, "branch", &via->branch); + return msg_param_decode(&via->params, "branch", &via->branch); } diff --git a/src/sipevent/listen.c b/src/sipevent/listen.c index b4eb29a..ab35d95 100644 --- a/src/sipevent/listen.c +++ b/src/sipevent/listen.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include "sipevent.h" diff --git a/src/sipevent/msg.c b/src/sipevent/msg.c index 88c8f0d..472c828 100644 --- a/src/sipevent/msg.c +++ b/src/sipevent/msg.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -26,7 +27,7 @@ int sipevent_event_decode(struct sipevent_event *se, const struct pl *pl) if (err) return EBADMSG; - if (!sip_param_decode(&se->params, "id", ¶m)) + if (!msg_param_decode(&se->params, "id", ¶m)) se->id = param; else se->id = pl_null; @@ -57,7 +58,7 @@ int sipevent_substate_decode(struct sipevent_substate *ss, const struct pl *pl) else ss->state = -1; - if (!sip_param_decode(&ss->params, "reason", ¶m)) { + if (!msg_param_decode(&ss->params, "reason", ¶m)) { if (!pl_strcasecmp(¶m, "deactivated")) ss->reason = SIPEVENT_DEACTIVATED; @@ -78,12 +79,12 @@ int sipevent_substate_decode(struct sipevent_substate *ss, const struct pl *pl) ss->reason = -1; } - if (!sip_param_decode(&ss->params, "expires", ¶m)) + if (!msg_param_decode(&ss->params, "expires", ¶m)) ss->expires = param; else ss->expires = pl_null; - if (!sip_param_decode(&ss->params, "retry-after", ¶m)) + if (!msg_param_decode(&ss->params, "retry-after", ¶m)) ss->retry_after = param; else ss->retry_after = pl_null; diff --git a/src/sipevent/notify.c b/src/sipevent/notify.c index 0e0059e..d368172 100644 --- a/src/sipevent/notify.c +++ b/src/sipevent/notify.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include "sipevent.h" diff --git a/src/sipevent/subscribe.c b/src/sipevent/subscribe.c index a04776d..237de75 100644 --- a/src/sipevent/subscribe.c +++ b/src/sipevent/subscribe.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include "sipevent.h" diff --git a/src/sipreg/reg.c b/src/sipreg/reg.c index 9627f72..b3b039f 100644 --- a/src/sipreg/reg.c +++ b/src/sipreg/reg.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -155,7 +156,7 @@ static bool contact_handler(const struct sip_hdr *hdr, if (pl_strcmp(&c.auri, uri)) return false; - if (!sip_param_decode(&c.params, "expires", &pval)) { + if (!msg_param_decode(&c.params, "expires", &pval)) { reg->wait = pl_u32(&pval); } else if (pl_isset(&msg->expires)) diff --git a/src/sipsess/accept.c b/src/sipsess/accept.c index 69d911d..d85dc17 100644 --- a/src/sipsess/accept.c +++ b/src/sipsess/accept.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include "sipsess.h" diff --git a/src/sipsess/ack.c b/src/sipsess/ack.c index c1a3acc..4a9be68 100644 --- a/src/sipsess/ack.c +++ b/src/sipsess/ack.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include "sipsess.h" diff --git a/src/sipsess/close.c b/src/sipsess/close.c index 3136c55..f13ea39 100644 --- a/src/sipsess/close.c +++ b/src/sipsess/close.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include "sipsess.h" diff --git a/src/sipsess/connect.c b/src/sipsess/connect.c index f35bed8..fe97a51 100644 --- a/src/sipsess/connect.c +++ b/src/sipsess/connect.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include "sipsess.h" diff --git a/src/sipsess/info.c b/src/sipsess/info.c index 5fa845f..e30bc0d 100644 --- a/src/sipsess/info.c +++ b/src/sipsess/info.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include "sipsess.h" diff --git a/src/sipsess/listen.c b/src/sipsess/listen.c index f0190d0..c81eff9 100644 --- a/src/sipsess/listen.c +++ b/src/sipsess/listen.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include "sipsess.h" diff --git a/src/sipsess/modify.c b/src/sipsess/modify.c index c6b7129..027871c 100644 --- a/src/sipsess/modify.c +++ b/src/sipsess/modify.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include "sipsess.h" diff --git a/src/sipsess/reply.c b/src/sipsess/reply.c index adbcefa..40970ab 100644 --- a/src/sipsess/reply.c +++ b/src/sipsess/reply.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include "sipsess.h" diff --git a/src/sipsess/request.c b/src/sipsess/request.c index 4463990..cd7384a 100644 --- a/src/sipsess/request.c +++ b/src/sipsess/request.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include "sipsess.h" diff --git a/src/sipsess/sess.c b/src/sipsess/sess.c index b062513..0cf521f 100644 --- a/src/sipsess/sess.c +++ b/src/sipsess/sess.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include "sipsess.h"