Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(120)

Side by Side Diff: runtime/bin/socket_win.cc

Issue 9720045: Extend dart:io error handling to all socket functions (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/bin/socket_macos.cc ('k') | runtime/bin/utils.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include <winsock2.h> 5 #include <winsock2.h>
6 #include <ws2tcpip.h> 6 #include <ws2tcpip.h>
7 #include <mswsock.h> 7 #include <mswsock.h>
8 8
9 #include "bin/builtin.h" 9 #include "bin/builtin.h"
10 #include "bin/eventhandler.h" 10 #include "bin/eventhandler.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 fprintf(stderr, "Error getsockname: %s\n", strerror(errno)); 50 fprintf(stderr, "Error getsockname: %s\n", strerror(errno));
51 return 0; 51 return 0;
52 } 52 }
53 return ntohs(socket_address.sin_port); 53 return ntohs(socket_address.sin_port);
54 } 54 }
55 55
56 56
57 intptr_t Socket::CreateConnect(const char* host, const intptr_t port) { 57 intptr_t Socket::CreateConnect(const char* host, const intptr_t port) {
58 SOCKET s = socket(AF_INET, SOCK_STREAM, 0); 58 SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
59 if (s == INVALID_SOCKET) { 59 if (s == INVALID_SOCKET) {
60 fprintf(stderr, "Error CreateConnect: %d\n", WSAGetLastError());
61 return -1; 60 return -1;
62 } 61 }
63 62
64 linger l; 63 linger l;
65 l.l_onoff = 1; 64 l.l_onoff = 1;
66 l.l_linger = 10; 65 l.l_linger = 10;
67 int status = setsockopt(s, 66 int status = setsockopt(s,
68 SOL_SOCKET, 67 SOL_SOCKET,
69 SO_LINGER, 68 SO_LINGER,
70 reinterpret_cast<char*>(&l), 69 reinterpret_cast<char*>(&l),
71 sizeof(l)); 70 sizeof(l));
72 if (status != NO_ERROR) { 71 if (status != NO_ERROR) {
73 FATAL("Failed setting SO_LINGER on socket"); 72 FATAL("Failed setting SO_LINGER on socket");
74 } 73 }
75 74
76 // Perform a name lookup for an IPv4 address. 75 // Perform a name lookup for an IPv4 address.
77 struct addrinfo hints; 76 struct addrinfo hints;
78 memset(&hints, 0, sizeof(hints)); 77 memset(&hints, 0, sizeof(hints));
79 hints.ai_family = AF_INET; 78 hints.ai_family = AF_INET;
80 hints.ai_socktype = SOCK_STREAM; 79 hints.ai_socktype = SOCK_STREAM;
81 hints.ai_protocol = IPPROTO_TCP; 80 hints.ai_protocol = IPPROTO_TCP;
82 struct addrinfo* result = NULL; 81 struct addrinfo* result = NULL;
83 status = getaddrinfo(host, 0, &hints, &result); 82 status = getaddrinfo(host, 0, &hints, &result);
84 if (status != NO_ERROR) { 83 if (status != NO_ERROR) {
85 fprintf(stderr, "getaddrinfo failed with error: %d\n", status);
86 return -1; 84 return -1;
87 } 85 }
88 86
89 // Copy IPv4 address and set the port. 87 // Copy IPv4 address and set the port.
90 struct sockaddr_in server_address; 88 struct sockaddr_in server_address;
91 memcpy(&server_address, 89 memcpy(&server_address,
92 reinterpret_cast<sockaddr_in *>(result->ai_addr), 90 reinterpret_cast<sockaddr_in *>(result->ai_addr),
93 sizeof(server_address)); 91 sizeof(server_address));
94 server_address.sin_port = htons(port); 92 server_address.sin_port = htons(port);
95 freeaddrinfo(result); // Free data allocated by getaddrinfo. 93 freeaddrinfo(result); // Free data allocated by getaddrinfo.
96 status = connect( 94 status = connect(
97 s, 95 s,
98 reinterpret_cast<struct sockaddr*>(&server_address), 96 reinterpret_cast<struct sockaddr*>(&server_address),
99 sizeof(server_address)); 97 sizeof(server_address));
100 if (status == SOCKET_ERROR) { 98 if (status == SOCKET_ERROR) {
101 fprintf(stderr, "Error CreateConnect: %d\n", WSAGetLastError()); 99 DWORD rc = WSAGetLastError();
102 closesocket(s); 100 closesocket(s);
101 SetLastError(rc);
103 return -1; 102 return -1;
104 } 103 }
105 104
106 ClientSocket* client_socket = new ClientSocket(s); 105 ClientSocket* client_socket = new ClientSocket(s);
107 return reinterpret_cast<intptr_t>(client_socket); 106 return reinterpret_cast<intptr_t>(client_socket);
108 } 107 }
109 108
110 109
110 void Socket::GetError(intptr_t fd, OSError* os_error) {
111 Handle* handle = reinterpret_cast<Handle*>(fd);
112 os_error->SetCodeAndMessage(OSError::kSystem, handle->last_error());
113 }
114
115
111 intptr_t Socket::GetStdioHandle(int num) { 116 intptr_t Socket::GetStdioHandle(int num) {
112 HANDLE handle; 117 HANDLE handle;
113 switch (num) { 118 switch (num) {
114 case 0: 119 case 0:
115 handle = GetStdHandle(STD_INPUT_HANDLE); 120 handle = GetStdHandle(STD_INPUT_HANDLE);
116 break; 121 break;
117 case 1: 122 case 1:
118 handle = GetStdHandle(STD_OUTPUT_HANDLE); 123 handle = GetStdHandle(STD_OUTPUT_HANDLE);
119 break; 124 break;
120 case 2: 125 case 2:
121 handle = GetStdHandle(STD_ERROR_HANDLE); 126 handle = GetStdHandle(STD_ERROR_HANDLE);
122 break; 127 break;
123 default: UNREACHABLE(); 128 default: UNREACHABLE();
124 } 129 }
125 if (handle == INVALID_HANDLE_VALUE) { 130 if (handle == INVALID_HANDLE_VALUE) {
126 fprintf(stderr, "Error GetStdHandle: %d\n", GetLastError());
127 return -1; 131 return -1;
128 } 132 }
129 FileHandle* file_handle = new FileHandle(handle); 133 FileHandle* file_handle = new FileHandle(handle);
130 if (file_handle == NULL) return -1; 134 if (file_handle == NULL) return -1;
131 file_handle->MarkDoesNotSupportOverlappedIO(); 135 file_handle->MarkDoesNotSupportOverlappedIO();
132 return reinterpret_cast<intptr_t>(file_handle); 136 return reinterpret_cast<intptr_t>(file_handle);
133 } 137 }
134 138
135 139
136 intptr_t ServerSocket::Accept(intptr_t fd) { 140 intptr_t ServerSocket::Accept(intptr_t fd) {
(...skipping 14 matching lines...) Expand all
151 hints.ai_family = AF_INET; 155 hints.ai_family = AF_INET;
152 hints.ai_socktype = SOCK_STREAM; 156 hints.ai_socktype = SOCK_STREAM;
153 hints.ai_protocol = IPPROTO_TCP; 157 hints.ai_protocol = IPPROTO_TCP;
154 struct addrinfo* info = NULL; 158 struct addrinfo* info = NULL;
155 int status = getaddrinfo(host, 0, &hints, &info); 159 int status = getaddrinfo(host, 0, &hints, &info);
156 if (status != 0) { 160 if (status != 0) {
157 ASSERT(*os_error == NULL); 161 ASSERT(*os_error == NULL);
158 *os_error = new OSError(status, 162 *os_error = new OSError(status,
159 gai_strerror(status), 163 gai_strerror(status),
160 OSError::kGetAddressInfo); 164 OSError::kGetAddressInfo);
161 (*os_error)->set_code(status);
162 (*os_error)->SetMessage(gai_strerror(status));
163 return NULL; 165 return NULL;
164 } 166 }
165 // Convert the address into IPv4 dotted decimal notation. 167 // Convert the address into IPv4 dotted decimal notation.
166 char* buffer = reinterpret_cast<char*>(malloc(INET_ADDRSTRLEN)); 168 char* buffer = reinterpret_cast<char*>(malloc(INET_ADDRSTRLEN));
167 sockaddr_in *sockaddr = reinterpret_cast<sockaddr_in *>(info->ai_addr); 169 sockaddr_in *sockaddr = reinterpret_cast<sockaddr_in *>(info->ai_addr);
168 const char* result = inet_ntop(AF_INET, 170 const char* result = inet_ntop(AF_INET,
169 reinterpret_cast<void *>(&sockaddr->sin_addr), 171 reinterpret_cast<void *>(&sockaddr->sin_addr),
170 buffer, 172 buffer,
171 INET_ADDRSTRLEN); 173 INET_ADDRSTRLEN);
172 if (result == NULL) { 174 if (result == NULL) {
173 free(buffer); 175 free(buffer);
174 return NULL; 176 return NULL;
175 } 177 }
176 ASSERT(result == buffer); 178 ASSERT(result == buffer);
177 return buffer; 179 return buffer;
178 } 180 }
179 181
180 182
181 intptr_t ServerSocket::CreateBindListen(const char* host, 183 intptr_t ServerSocket::CreateBindListen(const char* host,
182 intptr_t port, 184 intptr_t port,
183 intptr_t backlog) { 185 intptr_t backlog) {
184 SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 186 SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
185 if (s == INVALID_SOCKET) { 187 if (s == INVALID_SOCKET) {
186 fprintf(stderr, "Error CreateBindListen: %d\n", WSAGetLastError());
187 return -1; 188 return -1;
188 } 189 }
189 190
190 BOOL optval = true; 191 BOOL optval = true;
191 int status = setsockopt(s, 192 int status = setsockopt(s,
192 SOL_SOCKET, 193 SOL_SOCKET,
193 SO_REUSEADDR, 194 SO_REUSEADDR,
194 reinterpret_cast<const char*>(&optval), 195 reinterpret_cast<const char*>(&optval),
195 sizeof(optval)); 196 sizeof(optval));
196 if (status == SOCKET_ERROR) { 197 if (status == SOCKET_ERROR) {
197 fprintf(stderr, "Error CreateBindListen: %d\n", WSAGetLastError()); 198 DWORD rc = WSAGetLastError();
198 closesocket(s); 199 closesocket(s);
200 SetLastError(rc);
199 return -1; 201 return -1;
200 } 202 }
201 203
202 sockaddr_in addr; 204 sockaddr_in addr;
203 memset(&addr, 0, sizeof(addr)); 205 memset(&addr, 0, sizeof(addr));
204 addr.sin_family = AF_INET; 206 addr.sin_family = AF_INET;
205 addr.sin_addr.s_addr = inet_addr(host); 207 addr.sin_addr.s_addr = inet_addr(host);
206 addr.sin_port = htons(port); 208 addr.sin_port = htons(port);
207 status = bind(s, 209 status = bind(s,
208 reinterpret_cast<struct sockaddr *>(&addr), 210 reinterpret_cast<struct sockaddr *>(&addr),
209 sizeof(addr)); 211 sizeof(addr));
210 if (status == SOCKET_ERROR) { 212 if (status == SOCKET_ERROR) {
211 fprintf(stderr, "Error CreateBindListen: %d\n", WSAGetLastError()); 213 DWORD rc = WSAGetLastError();
212 closesocket(s); 214 closesocket(s);
215 SetLastError(rc);
213 return -1; 216 return -1;
214 } 217 }
215 218
216 status = listen(s, backlog); 219 status = listen(s, backlog);
217 if (status == SOCKET_ERROR) { 220 if (status == SOCKET_ERROR) {
218 fprintf(stderr, "Error socket listen: %d\n", WSAGetLastError()); 221 DWORD rc = WSAGetLastError();
219 closesocket(s); 222 closesocket(s);
223 SetLastError(rc);
220 return -1; 224 return -1;
221 } 225 }
222 226
223 ListenSocket* listen_socket = new ListenSocket(s); 227 ListenSocket* listen_socket = new ListenSocket(s);
224 return reinterpret_cast<intptr_t>(listen_socket); 228 return reinterpret_cast<intptr_t>(listen_socket);
225 } 229 }
OLDNEW
« no previous file with comments | « runtime/bin/socket_macos.cc ('k') | runtime/bin/utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698