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 |