/* * function that simply prints the parameters passed */ static int rmq_publish(struct sip_msg *msg, struct rmq_server *srv, str *srkey, str *sbody, str *sctype, pv_spec_t *hnames, pv_spec_t *hvals) { int aname, avals; unsigned short type; if (hnames && !hvals) { LM_ERR("header names without values!\n"); return -1; } if (!hnames && hvals) { LM_ERR("header values without names!\n"); return -1; } if (hnames && pv_get_avp_name(msg, &hnames->pvp, &aname, &type) < 0) { LM_ERR("cannot resolve names AVP\n"); return -1; } if (hvals && pv_get_avp_name(msg, &hvals->pvp, &avals, &type) < 0) { LM_ERR("cannot resolve values AVP\n"); return -1; } /* resolve the AVP */ return rmq_send(srv, srkey, sbody, sctype, (hnames ? &aname : NULL), (hvals ? &avals : NULL)) == 0 ? 1: -1; }
static void rmq_free(evi_reply_sock *sock) { rmq_send_t *rmqs = shm_malloc(sizeof(rmq_send_t) + 1); if (!rmqs) { LM_ERR("no more shm memory\n"); goto destroy; } rmqs->sock = sock; rmqs->msg[0] = 0; if (rmq_send(rmqs) < 0) { LM_ERR("cannot send message\n"); goto destroy; } return; destroy: if (rmqs) shm_free(rmqs); rmq_destroy(sock); }
static int rmq_raise(struct sip_msg *msg, str* ev_name, evi_reply_sock *sock, evi_params_t * params) { rmq_send_t *rmqs; int len; if (!sock || !(sock->flags & RMQ_FLAG)) { LM_ERR("invalid socket type\n"); return -1; } /* sanity checks */ if ((sock->flags & (EVI_ADDRESS|EVI_PORT|EVI_PARAMS)) != (EVI_ADDRESS|EVI_PORT|EVI_PARAMS) || !sock->port || !sock->address.len || !sock->address.s) { LM_ERR("socket doesn't have enough details\n"); return -1; } /* check connection */ /* build the params list */ if ((len = rmq_build_params(ev_name, params)) < 0) { LM_ERR("error while building parameters list\n"); return -1; } rmqs = shm_malloc(sizeof(rmq_send_t) + len); if (!rmqs) { LM_ERR("no more shm memory\n"); return -1; } memcpy(rmqs->msg, rmq_buffer, len); rmqs->sock = sock; if (rmq_send(rmqs) < 0) { LM_ERR("cannot send message\n"); shm_free(rmqs); return -1; } return 0; }