| 1437 | } |
| 1438 | |
| 1439 | int sipp_bind_socket(SIPpSocket *socket, struct sockaddr_storage *saddr, int *port) |
| 1440 | { |
| 1441 | int ret; |
| 1442 | int len; |
| 1443 | |
| 1444 | |
| 1445 | #ifdef USE_SCTP |
| 1446 | if (transport == T_SCTP && multisocket == 1 && port && *port == -1) { |
| 1447 | sockaddr_update_port(saddr, 0); |
| 1448 | } |
| 1449 | #endif |
| 1450 | |
| 1451 | if (socket->ss_ipv6) { |
| 1452 | len = sizeof(struct sockaddr_in6); |
| 1453 | } else { |
| 1454 | len = sizeof(struct sockaddr_in); |
| 1455 | } |
| 1456 | |
| 1457 | if ((ret = ::bind(socket->ss_fd, (sockaddr *)saddr, len))) { |
| 1458 | return ret; |
| 1459 | } |
| 1460 | |
| 1461 | if (!port) { |
| 1462 | return 0; |
| 1463 | } |
| 1464 | |
| 1465 | if ((ret = getsockname(socket->ss_fd, (sockaddr *)saddr, (sipp_socklen_t *) &len))) { |
| 1466 | return ret; |
| 1467 | } |
| 1468 | |
| 1469 | if (socket->ss_ipv6) { |
| 1470 | socket->ss_port = ntohs((short)((_RCAST(struct sockaddr_in6 *, saddr))->sin6_port)); |
| 1471 | } else { |
| 1472 | socket->ss_port = ntohs((short)((_RCAST(struct sockaddr_in *, saddr))->sin_port)); |
| 1473 | } |
| 1474 | *port = socket->ss_port; |
| 1475 | |
| 1476 | #ifdef USE_SCTP |
| 1477 | if (transport == T_SCTP) { |
| 1478 | bool isany = false; |
| 1479 | if (socket->ss_ipv6) { |
| 1480 | if (memcmp(&(_RCAST(struct sockaddr_in6 *, saddr)->sin6_addr), &in6addr_any, sizeof(in6_addr)) == 0) |
| 1481 | isany = true; |
| 1482 | } else { |
| 1483 | isany = (_RCAST(struct sockaddr_in *, saddr)->sin_addr.s_addr == INADDR_ANY); |
| 1484 | } |
| 1485 | if (!isany) { |
| 1486 | set_multihome_addr(socket, *port); |
| 1487 | } |
| 1488 | } |
| 1489 | #endif |
| 1490 | |
| 1491 | return 0; |
| 1492 | } |
| 1493 | |
| 1494 | void SIPpSocket::set_bind_port(int bind_port) |
| 1495 | { |
no test coverage detected