MCPcopy Create free account
hub / github.com/OpenSIPS/opensips / xmlrpc_sendmsg

Function xmlrpc_sendmsg

modules/event_xmlrpc/xmlrpc_send.c:166–224  ·  view source on GitHub ↗

sends the buffer */

Source from the content-addressed store, hash-verified

164
165/* sends the buffer */
166static int xmlrpc_sendmsg(xmlrpc_send_t *sock)
167{
168 unsigned long i;
169 int len = 0;
170 int fd, ret = -1;
171 int aux;
172
173 xmlrpc_iov[xmlrpc_first_line_index].iov_base = sock->first_line.s;
174 xmlrpc_iov[xmlrpc_first_line_index].iov_len = sock->first_line.len;
175
176 xmlrpc_iov[xmlrpc_host_index].iov_base = sock->host.s;
177 xmlrpc_iov[xmlrpc_host_index].iov_len = sock->host.len;
178
179 /* event name */
180 xmlrpc_iov[xmlrpc_ev_name_index].iov_base = sock->event.s;
181 xmlrpc_iov[xmlrpc_ev_name_index].iov_len = sock->event.len;
182
183 /* method name */
184 xmlrpc_iov[xmlrpc_met_name_index].iov_base = sock->method.s;
185 xmlrpc_iov[xmlrpc_met_name_index].iov_len = sock->method.len;
186
187 /* msg body */
188 xmlrpc_iov[xmlrpc_params_index].iov_base = sock->body.s;
189 xmlrpc_iov[xmlrpc_params_index].iov_len = sock->body.len;
190
191 /* now compute content length */
192 for (i = xmlrpc_xmlbody_index; i < xmlrpc_iov_len; i++)
193 len += xmlrpc_iov[i].iov_len;
194
195 xmlrpc_iov[xmlrpc_ct_len_index].iov_base = int2str(len, &aux);
196 xmlrpc_iov[xmlrpc_ct_len_index].iov_len = aux;
197
198 /* writing the iov on the network */
199 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
200 LM_ERR("cannot create socket\n");
201 return -1;
202 }
203
204 if (connect(fd, &sock->addr.s, sizeof(struct sockaddr_in)) < 0) {
205 LM_ERR("cannot connect to %s[%d:%s]\n",
206 inet_ntoa(sock->addr.sin.sin_addr),
207 errno, strerror(errno));
208 goto close;
209 }
210
211 do {
212 len = writev(fd, xmlrpc_iov, xmlrpc_iov_len);
213 } while ((len < 0 && (IS_ERR(EINTR)||IS_ERR(EAGAIN)||IS_ERR(EWOULDBLOCK))));
214 if (len <= 0) {
215 LM_ERR("cannot send xmlrpc command %s[%d]\n", strerror(errno), errno);
216 goto close;
217 }
218
219 ret = 0;
220close:
221 shutdown(fd, SHUT_RDWR);
222 close(fd);
223 return ret;

Callers 1

xmlrpc_processFunction · 0.85

Calls 1

int2strFunction · 0.85

Tested by

no test coverage detected