added send and recv builtins

This commit is contained in:
cozis
2021-12-04 21:02:50 +01:00
parent 57c0d7c910
commit 014287509a
5 changed files with 106 additions and 3 deletions
+10
View File
@@ -24,3 +24,13 @@ if net.connect(fd, { sin_family: net.AF_INET, sin_port: net.htons(port), sin_add
} }
print('Connected!\n'); print('Connected!\n');
buffer = newBuffer(16);
buffer[0] = 9;
buffer[1] = 7;
buffer[2] = 255;
n = net.send(fd, buffer, 0);
print('Sent ', n, ' bytes: ', buffer, '\n');
+18 -1
View File
@@ -22,6 +22,8 @@ if net.listen(fd, backlog) != 0:
return none; return none;
} }
buffer = newBuffer(16);
while true: while true:
{ {
client_addr = {}; client_addr = {};
@@ -34,5 +36,20 @@ while true:
print('client_fd = ', client_fd, '\n'); print('client_fd = ', client_fd, '\n');
print('client_addr = {', client_addr, '}\n'); print('client_addr = {', client_addr, '}\n');
# ..continue.. do
{
n = net.recv(client_fd, buffer, 0);
if n < 0:
print('Warning! Failed to read from socket!\n');
else if n == 0:
{
# Client disconnected.
}
else
{
print('Received ', n, ' bytes: ', buffer, '\n');
}
}
while n > 0;
} }
+60
View File
@@ -22,6 +22,8 @@ static Object *bin_htonl(Runtime *runtime, Object **argv, unsigned int argc, Err
static Object *bin_ntohl(Runtime *runtime, Object **argv, unsigned int argc, Error *error); static Object *bin_ntohl(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
static Object *bin_htons(Runtime *runtime, Object **argv, unsigned int argc, Error *error); static Object *bin_htons(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
static Object *bin_ntohs(Runtime *runtime, Object **argv, unsigned int argc, Error *error); static Object *bin_ntohs(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
static Object *bin_send(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
static Object *bin_recv(Runtime *runtime, Object **argv, unsigned int argc, Error *error);
typedef struct { typedef struct {
@@ -59,6 +61,22 @@ static Object *select_(Object *self, Object *key, Heap *heap, Error *err)
switch(PAIR(n, s[0])) switch(PAIR(n, s[0]))
{ {
case PAIR(4, 's'):
{
if(!strcmp(s, "send"))
return Object_FromNativeFunction(bm->runtime, bin_send, 3, heap, err);
return NULL;
}
case PAIR(4, 'r'):
{
if(!strcmp(s, "recv"))
return Object_FromNativeFunction(bm->runtime, bin_recv, 3, heap, err);
return NULL;
}
case PAIR(10, 'I'): case PAIR(10, 'I'):
{ {
if(!strcmp(s, "INADDR_ANY")) if(!strcmp(s, "INADDR_ANY"))
@@ -671,3 +689,45 @@ static Object *bin_accept(Runtime *runtime, Object **argv, unsigned int argc, Er
return Object_FromInt(r, heap, error); return Object_FromInt(r, heap, error);
} }
static Object *bin_send(Runtime *runtime, Object **argv, unsigned int argc, Error *error)
{
assert(argc == 3);
Heap *heap = Runtime_GetHeap(runtime);
int sockfd = Object_ToInt(argv[0], error);
if(error->occurred) return NULL;
int size;
void *addr = Object_GetBufferAddrAndSize(argv[1], &size, error);
if(addr == NULL) return NULL;
int flags = Object_ToInt(argv[2], error);
if(error->occurred) return NULL;
ssize_t r = send(sockfd, addr, size, flags);
return Object_FromInt(r, heap, error);
}
static Object *bin_recv(Runtime *runtime, Object **argv, unsigned int argc, Error *error)
{
assert(argc == 3);
Heap *heap = Runtime_GetHeap(runtime);
int sockfd = Object_ToInt(argv[0], error);
if(error->occurred) return NULL;
int size;
void *addr = Object_GetBufferAddrAndSize(argv[1], &size, error);
if(addr == NULL) return NULL;
int flags = Object_ToInt(argv[2], error);
if(error->occurred) return NULL;
ssize_t r = recv(sockfd, addr, size, flags);
return Object_FromInt(r, heap, error);
}
+15
View File
@@ -48,6 +48,21 @@ Object *Object_NewBuffer(int size, Heap *heap, Error *error)
return (Object*) obj; return (Object*) obj;
} }
void *Object_GetBufferAddrAndSize(Object *obj, int *size, Error *error)
{
if(obj->type != &t_buffer)
{
Error_Report(error, 0, "Not a buffer");
return NULL;
}
BufferObject *buf = (BufferObject*) obj;
if(size)
*size = buf->size;
return buf->body;
}
static Object *select(Object *self, Object *key, Heap *heap, Error *error) static Object *select(Object *self, Object *key, Heap *heap, Error *error)
{ {
assert(self != NULL); assert(self != NULL);
+1
View File
@@ -72,6 +72,7 @@ const Type* Object_GetType(const Object *obj);
const char* Object_GetName(const Object *obj); const char* Object_GetName(const Object *obj);
unsigned int Object_GetSize(const Object *obj, Error *err); unsigned int Object_GetSize(const Object *obj, Error *err);
unsigned int Object_GetDeepSize(const Object *obj, Error *err); unsigned int Object_GetDeepSize(const Object *obj, Error *err);
void *Object_GetBufferAddrAndSize(Object *obj, int *size, Error *error);
int Object_Hash (Object *obj, Error *err); int Object_Hash (Object *obj, Error *err);
Object* Object_Copy (Object *obj, Heap *heap, Error *err); Object* Object_Copy (Object *obj, Heap *heap, Error *err);
Object* Object_Call (Object *obj, Object **argv, unsigned int argc, Heap *heap, Error *err); Object* Object_Call (Object *obj, Object **argv, unsigned int argc, Heap *heap, Error *err);