13#include <sys/socket.h>
14#include <netinet/in.h>
19#define ERROR_FROM_ERRNO(ctx) do { \
20 duk_error(ctx, DUK_ERR_ERROR, "%s (errno=%d)", strerror(errno), errno); \
27 rc = fcntl(fd, F_GETFL);
35 rc = fcntl(fd, F_SETFL, flags);
46 rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (
const void *) &val,
sizeof(val));
53static void set_nosigpipe(
duk_context *ctx,
int fd) {
58 rc = setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, (
const void *) &val,
sizeof(val));
69 struct sockaddr_in sockaddr;
71 struct in_addr **addr_list;
72 struct in_addr *addr_inet;
76 sock =
socket(AF_INET, SOCK_STREAM, 0);
84 set_nosigpipe(ctx, sock);
87 ent = gethostbyname(addr);
92 addr_list = (
struct in_addr **) ent->h_addr_list;
94 for (i = 0; addr_list[i]; i++) {
95 addr_inet = addr_list[i];
102 memset(&sockaddr, 0,
sizeof(sockaddr));
103 sockaddr.sin_family = AF_INET;
104 sockaddr.sin_port = htons(port);
105 sockaddr.sin_addr = *addr_inet;
107 rc = bind(sock, (
const struct sockaddr *) &sockaddr,
sizeof(sockaddr));
112 rc = listen(sock, 10 );
136 struct sockaddr_in addr;
139 memset(&addr, 0,
sizeof(addr));
140 addr.sin_family = AF_INET;
141 addrlen =
sizeof(addr);
143 rc = accept(sock, (
struct sockaddr *) &addr, &addrlen);
150 set_nosigpipe(ctx, sock);
153 if (addrlen ==
sizeof(addr)) {
154 uint32_t tmp = ntohl(addr.sin_addr.s_addr);
162 duk_push_sprintf(ctx,
"%d.%d.%d.%d", ((tmp >> 24) & 0xff), ((tmp >> 16) & 0xff), ((tmp >> 8) & 0xff), (tmp & 0xff));
178 struct sockaddr_in sockaddr;
180 struct in_addr **addr_list;
181 struct in_addr *addr_inet;
185 sock =
socket(AF_INET, SOCK_STREAM, 0);
192 set_nosigpipe(ctx, sock);
195 ent = gethostbyname(addr);
200 addr_list = (
struct in_addr **) ent->h_addr_list;
202 for (i = 0; addr_list[i]; i++) {
203 addr_inet = addr_list[i];
210 memset(&sockaddr, 0,
sizeof(sockaddr));
211 sockaddr.sin_family = AF_INET;
212 sockaddr.sin_port = htons(port);
213 sockaddr.sin_addr = *addr_inet;
215 rc = connect(sock, (
const struct sockaddr *) &sockaddr, (socklen_t)
sizeof(sockaddr));
217 if (errno == EINPROGRESS) {
219 fprintf(stderr,
"connect() returned EINPROGRESS as expected, need to poll writability\n");
237 rc = recvfrom(sock, (
void *) readbuf,
sizeof(readbuf), 0,
NULL,
NULL);
243 memcpy(data, readbuf, rc);
257 rc = sendto(sock, (
void *) data, len, 0,
NULL, 0);
DUK_EXTERNAL const char * duk_push_string(duk_context *ctx, const char *str)
DUK_EXTERNAL duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_idx, const char *key)
DUK_EXTERNAL void duk_push_int(duk_context *ctx, duk_int_t val)
DUK_EXTERNAL duk_idx_t duk_push_object(duk_context *ctx)
DUK_EXTERNAL const char * duk_push_sprintf(duk_context *ctx, const char *fmt,...)
DUK_EXTERNAL void duk_push_global_object(duk_context *ctx)
DUK_EXTERNAL void duk_put_function_list(duk_context *ctx, duk_idx_t obj_index, const duk_function_list_entry *funcs)
DUK_EXTERNAL const char * duk_to_string(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL void duk_pop(duk_context *ctx)
DUK_EXTERNAL duk_int_t duk_to_int(duk_context *ctx, duk_idx_t index)
DUK_EXTERNAL duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_idx)
#define duk_to_buffer(ctx, index, out_size)
#define duk_push_fixed_buffer(ctx, size)
static int socket_create_server_socket(duk_context *ctx)
static void set_reuseaddr(duk_context *ctx, int fd)
static int socket_connect(duk_context *ctx)
static int socket_read(duk_context *ctx)
static int socket_write(duk_context *ctx)
#define ERROR_FROM_ERRNO(ctx)
static void set_nonblocking(duk_context *ctx, int fd)
void socket_register(duk_context *ctx)
static int socket_accept(duk_context *ctx)
static int socket_close(duk_context *ctx)
static duk_function_list_entry socket_funcs[]