static int rmq_reconnect(evi_reply_sock *sock) { rmq_params_t * rmqp = (rmq_params_t *)sock->params; if (!rmqp || !(rmqp->flags & RMQ_PARAM_EXCH)) { LM_ERR("not enough socket info\n"); return -1; } // rmq_print(sock); if (!(rmqp->flags & RMQ_PARAM_CONN) || !rmqp->conn) { /* init new connection */ if (!(rmqp->conn = amqp_new_connection())) { LM_ERR("cannot create new connection\n"); return -1; } rmqp->flags |= RMQ_PARAM_CONN; rmqp->sock = amqp_open_socket(sock->address.s, sock->port); if (rmqp->sock < 0) { LM_ERR("cannot opens socket\n"); goto destroy_rmqp; } amqp_set_sockfd(rmqp->conn, rmqp->sock); if (rmq_error("Logging in", amqp_login(rmqp->conn, RMQ_DEFAULT_VHOST, 0, RMQ_DEFAULT_MAX, 0, AMQP_SASL_METHOD_PLAIN, rmqp->flags & RMQ_PARAM_USER ? rmqp->user.s : RMQ_DEFAULT_UP, rmqp->flags & RMQ_PARAM_PASS ? rmqp->pass.s : RMQ_DEFAULT_UP))) goto destroy_rmqp; } if (!(rmqp->flags & RMQ_PARAM_CHAN)) { rmqp->channel = 1; amqp_channel_open(rmqp->conn, rmqp->channel); rmqp->flags |= RMQ_PARAM_CHAN; if (rmq_error("Opening channel", amqp_get_rpc_reply(rmqp->conn))) goto destroy_rmqp; } return 0; destroy_rmqp: rmq_destroy_param(rmqp); return -1; }
void rmq_destroy_param(rmq_params_t *rmqp) { if (!rmqp) return; if (rmqp->conn && rmqp->flags & RMQ_PARAM_CONN) { if (rmqp->flags & RMQ_PARAM_CHAN) { rmq_error("closing channel", amqp_channel_close(rmqp->conn, rmqp->channel, AMQP_REPLY_SUCCESS)); } rmq_error("closing connection", amqp_connection_close(rmqp->conn, AMQP_REPLY_SUCCESS)); if (amqp_destroy_connection(rmqp->conn) < 0) LM_ERR("cannot destroy connection\n"); } rmqp->flags &= ~(RMQ_PARAM_CONN|RMQ_PARAM_CHAN); }
static int rmq_reconnect(evi_reply_sock *sock) { rmq_params_t * rmqp = (rmq_params_t *)sock->params; #if defined AMQP_VERSION_v04 amqp_socket_t *amqp_sock; #endif int socket; if (!rmqp || !(rmqp->flags & RMQ_PARAM_RKEY)) { LM_ERR("not enough socket info\n"); return -1; } if (!(rmqp->flags & RMQ_PARAM_CONN) || !rmqp->conn) { /* init new connection */ if (!(rmqp->conn = amqp_new_connection())) { LM_ERR("cannot create new connection\n"); return -1; } rmqp->flags |= RMQ_PARAM_CONN; #if defined AMQP_VERSION_v04 amqp_sock = amqp_tcp_socket_new(rmqp->conn); if (!amqp_sock) { LM_ERR("cannot create AMQP socket\n"); goto destroy_rmqp; } socket = amqp_socket_open(amqp_sock, sock->address.s, sock->port); if (socket < 0) { LM_ERR("cannot open AMQP socket\n"); goto destroy_rmqp; } #else socket = amqp_open_socket(sock->address.s, sock->port); if (socket < 0) { LM_ERR("cannot open AMQP socket\n"); goto destroy_rmqp; } amqp_set_sockfd(rmqp->conn, socket); #endif if (rmq_error("Logging in", amqp_login( rmqp->conn, RMQ_DEFAULT_VHOST, 0, RMQ_DEFAULT_MAX, rmqp->heartbeat, AMQP_SASL_METHOD_PLAIN, rmqp->flags & RMQ_PARAM_USER ? rmqp->user.s : RMQ_DEFAULT_UP, rmqp->flags & RMQ_PARAM_PASS ? rmqp->pass.s : RMQ_DEFAULT_UP))) goto destroy_rmqp; } if (!(rmqp->flags & RMQ_PARAM_CHAN)) { rmqp->channel = 1; amqp_channel_open(rmqp->conn, rmqp->channel); rmqp->flags |= RMQ_PARAM_CHAN; if (rmq_error("Opening channel", amqp_get_rpc_reply(rmqp->conn))) goto destroy_rmqp; } return 0; destroy_rmqp: rmq_destroy_param(rmqp); return -1; }