| 5652 | } |
| 5653 | |
| 5654 | int changeBindAddr(sds *addrlist, int addrlist_len) { |
| 5655 | int i; |
| 5656 | int result = C_OK; |
| 5657 | |
| 5658 | char *prev_bindaddr[CONFIG_BINDADDR_MAX]; |
| 5659 | int prev_bindaddr_count; |
| 5660 | |
| 5661 | /* Close old TCP and TLS servers */ |
| 5662 | closeSocketListeners(&server.ipfd); |
| 5663 | closeSocketListeners(&server.tlsfd); |
| 5664 | |
| 5665 | /* Keep previous settings */ |
| 5666 | prev_bindaddr_count = server.bindaddr_count; |
| 5667 | memcpy(prev_bindaddr, server.bindaddr, sizeof(server.bindaddr)); |
| 5668 | |
| 5669 | /* Copy new settings */ |
| 5670 | memset(server.bindaddr, 0, sizeof(server.bindaddr)); |
| 5671 | for (i = 0; i < addrlist_len; i++) { |
| 5672 | server.bindaddr[i] = zstrdup(addrlist[i]); |
| 5673 | } |
| 5674 | server.bindaddr_count = addrlist_len; |
| 5675 | |
| 5676 | /* Bind to the new port */ |
| 5677 | if ((server.port != 0 && listenToPort(server.port, &server.ipfd) != C_OK) || |
| 5678 | (server.tls_port != 0 && listenToPort(server.tls_port, &server.tlsfd) != C_OK)) { |
| 5679 | serverLog(LL_WARNING, "Failed to bind, trying to restore old listening sockets."); |
| 5680 | |
| 5681 | /* Restore old bind addresses */ |
| 5682 | for (i = 0; i < addrlist_len; i++) { |
| 5683 | zfree(server.bindaddr[i]); |
| 5684 | } |
| 5685 | memcpy(server.bindaddr, prev_bindaddr, sizeof(server.bindaddr)); |
| 5686 | server.bindaddr_count = prev_bindaddr_count; |
| 5687 | |
| 5688 | /* Re-Listen TCP and TLS */ |
| 5689 | server.ipfd.count = 0; |
| 5690 | if (server.port != 0 && listenToPort(server.port, &server.ipfd) != C_OK) { |
| 5691 | serverPanic("Failed to restore old listening sockets."); |
| 5692 | } |
| 5693 | |
| 5694 | server.tlsfd.count = 0; |
| 5695 | if (server.tls_port != 0 && listenToPort(server.tls_port, &server.tlsfd) != C_OK) { |
| 5696 | serverPanic("Failed to restore old listening sockets."); |
| 5697 | } |
| 5698 | |
| 5699 | result = C_ERR; |
| 5700 | } else { |
| 5701 | /* Free old bind addresses */ |
| 5702 | for (i = 0; i < prev_bindaddr_count; i++) { |
| 5703 | zfree(prev_bindaddr[i]); |
| 5704 | } |
| 5705 | } |
| 5706 | |
| 5707 | /* Create TCP and TLS event handlers */ |
| 5708 | if (createSocketAcceptHandler(&server.ipfd, acceptTcpHandler) != C_OK) { |
| 5709 | serverPanic("Unrecoverable error creating TCP socket accept handler."); |
| 5710 | } |
| 5711 | if (createSocketAcceptHandler(&server.tlsfd, acceptTLSHandler) != C_OK) { |
no test coverage detected