| 6685 | } |
| 6686 | |
| 6687 | int changeBindAddr(sds *addrlist, int addrlist_len, bool fFirstCall) { |
| 6688 | int i; |
| 6689 | int result = C_OK; |
| 6690 | |
| 6691 | char *prev_bindaddr[CONFIG_BINDADDR_MAX]; |
| 6692 | int prev_bindaddr_count; |
| 6693 | |
| 6694 | /* Close old TCP and TLS servers */ |
| 6695 | closeSocketListeners(&serverTL->ipfd); |
| 6696 | closeSocketListeners(&serverTL->tlsfd); |
| 6697 | |
| 6698 | /* Keep previous settings */ |
| 6699 | prev_bindaddr_count = g_pserver->bindaddr_count; |
| 6700 | memcpy(prev_bindaddr, g_pserver->bindaddr, sizeof(g_pserver->bindaddr)); |
| 6701 | |
| 6702 | /* Copy new settings */ |
| 6703 | memset(g_pserver->bindaddr, 0, sizeof(g_pserver->bindaddr)); |
| 6704 | for (i = 0; i < addrlist_len; i++) { |
| 6705 | g_pserver->bindaddr[i] = zstrdup(addrlist[i]); |
| 6706 | } |
| 6707 | g_pserver->bindaddr_count = addrlist_len; |
| 6708 | |
| 6709 | /* Bind to the new port */ |
| 6710 | if ((g_pserver->port != 0 && listenToPort(g_pserver->port, &serverTL->ipfd, (cserver.cthreads > 1), fFirstCall) != C_OK) || |
| 6711 | (g_pserver->tls_port != 0 && listenToPort(g_pserver->tls_port, &serverTL->tlsfd, (cserver.cthreads > 1), fFirstCall) != C_OK)) { |
| 6712 | serverLog(LL_WARNING, "Failed to bind, trying to restore old listening sockets."); |
| 6713 | |
| 6714 | /* Restore old bind addresses */ |
| 6715 | for (i = 0; i < addrlist_len; i++) { |
| 6716 | zfree(g_pserver->bindaddr[i]); |
| 6717 | } |
| 6718 | memcpy(g_pserver->bindaddr, prev_bindaddr, sizeof(g_pserver->bindaddr)); |
| 6719 | g_pserver->bindaddr_count = prev_bindaddr_count; |
| 6720 | |
| 6721 | /* Re-Listen TCP and TLS */ |
| 6722 | serverTL->ipfd.count = 0; |
| 6723 | if (g_pserver->port != 0 && listenToPort(g_pserver->port, &serverTL->ipfd, (cserver.cthreads > 1), false) != C_OK) { |
| 6724 | serverPanic("Failed to restore old listening sockets."); |
| 6725 | } |
| 6726 | |
| 6727 | serverTL->tlsfd.count = 0; |
| 6728 | if (g_pserver->tls_port != 0 && listenToPort(g_pserver->tls_port, &serverTL->tlsfd, (cserver.cthreads > 1), false) != C_OK) { |
| 6729 | serverPanic("Failed to restore old listening sockets."); |
| 6730 | } |
| 6731 | |
| 6732 | result = C_ERR; |
| 6733 | } else { |
| 6734 | /* Free old bind addresses */ |
| 6735 | for (i = 0; i < prev_bindaddr_count; i++) { |
| 6736 | zfree(prev_bindaddr[i]); |
| 6737 | } |
| 6738 | } |
| 6739 | |
| 6740 | /* Create TCP and TLS event handlers */ |
| 6741 | if (createSocketAcceptHandler(&serverTL->ipfd, acceptTcpHandler) != C_OK) { |
| 6742 | serverPanic("Unrecoverable error creating TCP socket accept handler."); |
| 6743 | } |
| 6744 | if (createSocketAcceptHandler(&serverTL->tlsfd, acceptTLSHandler) != C_OK) { |
no test coverage detected