31#if !defined(WIN32_LEAN_AND_MEAN)
32#define WIN32_LEAN_AND_MEAN
38#if defined(__MINGW32__) || defined(__MINGW64__)
39#if !defined(_WIN32_WINNT)
40#define _WIN32_WINNT 0x0501
52#pragma comment (lib, "Ws2_32.lib")
55#if !defined(DUK_DEBUG_PORT)
56#define DUK_DEBUG_PORT 9091
58#if !defined(DUK_DEBUG_ADDRESS)
59#define DUK_DEBUG_ADDRESS "0.0.0.0"
61#define DUK__STRINGIFY_HELPER(x) #x
62#define DUK__STRINGIFY(x) DUK__STRINGIFY_HELPER(x)
78 struct addrinfo hints;
79 struct addrinfo *result =
NULL;
82 memset((
void *) &wsa_data, 0,
sizeof(wsa_data));
83 memset((
void *) &hints, 0,
sizeof(hints));
85 rc = WSAStartup(MAKEWORD(2, 2), &wsa_data);
87 fprintf(stderr,
"%s: WSAStartup() failed: %d\n", __FILE__, rc);
93 hints.ai_family = AF_UNSPEC;
94 hints.ai_socktype = SOCK_STREAM;
95 hints.ai_protocol = IPPROTO_TCP;
96 hints.ai_flags = AI_PASSIVE;
100 fprintf(stderr,
"%s: getaddrinfo() failed: %d\n", __FILE__, rc);
105 server_sock =
socket(result->ai_family, result->ai_socktype, result->ai_protocol);
107 fprintf(stderr,
"%s: socket() failed with error: %ld\n",
108 __FILE__, (
long) WSAGetLastError());
113 rc = bind(
server_sock, result->ai_addr, (
int) result->ai_addrlen);
114 if (rc == SOCKET_ERROR) {
115 fprintf(stderr,
"%s: bind() failed with error: %ld\n",
116 __FILE__, (
long) WSAGetLastError());
122 if (rc == SOCKET_ERROR) {
123 fprintf(stderr,
"%s: listen() failed with error: %ld\n",
124 __FILE__, (
long) WSAGetLastError());
129 if (result !=
NULL) {
130 freeaddrinfo(result);
136 if (result !=
NULL) {
137 freeaddrinfo(result);
167 fprintf(stderr,
"%s: no server socket, skip waiting for connection\n",
177 fprintf(stderr,
"Waiting for debug connection on port %d\n", (
int)
DUK_DEBUG_PORT);
182 fprintf(stderr,
"%s: accept() failed with error %ld, skip waiting for connection\n",
183 __FILE__, (
long) WSAGetLastError());
188 fprintf(stderr,
"Debug connection established\n");
219#if defined(DEBUG_PRINTS)
220 fprintf(stderr,
"%s: udata=%p, buffer=%p, length=%ld\n",
221 __FUNCTION__, (
void *) udata, (
void *) buffer, (
long) length);
231 fprintf(stderr,
"%s: read request length == 0, closing connection\n",
237 if (buffer ==
NULL) {
239 fprintf(stderr,
"%s: read request buffer == NULL, closing connection\n",
249 ret = recv(
client_sock, (
void *) buffer, (
int) length, 0);
251 fprintf(stderr,
"%s: debug read failed, error %d, closing connection\n",
255 }
else if (ret == 0) {
256 fprintf(stderr,
"%s: debug read failed, ret == 0 (EOF), closing connection\n",
260 }
else if (ret > (
int) length) {
261 fprintf(stderr,
"%s: debug read failed, ret too large (%ld > %ld), closing connection\n",
262 __FILE__, (
long) ret, (
long) length);
283#if defined(DEBUG_PRINTS)
284 fprintf(stderr,
"%s: udata=%p, buffer=%p, length=%ld\n",
285 __FUNCTION__, (
void *) udata, (
const void *) buffer, (
long) length);
295 fprintf(stderr,
"%s: write request length == 0, closing connection\n",
301 if (buffer ==
NULL) {
303 fprintf(stderr,
"%s: write request buffer == NULL, closing connection\n",
313 ret = send(
client_sock, (
const void *) buffer, (
int) length, 0);
314 if (ret <= 0 || ret > (
int) length) {
315 fprintf(stderr,
"%s: debug write failed, ret %d, closing connection\n",
337#if defined(DEBUG_PRINTS)
338 fprintf(stderr,
"%s: udata=%p\n", __FUNCTION__, (
void *) udata);
349 fprintf(stderr,
"%s: ioctlsocket() returned %d, closing connection\n",
373#if defined(DEBUG_PRINTS)
374 fprintf(stderr,
"%s: udata=%p\n", __FUNCTION__, (
void *) udata);
395#if defined(DEBUG_PRINTS)
396 fprintf(stderr,
"%s: udata=%p\n", __FUNCTION__, (
void *) udata);
413#undef DUK__STRINGIFY_HELPER
static SOCKET client_sock
void duk_trans_socket_read_flush_cb(void *udata)
static SOCKET server_sock
duk_size_t duk_trans_socket_read_cb(void *udata, char *buffer, duk_size_t length)
#define DUK__STRINGIFY(x)
void duk_trans_socket_finish(void)
duk_size_t duk_trans_socket_write_cb(void *udata, const char *buffer, duk_size_t length)
#define DUK_DEBUG_ADDRESS
void duk_trans_socket_write_flush_cb(void *udata)
duk_size_t duk_trans_socket_peek_cb(void *udata)
void duk_trans_socket_waitconn(void)
void duk_trans_socket_init(void)