| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/web_socket_proxy.h" | 5 #include "chrome/browser/chromeos/web_socket_proxy.h" |
| 6 | 6 |
| 7 #include <stdio.h> | 7 #include <stdio.h> |
| 8 #include <stdlib.h> | 8 #include <stdlib.h> |
| 9 #include <string.h> | 9 #include <string.h> |
| 10 | 10 |
| (...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 return; | 834 return; |
| 835 } | 835 } |
| 836 { | 836 { |
| 837 int on = 1; | 837 int on = 1; |
| 838 setsockopt(listening_sock_, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); | 838 setsockopt(listening_sock_, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); |
| 839 } | 839 } |
| 840 | 840 |
| 841 struct sockaddr_in addr; | 841 struct sockaddr_in addr; |
| 842 memset(&addr, 0, sizeof(addr)); | 842 memset(&addr, 0, sizeof(addr)); |
| 843 addr.sin_family = AF_INET; | 843 addr.sin_family = AF_INET; |
| 844 addr.sin_port = htons(0); // let OS allocatate ephemeral port number. | 844 // Let the OS allocate a port number. |
| 845 addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); | 845 addr.sin_port = base::HostToNet16(0); |
| 846 addr.sin_addr.s_addr = base::HostToNet32(INADDR_LOOPBACK); |
| 846 if (bind(listening_sock_, | 847 if (bind(listening_sock_, |
| 847 reinterpret_cast<struct sockaddr*>(&addr), | 848 reinterpret_cast<struct sockaddr*>(&addr), |
| 848 sizeof(addr))) { | 849 sizeof(addr))) { |
| 849 LOG(ERROR) << "WebSocketProxy: Failed to bind server socket"; | 850 LOG(ERROR) << "WebSocketProxy: Failed to bind server socket"; |
| 850 return; | 851 return; |
| 851 } | 852 } |
| 852 if (listen(listening_sock_, 12)) { | 853 if (listen(listening_sock_, 12)) { |
| 853 LOG(ERROR) << "WebSocketProxy: Failed to listen server socket"; | 854 LOG(ERROR) << "WebSocketProxy: Failed to listen server socket"; |
| 854 return; | 855 return; |
| 855 } | 856 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 876 LOG(ERROR) << "WebSocketProxy: Failed to create socket"; | 877 LOG(ERROR) << "WebSocketProxy: Failed to create socket"; |
| 877 return; | 878 return; |
| 878 } | 879 } |
| 879 { | 880 { |
| 880 int on = 1; | 881 int on = 1; |
| 881 setsockopt(listening_sock_, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); | 882 setsockopt(listening_sock_, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); |
| 882 } | 883 } |
| 883 const int kPort = 10101; | 884 const int kPort = 10101; |
| 884 memset(&addr, 0, sizeof(addr)); | 885 memset(&addr, 0, sizeof(addr)); |
| 885 addr.sin_family = AF_INET; | 886 addr.sin_family = AF_INET; |
| 886 addr.sin_port = htons(kPort); | 887 addr.sin_port = base::HostToNet16(kPort); |
| 887 addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); | 888 addr.sin_addr.s_addr = base::HostToNet32(INADDR_LOOPBACK); |
| 888 if (bind(extra_listening_sock_, | 889 if (bind(extra_listening_sock_, |
| 889 reinterpret_cast<struct sockaddr*>(&addr), | 890 reinterpret_cast<struct sockaddr*>(&addr), |
| 890 sizeof(addr))) { | 891 sizeof(addr))) { |
| 891 LOG(ERROR) << "WebSocketProxy: Failed to bind server socket"; | 892 LOG(ERROR) << "WebSocketProxy: Failed to bind server socket"; |
| 892 return; | 893 return; |
| 893 } | 894 } |
| 894 if (listen(extra_listening_sock_, 12)) { | 895 if (listen(extra_listening_sock_, 12)) { |
| 895 LOG(ERROR) << "WebSocketProxy: Failed to listen server socket"; | 896 LOG(ERROR) << "WebSocketProxy: Failed to listen server socket"; |
| 896 return; | 897 return; |
| 897 } | 898 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 927 | 928 |
| 928 memset(&addr, 0, sizeof(addr)); | 929 memset(&addr, 0, sizeof(addr)); |
| 929 socklen_t addr_len = sizeof(addr); | 930 socklen_t addr_len = sizeof(addr); |
| 930 if (getsockname( | 931 if (getsockname( |
| 931 listening_sock_, reinterpret_cast<struct sockaddr*>(&addr), &addr_len)) { | 932 listening_sock_, reinterpret_cast<struct sockaddr*>(&addr), &addr_len)) { |
| 932 LOG(ERROR) << "Failed to determine listening port"; | 933 LOG(ERROR) << "Failed to determine listening port"; |
| 933 return; | 934 return; |
| 934 } | 935 } |
| 935 BrowserThread::PostTask( | 936 BrowserThread::PostTask( |
| 936 BrowserThread::UI, FROM_HERE, | 937 BrowserThread::UI, FROM_HERE, |
| 937 base::Bind(&SendNotification, ntohs(addr.sin_port))); | 938 base::Bind(&SendNotification, base::NetToHost16(addr.sin_port))); |
| 938 | 939 |
| 939 LOG(INFO) << "WebSocketProxy: Starting event dispatch loop."; | 940 LOG(INFO) << "WebSocketProxy: Starting event dispatch loop."; |
| 940 event_base_dispatch(evbase_); | 941 event_base_dispatch(evbase_); |
| 941 if (shutdown_requested_) | 942 if (shutdown_requested_) |
| 942 LOG(INFO) << "WebSocketProxy: Event dispatch loop terminated upon request"; | 943 LOG(INFO) << "WebSocketProxy: Event dispatch loop terminated upon request"; |
| 943 else | 944 else |
| 944 LOG(ERROR) << "WebSocketProxy: Event dispatch loop terminated unexpectedly"; | 945 LOG(ERROR) << "WebSocketProxy: Event dispatch loop terminated unexpectedly"; |
| 945 CloseAll(); | 946 CloseAll(); |
| 946 } | 947 } |
| 947 | 948 |
| (...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1567 // There seems to be no easy API to perform only "local" part of | 1568 // There seems to be no easy API to perform only "local" part of |
| 1568 // getaddrinfo resolution. Hence this hack for "localhost". | 1569 // getaddrinfo resolution. Hence this hack for "localhost". |
| 1569 if (cs->destname_ == "localhost") | 1570 if (cs->destname_ == "localhost") |
| 1570 cs->destname_ = "127.0.0.1"; | 1571 cs->destname_ = "127.0.0.1"; |
| 1571 } | 1572 } |
| 1572 if (cs->destaddr_.empty()) | 1573 if (cs->destaddr_.empty()) |
| 1573 cs->destaddr_ = cs->destname_; | 1574 cs->destaddr_ = cs->destname_; |
| 1574 { | 1575 { |
| 1575 struct sockaddr_in sa; | 1576 struct sockaddr_in sa; |
| 1576 memset(&sa, 0, sizeof(sa)); | 1577 memset(&sa, 0, sizeof(sa)); |
| 1577 sa.sin_port = htons(cs->destport_); | 1578 sa.sin_port = base::HostToNet16(cs->destport_); |
| 1578 if (inet_pton(sa.sin_family = AF_INET, | 1579 if (inet_pton(sa.sin_family = AF_INET, |
| 1579 cs->destaddr_.c_str(), | 1580 cs->destaddr_.c_str(), |
| 1580 &sa.sin_addr) == 1) { | 1581 &sa.sin_addr) == 1) { |
| 1581 // valid IPv4 address supplied. | 1582 // valid IPv4 address supplied. |
| 1582 if (cs->TryConnectDest((struct sockaddr*)&sa, sizeof(sa))) { | 1583 if (cs->TryConnectDest((struct sockaddr*)&sa, sizeof(sa))) { |
| 1583 cs->phase_ = PHASE_WAIT_DESTCONNECT; | 1584 cs->phase_ = PHASE_WAIT_DESTCONNECT; |
| 1584 return; | 1585 return; |
| 1585 } | 1586 } |
| 1586 } | 1587 } |
| 1587 } | 1588 } |
| 1588 { | 1589 { |
| 1589 if (cs->destaddr_.size() >= 2 && | 1590 if (cs->destaddr_.size() >= 2 && |
| 1590 cs->destaddr_[0] == '[' && | 1591 cs->destaddr_[0] == '[' && |
| 1591 cs->destaddr_[cs->destaddr_.size() - 1] == ']') { | 1592 cs->destaddr_[cs->destaddr_.size() - 1] == ']') { |
| 1592 // Literal IPv6 address in brackets. | 1593 // Literal IPv6 address in brackets. |
| 1593 cs->destaddr_ = | 1594 cs->destaddr_ = |
| 1594 cs->destaddr_.substr(1, cs->destaddr_.size() - 2); | 1595 cs->destaddr_.substr(1, cs->destaddr_.size() - 2); |
| 1595 } | 1596 } |
| 1596 struct sockaddr_in6 sa; | 1597 struct sockaddr_in6 sa; |
| 1597 memset(&sa, 0, sizeof(sa)); | 1598 memset(&sa, 0, sizeof(sa)); |
| 1598 sa.sin6_port = htons(cs->destport_); | 1599 sa.sin6_port = base::HostToNet16(cs->destport_); |
| 1599 if (inet_pton(sa.sin6_family = AF_INET6, | 1600 if (inet_pton(sa.sin6_family = AF_INET6, |
| 1600 cs->destaddr_.c_str(), | 1601 cs->destaddr_.c_str(), |
| 1601 &sa.sin6_addr) == 1) { | 1602 &sa.sin6_addr) == 1) { |
| 1602 // valid IPv6 address supplied. | 1603 // valid IPv6 address supplied. |
| 1603 if (cs->TryConnectDest((struct sockaddr*)&sa, sizeof(sa))) { | 1604 if (cs->TryConnectDest((struct sockaddr*)&sa, sizeof(sa))) { |
| 1604 cs->phase_ = PHASE_WAIT_DESTCONNECT; | 1605 cs->phase_ = PHASE_WAIT_DESTCONNECT; |
| 1605 return; | 1606 return; |
| 1606 } | 1607 } |
| 1607 } | 1608 } |
| 1608 } | 1609 } |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1747 if (cs->phase_ != PHASE_WAIT_DESTCONNECT) | 1748 if (cs->phase_ != PHASE_WAIT_DESTCONNECT) |
| 1748 return; | 1749 return; |
| 1749 if (result == DNS_ERR_NONE && | 1750 if (result == DNS_ERR_NONE && |
| 1750 count >= 1 && | 1751 count >= 1 && |
| 1751 addr_list != NULL && | 1752 addr_list != NULL && |
| 1752 type == DNS_IPv4_A) { | 1753 type == DNS_IPv4_A) { |
| 1753 for (int i = 0; i < count; ++i) { | 1754 for (int i = 0; i < count; ++i) { |
| 1754 struct sockaddr_in sa; | 1755 struct sockaddr_in sa; |
| 1755 memset(&sa, 0, sizeof(sa)); | 1756 memset(&sa, 0, sizeof(sa)); |
| 1756 sa.sin_family = AF_INET; | 1757 sa.sin_family = AF_INET; |
| 1757 sa.sin_port = htons(cs->destport_); | 1758 sa.sin_port = base::HostToNet16(cs->destport_); |
| 1758 DCHECK(sizeof(sa.sin_addr) == sizeof(struct in_addr)); | 1759 DCHECK(sizeof(sa.sin_addr) == sizeof(struct in_addr)); |
| 1759 memcpy(&sa.sin_addr, | 1760 memcpy(&sa.sin_addr, |
| 1760 static_cast<struct in_addr*>(addr_list) + i, | 1761 static_cast<struct in_addr*>(addr_list) + i, |
| 1761 sizeof(sa.sin_addr)); | 1762 sizeof(sa.sin_addr)); |
| 1762 if (cs->TryConnectDest((struct sockaddr*)&sa, sizeof(sa))) | 1763 if (cs->TryConnectDest((struct sockaddr*)&sa, sizeof(sa))) |
| 1763 return; | 1764 return; |
| 1764 } | 1765 } |
| 1765 } | 1766 } |
| 1766 cs->destresolution_ipv4_failed_ = true; | 1767 cs->destresolution_ipv4_failed_ = true; |
| 1767 if (cs->destresolution_ipv4_failed_ && cs->destresolution_ipv6_failed_) | 1768 if (cs->destresolution_ipv4_failed_ && cs->destresolution_ipv6_failed_) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1778 if (cs->phase_ != PHASE_WAIT_DESTCONNECT) | 1779 if (cs->phase_ != PHASE_WAIT_DESTCONNECT) |
| 1779 return; | 1780 return; |
| 1780 if (result == DNS_ERR_NONE && | 1781 if (result == DNS_ERR_NONE && |
| 1781 count >= 1 && | 1782 count >= 1 && |
| 1782 addr_list != NULL && | 1783 addr_list != NULL && |
| 1783 type == DNS_IPv6_AAAA) { | 1784 type == DNS_IPv6_AAAA) { |
| 1784 for (int i = 0; i < count; ++i) { | 1785 for (int i = 0; i < count; ++i) { |
| 1785 struct sockaddr_in6 sa; | 1786 struct sockaddr_in6 sa; |
| 1786 memset(&sa, 0, sizeof(sa)); | 1787 memset(&sa, 0, sizeof(sa)); |
| 1787 sa.sin6_family = AF_INET6; | 1788 sa.sin6_family = AF_INET6; |
| 1788 sa.sin6_port = htons(cs->destport_); | 1789 sa.sin6_port = base::HostToNet16(cs->destport_); |
| 1789 DCHECK(sizeof(sa.sin6_addr) == sizeof(struct in6_addr)); | 1790 DCHECK(sizeof(sa.sin6_addr) == sizeof(struct in6_addr)); |
| 1790 memcpy(&sa.sin6_addr, | 1791 memcpy(&sa.sin6_addr, |
| 1791 static_cast<struct in6_addr*>(addr_list) + i, | 1792 static_cast<struct in6_addr*>(addr_list) + i, |
| 1792 sizeof(sa.sin6_addr)); | 1793 sizeof(sa.sin6_addr)); |
| 1793 if (cs->TryConnectDest((struct sockaddr*)&sa, sizeof(sa))) | 1794 if (cs->TryConnectDest((struct sockaddr*)&sa, sizeof(sa))) |
| 1794 return; | 1795 return; |
| 1795 } | 1796 } |
| 1796 } | 1797 } |
| 1797 cs->destresolution_ipv6_failed_ = true; | 1798 cs->destresolution_ipv6_failed_ = true; |
| 1798 if (cs->destresolution_ipv4_failed_ && cs->destresolution_ipv6_failed_) | 1799 if (cs->destresolution_ipv4_failed_ && cs->destresolution_ipv6_failed_) |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1898 | 1899 |
| 1899 void WebSocketProxy::Shutdown() { | 1900 void WebSocketProxy::Shutdown() { |
| 1900 static_cast<Serv*>(impl_)->Shutdown(); | 1901 static_cast<Serv*>(impl_)->Shutdown(); |
| 1901 } | 1902 } |
| 1902 | 1903 |
| 1903 void WebSocketProxy::OnNetworkChange() { | 1904 void WebSocketProxy::OnNetworkChange() { |
| 1904 static_cast<Serv*>(impl_)->OnNetworkChange(); | 1905 static_cast<Serv*>(impl_)->OnNetworkChange(); |
| 1905 } | 1906 } |
| 1906 | 1907 |
| 1907 } // namespace chromeos | 1908 } // namespace chromeos |
| OLD | NEW |