builds the full name of the socket ( proto:name[:port] ), using different naming for it, depending on the "type" parameter : 0 - real name 1 - advertised name 2 - tagged name */
| 587 | 2 - tagged name |
| 588 | */ |
| 589 | static inline char* socket2str(const struct socket_info *sock, char *s, int *len, int type) |
| 590 | { |
| 591 | static char buf[MAX_SOCKET_STR]; |
| 592 | char *p,*p1; |
| 593 | |
| 594 | if (s) { |
| 595 | /* buffer provided -> check lenght */ |
| 596 | if ( sock_str_len(sock,type) > *len ) { |
| 597 | LM_ERR("buffer too short\n"); |
| 598 | return 0; |
| 599 | } |
| 600 | p = p1 = s; |
| 601 | } else { |
| 602 | p = p1 = buf; |
| 603 | } |
| 604 | |
| 605 | p = proto2str( sock->proto, p); |
| 606 | if (p==NULL) return 0; |
| 607 | |
| 608 | *(p++) = ':'; |
| 609 | switch (type) { |
| 610 | case 0: |
| 611 | memcpy( p, sock->address_str.s, sock->address_str.len); |
| 612 | p += sock->address_str.len; |
| 613 | *(p++) = ':'; |
| 614 | memcpy( p, sock->port_no_str.s, sock->port_no_str.len); |
| 615 | p += sock->port_no_str.len; |
| 616 | break; |
| 617 | case 1: |
| 618 | memcpy( p, sock->adv_name_str.s, sock->adv_name_str.len); |
| 619 | p += sock->adv_name_str.len; |
| 620 | *(p++) = ':'; |
| 621 | memcpy( p, sock->adv_port_str.s, sock->adv_port_str.len); |
| 622 | p += sock->adv_port_str.len; |
| 623 | break; |
| 624 | case 2: |
| 625 | memcpy( p, sock->tag.s, sock->tag.len); |
| 626 | p += sock->tag.len; |
| 627 | break; |
| 628 | default: |
| 629 | LM_BUG("unsupported type %d in printing socket name <%.*s>\n", |
| 630 | type, sock->name.len, sock->name.s); |
| 631 | } |
| 632 | *len = (int)(long)(p-p1); |
| 633 | LM_DBG("<%.*s>\n",*len,p1); |
| 634 | return p1; |
| 635 | } |
| 636 | |
| 637 | |
| 638 | #define get_sock_info_list(_proto) \ |
no test coverage detected