| 492 | } |
| 493 | |
| 494 | static int dm_send_request_async_reply(int fd, |
| 495 | struct sip_msg *msg, void *param) |
| 496 | { |
| 497 | int ret; |
| 498 | unsigned long r; |
| 499 | char *rpl_avps = NULL; |
| 500 | pv_value_t val = {STR_NULL, 0, PV_VAL_NULL}; |
| 501 | struct dm_async_msg *amsg = (struct dm_async_msg *)param; |
| 502 | |
| 503 | do { |
| 504 | ret = read(fd, &r, sizeof r); |
| 505 | } while(ret < 0 && (errno == EINTR || errno == EAGAIN)); |
| 506 | async_status = ASYNC_DONE_CLOSE_FD; |
| 507 | if (ret < 0) { |
| 508 | LM_ERR("could not resume async route!\n"); |
| 509 | goto error; |
| 510 | } |
| 511 | ret = _dm_get_message_response(amsg->cond, (amsg->ret?&rpl_avps:NULL)); |
| 512 | if (ret == 0) |
| 513 | ret = 1; |
| 514 | else |
| 515 | LM_ERR("Diameter request failed\n"); |
| 516 | if (ret > 0 && rpl_avps) { |
| 517 | val.rs.s = rpl_avps; |
| 518 | val.rs.len = strlen(rpl_avps); |
| 519 | val.flags = PV_VAL_STR; |
| 520 | } |
| 521 | error: |
| 522 | if (amsg->ret && pv_set_value(msg, amsg->ret, 0, &val) != 0) |
| 523 | LM_ERR("failed to set output rpl_avps pv to NULL\n"); |
| 524 | _dm_release_message_response(amsg->cond, rpl_avps); |
| 525 | dm_free_sync_msg(amsg); |
| 526 | return ret; |
| 527 | } |
| 528 | |
| 529 | static int dm_send_request_async_tout(int fd, |
| 530 | struct sip_msg *msg, void *param) |
nothing calls this directly
no test coverage detected