| 645 | } |
| 646 | |
| 647 | static int add_rtpproxy_socks(struct rtpp_set * rtpp_list, char *rtpproxy){ |
| 648 | /* Make rtp proxies list. */ |
| 649 | char *p, *p1, *p2, *p3, *p4, *plim; |
| 650 | struct rtpp_node *pnode; |
| 651 | int weight; |
| 652 | |
| 653 | p = rtpproxy; |
| 654 | plim = p + strlen(p); |
| 655 | |
| 656 | for(;;) { |
| 657 | weight = 1; |
| 658 | while (*p && isspace((int)*p)) |
| 659 | ++p; |
| 660 | if (p >= plim) |
| 661 | break; |
| 662 | p1 = p; |
| 663 | while (*p && !isspace((int)*p)) |
| 664 | ++p; |
| 665 | if (p <= p1) |
| 666 | break; /* may happen??? */ |
| 667 | /* Have weight specified? If yes, scan it */ |
| 668 | p2 = memchr(p1, '=', p - p1); |
| 669 | if (p2 != NULL) { |
| 670 | weight = strtoul(p2 + 1, NULL, 10); |
| 671 | } else { |
| 672 | p2 = p; |
| 673 | } |
| 674 | /* check to see if anything was advertised */ |
| 675 | p3 = q_memrchr(p1, '|', p2 - p1); |
| 676 | if (p3) { |
| 677 | p4 = p2; |
| 678 | p2 = p3; |
| 679 | p3++; |
| 680 | while (p3 < p2 && isspace((int)*p3)) |
| 681 | p3++; |
| 682 | while (p2 > p1 && isspace((int)*p2)) |
| 683 | p2--; |
| 684 | } |
| 685 | pnode = shm_malloc(sizeof(struct rtpp_node) + |
| 686 | (p2 - p1 + 1) /* socket */ + |
| 687 | (p3 ? (p4 - p3 + 1): 0)); |
| 688 | if (pnode == NULL) { |
| 689 | LM_ERR("no shm memory left\n"); |
| 690 | return -1; |
| 691 | } |
| 692 | memset(pnode, 0, sizeof(*pnode)); |
| 693 | pnode->rn_url.s = (char *)(pnode + 1); |
| 694 | pnode->idx = *rtpp_no; |
| 695 | *rtpp_no = *rtpp_no + 1; |
| 696 | pnode->rn_recheck_ticks = 0; |
| 697 | pnode->rn_weight = weight; |
| 698 | pnode->rn_umode = CM_UNIX; |
| 699 | pnode->rn_disabled = 0; |
| 700 | memcpy(pnode->rn_url.s, p1, p2 - p1); |
| 701 | pnode->rn_url.s[p2 - p1] = '\0'; |
| 702 | pnode->rn_url.len = p2-p1; |
| 703 | if (p3) { |
| 704 | pnode->adv_address = pnode->rn_url.s + pnode->rn_url.len + 1; |
no test coverage detected