-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathquickjs-debugger-transport-win.c
130 lines (97 loc) · 3.04 KB
/
quickjs-debugger-transport-win.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include "quickjs-debugger.h"
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <winsock2.h>
struct js_transport_data {
int handle;
} js_transport_data;
static size_t js_transport_read(void *udata, char *buffer, size_t length) {
struct js_transport_data* data = (struct js_transport_data *)udata;
if (data->handle <= 0)
return -1;
if (length == 0)
return -2;
if (buffer == NULL)
return -3;
//ssize_t ret = read(data->handle, (void *)buffer, length);
ssize_t ret = recv( data->handle, (void*)buffer, length, 0);
if (ret == SOCKET_ERROR )
return -4;
if (ret == 0)
return -5;
if (ret > length)
return -6;
return ret;
}
static size_t js_transport_write(void *udata, const char *buffer, size_t length) {
struct js_transport_data* data = (struct js_transport_data *)udata;
if (data->handle <= 0)
return -1;
if (length == 0)
return -2;
if (buffer == NULL) {
return -3;
}
//size_t ret = write(data->handle, (const void *) buffer, length);
size_t ret = send( data->handle, (const void *) buffer, length, 0);
if (ret <= 0 || ret > (ssize_t) length)
return -4;
return ret;
}
static size_t js_transport_peek(void *udata) {
WSAPOLLFD fds[1];
int poll_rc;
struct js_transport_data* data = (struct js_transport_data *)udata;
if (data->handle <= 0)
return -1;
fds[0].fd = data->handle;
fds[0].events = POLLIN;
fds[0].revents = 0;
poll_rc = WSAPoll(fds, 1, 0);
if (poll_rc < 0)
return -2;
if (poll_rc > 1)
return -3;
// no data
if (poll_rc == 0)
return 0;
// has data
return 1;
}
static void js_transport_close(JSContext* ctx, void *udata) {
struct js_transport_data* data = (struct js_transport_data *)udata;
if (data->handle <= 0)
return;
close(data->handle);
data->handle = 0;
free(udata);
WSACleanup();
}
void js_debugger_connect(JSContext *ctx, char *address) {
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
char* port_string = strstr(address, ":");
assert(port_string);
int port = atoi(port_string + 1);
assert(port);
int client = socket(AF_INET, SOCK_STREAM, 0);
assert(client > 0);
char host_string[256];
strcpy(host_string, address);
host_string[port_string - address] = 0;
struct hostent *host = gethostbyname(host_string);
assert(host);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
memcpy((char *)&addr.sin_addr.s_addr, (char *)host->h_addr, host->h_length);
addr.sin_port = htons(port);
//__asm__ volatile("int $0x03");
assert(!connect(client, (const struct sockaddr *)&addr, sizeof(addr)));
struct js_transport_data *data = (struct js_transport_data *)malloc(sizeof(struct js_transport_data));
data->handle = client;
js_debugger_attach(ctx, js_transport_read, js_transport_write, js_transport_peek, js_transport_close, data);
}