add more files... && create sockaddr struct

This commit is contained in:
2025-04-07 19:22:59 +05:00
parent 96eb2c55d3
commit d6b784814f
16 changed files with 993 additions and 501 deletions

View File

@@ -3,7 +3,8 @@
"editor.insertSpaces": false,
"files.associations": {
"stdlib.h": "c",
"ksys.h": "c"
"ksys.h": "c",
"socket.h": "c"
},
"cSpell.words": [
"ksys",
@@ -11,6 +12,7 @@
"LUALIB_API",
"luaL_newlib",
"metatable",
"tonumber",
"luaL_newmetatable",
"luaL_setmetatable",
"lua_createtable",

View File

@@ -1,35 +1,38 @@
LUA_V = 54
CC=kos32-gcc
LD=kos32-ld
STRIP=kos32-strip
OBJCOPY=kos32-objcopy
STD=-std=gnu99
CFLAGS=$(SYSCFLAGS) -O2 -Wall -Wextra $(STD) $(MYCFLAGS)
LDFLAGS=$(SYSLDFLAGS) $(MYLDFLAGS)
LIBS=$(SYSLIBS) $(MYLIBS) $(TOOLCHAIN_PATH)/mingw32/lib/lua$(LUA_V).dll.a
CC = kos32-gcc
LD = kos32-ld
STRIP = kos32-strip
OBJCOPY = kos32-objcopy
STD = -std=gnu11
CFLAGS = $(SYSCFLAGS) -O2 -Wall -Wextra $(STD) $(MYCFLAGS)
LDFLAGS = $(SYSLDFLAGS) $(MYLDFLAGS)
LIBS = $(SYSLIBS) $(MYLIBS) $(TOOLCHAIN_PATH)/mingw32/lib/lua$(LUA_V).dll.a
ifeq ($(OS), Windows_NT)
TOOLCHAIN_PATH=C:/MinGW/msys/1.0/home/autobuild/tools/win32
TOOLCHAIN_PATH = C:/MinGW/msys/1.0/home/autobuild/tools/win32
else
TOOLCHAIN_PATH=/home/autobuild/tools/win32
TOOLCHAIN_PATH = /home/autobuild/tools/win32
endif
KOLIBRIOS_REPO=../kolibrios
KOLIBRIOS_REPO = ../kolibrios
SDK_DIR=$(KOLIBRIOS_REPO)/contrib/sdk
NewLib_DIR=$(SDK_DIR)/sources/newlib
SYSCFLAGS=-fno-ident -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I$(NewLib_DIR)/libc/include -I$(abspath .)/lua/src
SYSLDFLAGS=--image-base 0 -Tapp-dynamic.lds
SYSLIBS=-nostdlib -L $(SDK_DIR)/lib -L$(TOOLCHAIN_PATH)/lib -L$(TOOLCHAIN_PATH)/mingw32/lib -lgcc -lc.dll -ldll
MYCFLAGS=
MYLDFLAGS=
MYLIBS=
MYOBJS=
SDK_DIR = $(KOLIBRIOS_REPO)/contrib/sdk
NewLib_DIR = $(SDK_DIR)/sources/newlib
SYSCFLAGS = -fno-ident -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I$(NewLib_DIR)/libc/include -I$(abspath .)/lua/src
SYSLDFLAGS = --image-base 0 -Tapp-dynamic.lds
SYSLIBS = -nostdlib -L $(SDK_DIR)/lib -L$(TOOLCHAIN_PATH)/lib -L$(TOOLCHAIN_PATH)/mingw32/lib -lgcc -lc.dll -ldll
MYCFLAGS =
MYLDFLAGS =
MYLIBS =
MYOBJS =
ALL_O = src/syscalls.o src/ARP_entry.o src/systemColors.o
Socket_O = src/sockets/socket.o src/sockets/socket_lua.o src/sockets/sockaddr.o
ALL_O = src/syscalls.o src/ARP_entry.o src/systemColors.o src/graphic.o $(Socket_O)
syscalls.dll: $(ALL_O)
$(CC) -shared -T dll.lds --entry _DllStartup -o $@ $(ALL_O) $(LIBS)
@@ -37,11 +40,21 @@ syscalls.dll: $(ALL_O)
clean:
rm -f $(ALL_O) syscalls.dll
# Depends
src/syscalls.o: src/syscalls.c src/syscalls.h src/systemColors.h src/ARP_entry.h src/scancodes.h
src/ARP_entry.o: src/ARP_entry.c src/ARP_entry.h src/debug.h
src/systemColors.o: src/systemColors.c src/systemColors.h src/debug.h
src/socket.o: src/socket.c src/socket.h
## Sources
src/socket.h: src/syscalls.h
src/syscalls.o: src/syscalls.c src/syscalls.h src/systemColors.h src/ARP_entry.h src/scancodes.h src/sockets/socket_lua.h src/graphic.h
src/ARP_entry.o: src/ARP_entry.c src/ARP_entry.h src/debug.h
src/systemColors.o: src/systemColors.c src/systemColors.h src/debug.h
src/sockets/socket.o: src/sockets/socket.c src/sockets/socket.h
src/sockets/socket_lua.o: src/sockets/socket_lua.c src/sockets/socket_lua.h
src/sockets/sockaddr.o: src/sockets/sockaddr.c src/sockets/sockaddr.h
src/graphic.o: src/graphic.c src/graphic.h
## headers
src/graphic.h: src/syscalls.h
src/sockets/socket_lua.h: src/syscalls.h src/sockets/socket.h
src/sockets/sockaddr.h: src/sockets/socket.h src/syscalls.h

View File

@@ -0,0 +1,114 @@
# Manual
```lua
local syscalls = require("syscalls")
```
## Events
```lua
syscalls.Event.<EventName>
```
## Graphic
## Sockets
### OpenSocket
```lua
local socket, err = syscalls.OpenSocket()
if err then
print("Error", err)
else
print("Ok")
end
```
### CloseSocket(socket)
### PairSocket()
```lua
local first, second = PairSocket()
if first then
print("OK")
else
print("Error:", second)
end
```
### Bind(socket, address)
### Listen(socket, backlog)
### Connect()
### Accept
### Receive
## SetSocketOption
### GetSocketOption
### Socket types
```lua
syscalls.SOCK.<Value>
```
+ `STREAM`
+ `RAW`
+ `DGRAM`
### Address families
```lua
syscalls.AF.<Value>
```
+ `UNSPEC`
+ `LOCAL`
+ `INET`
+ `INET4`
+ `INET6`
### IP options
```lua
syscalls.IP.<Value>
```
+ `TTL`
### IP protocols
```lua
syscalls.IPPROTO.<Value>
```
+ `IP`
+ `ICMP`
+ `TCP`
+ `UDP`
+ `RAW`
### Socket options
```lua
syscalls.SO.<Value>
```
+ `BINDTODEVICE`
+ `NONBLOCK`

181
src/graphic.c Normal file
View File

@@ -0,0 +1,181 @@
#include "graphic.h"
/*
Кеш размера экрана.
Нужно для того чтобы не вызывать систменое прерывание лишний раз (другие функции тоже используют это значение)
Сомневаюсь что в размер экрана в колибри вообще может меняться без перезагрузки
обновляется функцией syscalls_updateScreenSize
*/
static ksys_pos_t syscalls_screenSizeCache = { 0 };
inline void syscalls_updateScreenSize()
{
syscalls_screenSizeCache = _ksys_screen_size();
}
int syscalls_drawLine(lua_State* L)
{
_ksys_draw_line(
luaL_checkinteger(L, 1),
luaL_checkinteger(L, 2),
luaL_checkinteger(L, 3),
luaL_checkinteger(L, 4),
luaL_checkinteger(L, 5));
return 0;
}
static void syscall_drawText(const char* text, uint32_t x, uint32_t y, ksys_color_t color, enum TextScale size, uint32_t len, bool fillBackground, ksys_color_t backgroundColor)
{
enum DrawTextEncoding
{
cp866_6x9 = 0,
cp866_8x16 = 1,
utf8 = 3,
utf16 = 4
};
enum scale
{
scale_x1 = 0,
scale_x2 = 1,
scale_x3 = 2,
scale_x4 = 3,
scale_x5 = 4,
scale_x6 = 5,
scale_x7 = 6,
scale_x8 = 7
};
color &= 0x00FFFFFF;
color |= (fillBackground << 30);
switch (size)
{
case TextScale_SIZE_6x9:
color |= (cp866_8x16 << 28) | (scale_x1 << 24);
break;
case TextScale_SIZE_8x16:
color |= (cp866_8x16 << 28);
break;
case TextScale_SIZE_12x18:
color |= (cp866_6x9 << 28) | (scale_x2 << 24);
break;
case TextScale_SIZE_16x32:
color |= (cp866_8x16 << 28) | (scale_x2 << 24);
break;
case TextScale_SIZE_18x27:
color |= (cp866_6x9 << 28) | (scale_x3 << 24);
break;
case TextScale_SIZE_24x36:
color |= (cp866_6x9 << 28) | (scale_x4 << 24);
break;
case TextScale_SIZE_24x48:
color |= (cp866_8x16 << 28) | (scale_x3 << 24);
break;
case TextScale_SIZE_30x45:
color |= (cp866_6x9 << 28) | (scale_x5 << 24);
break;
case TextScale_SIZE_36x54:
color |= (cp866_6x9 << 28) | (scale_x6 << 24);
break;
case TextScale_SIZE_40x80:
color |= (cp866_8x16 << 28) | (scale_x5 << 24);
break;
case TextScale_SIZE_42x63:
color |= (cp866_6x9 << 28) | (scale_x7 << 24);
break;
case TextScale_SIZE_48x72:
color |= (cp866_6x9 << 28) | (scale_x8 << 24);
break;
case TextScale_SIZE_48x96:
color |= (cp866_8x16 << 28) | (scale_x6 << 24);
break;
case TextScale_SIZE_56x112:
color |= (cp866_8x16 << 28) | (scale_x7 << 24);
break;
case TextScale_SIZE_64x128:
color |= (cp866_8x16 << 28) | (scale_x8 << 24);
break;
default:
break;
};
if (len <= 0)
color |= (1 << 31);
asm_inline(
"int $0x40" ::"a"(4),
"b"((x << 16) | y),
"c"(color),
"d"(text),
"S"(len),
"D"(backgroundColor));
}
int syscalls_drawText(lua_State* L)
{
syscall_drawText(
luaL_checkstring(L, 1),
luaL_checkinteger(L, 2),
luaL_checkinteger(L, 3),
luaL_checkinteger(L, 4),
luaL_optinteger(L, 5, TextScale_SIZE_8x16),
luaL_optinteger(L, 6, 0),
luaL_optinteger(L, 7, 0),
luaL_optinteger(L, 8, 0));
return 0;
}
int syscalls_drawRectangle(lua_State* L)
{
_ksys_draw_bar(
luaL_checkinteger(L, 1),
luaL_checkinteger(L, 2),
luaL_checkinteger(L, 3),
luaL_checkinteger(L, 4),
luaL_checkinteger(L, 5));
return 0;
}
int syscalls_ReadPoint(lua_State* L)
{
ksys_color_t color;
if (syscalls_screenSizeCache.val == 0)
syscalls_updateScreenSize();
uint32_t x = luaL_checkinteger(L, 1);
uint32_t y = luaL_checkinteger(L, 2);
asm_inline(
"int $ 0x40"
: "=a"(color)
: "a"(35), "b"(x * syscalls_screenSizeCache.x + y));
lua_pushinteger(L, color);
return 1;
}
int syscalls_screenSize(lua_State* L)
{
syscalls_updateScreenSize();
lua_createtable(L, 0, 2);
lua_pushinteger(L, syscalls_screenSizeCache.x);
lua_setfield(L, -2, "x");
lua_pushinteger(L, syscalls_screenSizeCache.y);
lua_setfield(L, -2, "y");
return 1;
}

88
src/graphic.h Normal file
View File

@@ -0,0 +1,88 @@
#ifndef __GRAPHIC_H__
#define __GRAPHIC_H__
#include <sys/ksys.h>
#include "syscalls.h"
enum TextScale
{
TextScale_SIZE_6x9, // 1x 6x9
TextScale_SIZE_8x16, // 1x 8x16
TextScale_SIZE_12x18, // 2x 6x9
TextScale_SIZE_16x32, // 2x 8x16
TextScale_SIZE_18x27, // 3x 6x9
TextScale_SIZE_24x36, // 4x 6x9
TextScale_SIZE_24x48, // 3x 8x16
TextScale_SIZE_30x45, // 5x 6x9
TextScale_SIZE_32x64, // 4x 8x16
TextScale_SIZE_36x54, // 6x 6x9
TextScale_SIZE_40x80, // 5x 8x16
TextScale_SIZE_42x63, // 7x 6x9
TextScale_SIZE_48x72, // 8x 6x9
TextScale_SIZE_48x96, // 6x 8x16
TextScale_SIZE_56x112, // 7x 8x16
TextScale_SIZE_64x128 // 8x 8x16
};
int syscalls_drawLine(lua_State* L);
int syscalls_drawText(lua_State* L);
int syscalls_drawRectangle(lua_State* L);
int syscalls_ReadPoint(lua_State* L);
int syscalls_screenSize(lua_State* L);
inline void syscalls_push_textSizes(lua_State* L)
{
lua_newtable(L);
lua_pushinteger(L, TextScale_SIZE_6x9);
lua_setfield(L, -2, "6x9");
lua_pushinteger(L, TextScale_SIZE_8x16);
lua_setfield(L, -2, "8x16");
lua_pushinteger(L, TextScale_SIZE_12x18);
lua_setfield(L, -2, "12x18");
lua_pushinteger(L, TextScale_SIZE_16x32);
lua_setfield(L, -2, "16x32");
lua_pushinteger(L, TextScale_SIZE_18x27);
lua_setfield(L, -2, "18x27");
lua_pushinteger(L, TextScale_SIZE_24x36);
lua_setfield(L, -2, "24x36");
lua_pushinteger(L, TextScale_SIZE_24x48);
lua_setfield(L, -2, "24x48");
lua_pushinteger(L, TextScale_SIZE_30x45);
lua_setfield(L, -2, "30x45");
lua_pushinteger(L, TextScale_SIZE_32x64);
lua_setfield(L, -2, "32x64");
lua_pushinteger(L, TextScale_SIZE_36x54);
lua_setfield(L, -2, "36x54");
lua_pushinteger(L, TextScale_SIZE_40x80);
lua_setfield(L, -2, "40x80");
lua_pushinteger(L, TextScale_SIZE_42x63);
lua_setfield(L, -2, "42x63");
lua_pushinteger(L, TextScale_SIZE_48x72);
lua_setfield(L, -2, "48x72");
lua_pushinteger(L, TextScale_SIZE_48x96);
lua_setfield(L, -2, "48x96");
lua_pushinteger(L, TextScale_SIZE_56x112);
lua_setfield(L, -2, "56x112");
lua_pushinteger(L, TextScale_SIZE_64x128);
lua_setfield(L, -2, "64x128");
lua_setfield(L, -2, "textSize");
}
#endif // __GRAPHIC_H__

View File

@@ -1,204 +0,0 @@
#include <sys/ksys.h>
#include "socket.h"
int syscalls_OpenSocket(lua_State* L)
{
int32_t socketNum;
uint32_t errorCode;
uint32_t family = luaL_checkinteger(L, 1);
uint32_t type = luaL_checkinteger(L, 2);
uint32_t protocol = luaL_checkinteger(L, 3);
asm_inline(
"int $0x40"
:"=a"(socketNum), "=b"(errorCode)
: "a"(77), "b"(0), "c"(family), "d"(type), "S"(protocol)
);
if (socketNum == -1)
{
lua_pushnil(L); // Push socketNum
lua_pushnumber(L, socketNum); // Push error Code
}
else
{
lua_pushnumber(L, socketNum); // Push socketNum
lua_pushnil(L); // Push error code
}
return 2;
}
int syscalls_CloseSocket(lua_State* L)
{
uint32_t eax;
uint32_t errorCode;
uint32_t socketNum = luaL_checkinteger(L, 1);
asm_inline(
"int $0x40"
: "=a"(eax), "=b"(errorCode)
: "a"(77), "b"(1), "c"(socketNum));
syscalls_ReturnIntegerValueOrNil(eax, errorCode, L);
return 1;
}
int syscalls_Bind(lua_State* L)
{
uint32_t eax;
uint32_t errorCode;
uint32_t socketNum = luaL_checkinteger(L, 1);
uint32_t sockaddr = luaL_checkinteger(L, 2);
uint32_t sockaddrLen = luaL_checkinteger(L, 3);
asm_inline(
"int $0x40"
: "=a"(eax), "=b"(errorCode)
: "a"(77), "b"(2), "c"(socketNum), "d"(sockaddr), "S"(sockaddrLen));
syscalls_ReturnIntegerValueOrNil(eax, errorCode, L);
return 1;
}
int syscalls_Listen(lua_State* L)
{
uint32_t eax;
uint32_t errorCode;
uint32_t socketNum = luaL_checkinteger(L, 1);
uint32_t backlog = luaL_checkinteger(L, 2);
asm_inline(
"int $0x40"
: "=a"(eax), "=b"(errorCode)
: "a"(77), "b"(3), "c"(socketNum), "d"(backlog));
syscalls_ReturnIntegerValueOrNil(eax, errorCode, L);
return 1;
}
int syscalls_Connect(lua_State* L)
{
uint32_t eax;
uint32_t errorCode;
uint32_t socketNum = luaL_checkinteger(L, 1);
uint32_t sockaddr = luaL_checkinteger(L, 2);
uint32_t sockaddrLen = luaL_checkinteger(L, 3);
asm_inline(
"int $0x40"
: "=a"(eax), "=b"(errorCode)
: "a"(77), "b"(4), "c"(socketNum), "d"(sockaddr), "S"(sockaddrLen));
syscalls_ReturnIntegerValueOrNil(eax, errorCode, L);
return 1;
}
int syscalls_Accept(lua_State* L)
{
uint32_t eax;
uint32_t errorCode;
uint32_t socketNum = luaL_checkinteger(L, 1);
uint32_t sockaddr = luaL_checkinteger(L, 2);
uint32_t sockaddrLen = luaL_checkinteger(L, 3);
asm_inline(
"int $0x40"
: "=a"(eax), "=b"(errorCode)
: "a"(77), "b"(5), "c"(socketNum), "d"(sockaddr), "S"(sockaddrLen));
syscalls_ReturnIntegerValueOrNil(eax, errorCode, L);
return 1;
}
int syscalls_Send(lua_State* L)
{
uint32_t eax;
uint32_t errorCode;
uint32_t socketNum = luaL_checkinteger(L, 1);
uint32_t buffer = luaL_checkinteger(L, 2);
uint32_t bufferLen = luaL_checkinteger(L, 3);
uint32_t flags = luaL_checkinteger(L, 4);
asm_inline(
"int $0x40"
: "=a"(eax), "=b"(errorCode)
: "a"(77), "b"(6), "c"(socketNum), "d"(buffer), "S"(bufferLen), "D"(flags));
syscalls_ReturnIntegerValueOrNil(eax, errorCode, L);
return 1;
}
int syscalls_Receive(lua_State* L)
{
uint32_t eax;
uint32_t errorCode;
uint32_t socketNum = luaL_checkinteger(L, 1);
uint32_t buffer = luaL_checkinteger(L, 2);
uint32_t bufferLen = luaL_checkinteger(L, 3);
uint32_t flags = luaL_checkinteger(L, 4);
asm_inline(
"int $0x40"
: "=a"(eax), "=b"(errorCode)
: "a"(77), "b"(7), "c"(socketNum), "d"(buffer), "S"(bufferLen), "D"(flags));
syscalls_ReturnIntegerValueOrNil(eax, errorCode, L);
return 1;
}
int syscalls_GetSocketOptions(lua_State* L)
{
uint32_t eax;
uint32_t errorCode;
uint32_t socketNum = luaL_checkinteger(L, 1);
uint32_t optstruct = luaL_checkinteger(L, 2);
asm_inline(
"int $0x40"
: "=a"(eax), "=b"(errorCode)
: "a"(77), "b"(8), "c"(socketNum), "d"(optstruct));
syscalls_ReturnIntegerValueOrNil(eax, errorCode, L);
return 1;
}
int syscalls_GetPairSocket(lua_State* L)
{
int firstSocketNum;
int secondSocketNum;
asm_inline(
"int $0x40"
: "=a"(firstSocketNum), "=b"(secondSocketNum)
: "a"(77), "b"(9));
if (firstSocketNum == -1)
{
lua_pushnil(L);
lua_pushinteger(L, secondSocketNum);
}
else
{
lua_pushinteger(L, firstSocketNum);
lua_pushinteger(L, secondSocketNum);
}
return 2;
}

0
src/sockets/optstruct.c Normal file
View File

49
src/sockets/sockaddr.c Normal file
View File

@@ -0,0 +1,49 @@
#include "sockaddr.h"
#include "../debug.h"
struct sockaddr* syscalls_push_sockaddr(lua_State* L)
{
DEBUG_LINE("push sockaddr struct");
struct sockaddr* colorsTable = lua_newuserdata(L, sizeof(struct sockaddr));
luaL_setmetatable(L, syscalls_sockaddr_metatable_name);
return colorsTable;
}
static int syscalls_sockaddr_new(lua_State* L)
{
struct sockaddr* add = syscalls_push_sockaddr(L);
add->sin_addr = luaL_checkinteger(L, 1);
add->sin_family = luaL_checkinteger(L, 1);
add->sin_port = luaL_checkinteger(L, 1);
return 1;
}
static int syscalls_sockaddr_tonumber(lua_State* L)
{
lua_pushinteger(L, luaL_checkudata(L, 1, syscalls_sockaddr_metatable_name));
return 1;
}
static const luaL_Reg syscalls_sockaddr_m[] = {
{"__tonumber", syscalls_sockaddr_tonumber},
{NULL, NULL}
};
static const luaL_Reg syscalls_sockaddr_lib[] = {
{NULL, NULL}
};
void syscalls_register_sockaddr(lua_State* L)
{
luaL_newlib(L, syscalls_sockaddr_lib);
lua_setfield(L, -2, "SystemColors");
luaL_newmetatable(L, syscalls_sockaddr_metatable_name);
luaL_setfuncs(L, syscalls_sockaddr_m, 0);
lua_pop(L, 1);
}

12
src/sockets/sockaddr.h Normal file
View File

@@ -0,0 +1,12 @@
#ifndef __SOCKADDR_H__
#define __SOCKADDR_H__
#include "../syscalls.h"
#include "socket.h"
#define syscalls_sockaddr_metatable_name "sockaddr metatable"
void syscalls_register_sockaddr(lua_State* L);
struct sockaddr* syscalls_push_sockaddr(lua_State* L);
#endif // __SOCKADDR_H__

155
src/sockets/socket.c Normal file
View File

@@ -0,0 +1,155 @@
#include "socket.h"
static void _conv_socket_err() {
switch (errno) {
case 1: errno = ENOBUFS; break;
case 2: errno = EINPROGRESS; break;
case 4: errno = EOPNOTSUPP; break;
case 6: errno = EWOULDBLOCK; break;
case 9: errno = ENOTCONN; break;
case 10: errno = EALREADY; break;
case 11: errno = EINVAL; break;
case 12: errno = EMSGSIZE; break;
case 18: errno = ENOMEM; break;
case 20: errno = EADDRINUSE; break;
case 61: errno = ECONNREFUSED; break;
case 52: errno = ECONNRESET; break;
case 56: errno = EISCONN; break;
case 60: errno = ETIMEDOUT; break;
case 54: errno = ECONNABORTED; break;
default: errno = 0; break;
}
}
int socket(int domain, int type, int protocol)
{
int socket;
asm_inline(
"int $0x40"
:"=b"(errno), "=a"(socket)
: "a"(75), "b"(0), "c"(domain), "d"(type), "S"(protocol)
);
_conv_socket_err();
return socket;
}
int close(int socket)
{
int status;
asm_inline(
"int $0x40"
:"=b"(errno), "=a"(status)
: "a"(75), "b"(1), "c"(socket)
);
_conv_socket_err();
return status;
}
int bind(int socket, const struct sockaddr* addres, int addres_len)
{
int status;
asm_inline(
"int $0x40"
:"=b"(errno), "=a"(status)
: "a"(75), "b"(2), "c"(socket), "d"(addres), "S"(addres_len)
);
_conv_socket_err();
return status;
}
int listen(int socket, int backlog)
{
int status;
asm_inline(
"int $0x40"
:"=b"(errno), "=a"(status)
: "a"(75), "b"(3), "c"(socket), "d"(backlog)
);
_conv_socket_err();
return status;
}
int connect(int socket, const struct sockaddr* address, int socket_len)
{
int status;
asm_inline(
"int $0x40"
:"=b"(errno), "=a"(status)
: "a"(75), "b"(4), "c"(socket), "d"(address), "S"(socket_len)
);
_conv_socket_err();
return status;
}
int accept(int socket, const struct sockaddr* address, int address_len)
{
int new_socket;
asm_inline(
"int $0x40"
:"=b"(errno), "=a"(new_socket)
: "a"(75), "b"(5), "c"(socket), "d"(address), "S"(address_len)
);
_conv_socket_err();
return new_socket;
}
int send(int socket, const void* message, size_t msg_len, int flag)
{
int status;
asm_inline(
"int $0x40"
:"=b"(errno), "=a"(status)
: "a"(75), "b"(6), "c"(socket), "d"(message), "S"(msg_len), "D"(flag)
);
_conv_socket_err();
return status;
}
int recv(int socket, void* buffer, size_t buff_len, int flag)
{
int status;
asm_inline(
"int $0x40"
:"=b"(errno), "=a"(status)
: "a"(75), "b"(7), "c"(socket), "d"(buffer), "S"(buff_len), "D"(flag)
);
_conv_socket_err();
return status;
}
int setsockopt(int socket, const optstruct* opt)
{
int status;
asm_inline(
"int $0x40"
:"=b"(errno), "=a"(status)
: "a"(75), "b"(8), "c"(socket), "d"(opt)
);
_conv_socket_err();
return status;
}
int getsockopt(int socket, optstruct* opt)
{
int status;
asm_inline(
"int $0x40"
:"=b"(errno), "=a"(status)
: "a"(75), "b"(9), "c"(socket), "d"(opt)
);
_conv_socket_err();
return status;
}
int socketpair(int* socket1, int* socket2)
{
asm_inline(
"int $0x40"
:"=b"(*socket2), "=a"(*socket1)
: "a"(75), "b"(10)
);
errno = *socket2;
_conv_socket_err();
return *socket1;
}

91
src/sockets/socket.h Normal file
View File

@@ -0,0 +1,91 @@
/* Copyright (C) 2019-2021 Logaev Maxim (turbocat2001), GPLv2 */
#ifndef _SOCKET_H_
#define _SOCKET_H_
#include <errno.h>
#include <stddef.h>
#include <sys/ksys.h>
// Socket Types
#define SOCK_STREAM 1
#define SOCK_DGRAM 2
#define SOCK_RAW 3
// IP protocols
#define IPPROTO_IP 0
#define IPPROTO_ICMP 1
#define IPPROTO_TCP 6
#define IPPROTO_UDP 17
#define IPPROTO_RAW 255
// IP options
#define IP_TTL 2
// Address families
#define AF_UNSPEC 0
#define AF_LOCAL 1
#define AF_INET 2 // Default INET=IPv4
#define AF_INET4 2 // IPv4
#define AF_INET6 10 // IPv6
#define PF_UNSPEC AF_UNSPEC
#define PF_LOCAL AF_LOCAL
#define PF_INET4 AF_INET4
#define PF_INET6 AF_INET6
// internal definition
#define AI_SUPPORTED 0x40F
// for system function 76
#define API_ETH (0 << 16)
#define API_IPv4 (1 << 16)
#define API_ICMP (2 << 16)
#define API_UDP (3 << 16)
#define API_TCP (4 << 16)
#define API_ARP (5 << 16)
#define API_PPPOE (6 << 16)
// Socket flags for user calls
#define MSG_NOFLAG 0
#define MSG_PEEK 0x02
#define MSG_DONTWAIT 0x40
// Socket levels
#define SOL_SOCKET 0xffff
// Socket options
#define SO_BINDTODEVICE (1 << 9)
#define SO_NONBLOCK (1 << 31)
#define PORT(X) (X << 8)
#pragma pack(push, 1)
struct sockaddr {
unsigned short sin_family;
unsigned short sin_port;
unsigned int sin_addr;
unsigned long long sin_zero;
};
typedef struct {
unsigned int level;
unsigned int optionname;
unsigned int optlenght;
unsigned char options;
} optstruct;
#pragma pack(pop)
int socket(int domain, int type, int protocol);
int close(int socket);
int bind(int socket, const struct sockaddr* addres, int addres_len);
int listen(int socket, int backlog);
int connect(int socket, const struct sockaddr* address, int socket_len);
int accept(int socket, const struct sockaddr* address, int address_len);
int send(int socket, const void* message, size_t msg_len, int flag);
int recv(int socket, void* buffer, size_t buff_len, int flag);
int setsockopt(int socket, const optstruct* opt);
int getsockopt(int socket, optstruct* opt);
int socketpair(int* socket1, int* socket2);
#endif //_SOCKET_H_

246
src/sockets/socket_lua.c Normal file
View File

@@ -0,0 +1,246 @@
#include <sys/ksys.h>
#include "socket_lua.h"
#include "socket.h"
int syscalls_OpenSocket(lua_State* L)
{
int socketNum = socket(
luaL_checkinteger(L, 1),
luaL_checkinteger(L, 2),
luaL_checkinteger(L, 3)
);
if (socketNum != -1)
{
lua_pushnumber(L, socketNum); // Push socketNum
lua_pushnil(L); // Push error code
}
else
{
lua_pushnil(L); // Push socketNum
lua_pushnumber(L, errno); // Push error Code
}
return 2;
}
int syscalls_CloseSocket(lua_State* L)
{
int ret = close(luaL_checkinteger(L, 1));
syscalls_ReturnIntegerValueOrNil(ret, errno, L);
return 1;
}
int syscalls_Bind(lua_State* L)
{
int ret = bind(
luaL_checkinteger(L, 1),
luaL_checkinteger(L, 2),
sizeof(struct sockaddr)
);
syscalls_ReturnIntegerValueOrNil(ret, errno, L);
return 1;
}
int syscalls_Listen(lua_State* L)
{
int ret = listen(
luaL_checkinteger(L, 1),
luaL_checkinteger(L, 2)
);
syscalls_ReturnIntegerValueOrNil(ret, errno, L);
return 1;
}
int syscalls_Connect(lua_State* L)
{
int ret = connect(
luaL_checkinteger(L, 1),
luaL_checkinteger(L, 2),
sizeof(struct sockaddr)
);
syscalls_ReturnIntegerValueOrNil(ret, errno, L);
return 1;
}
int syscalls_Accept(lua_State* L)
{
int ret = accept(
luaL_checkinteger(L, 1),
luaL_checkinteger(L, 2),
sizeof(struct sockaddr)
);
syscalls_ReturnIntegerValueOrNil(ret, errno, L);
return 1;
}
int syscalls_Send(lua_State* L)
{
int ret = send(
luaL_checkinteger(L, 1),
luaL_checkinteger(L, 2),
luaL_checkinteger(L, 3),
luaL_checkinteger(L, 4)
);
syscalls_ReturnIntegerValueOrNil(ret, errno, L);
return 1;
}
int syscalls_Receive(lua_State* L)
{
int ret = recv(
luaL_checkinteger(L, 1),
luaL_checkinteger(L, 2),
luaL_checkinteger(L, 3),
luaL_checkinteger(L, 4)
);
syscalls_ReturnIntegerValueOrNil(ret, errno, L);
return 1;
}
int syscalls_SetSocketOption(lua_State* L)
{
int ret = setsockopt(luaL_checkinteger(L, 1), luaL_checkinteger(L, 2));
syscalls_ReturnIntegerValueOrNil(ret, errno, L);
return 1;
}
int syscalls_GetSocketOption(lua_State* L)
{
int ret = getsockopt(luaL_checkinteger(L, 1), luaL_checkinteger(L, 2));
syscalls_ReturnIntegerValueOrNil(ret, errno, L);
return 1;
}
int syscalls_PairSocket(lua_State* L)
{
int firstSocketNum;
int secondSocketNum;
int ret = socketpair(&firstSocketNum, &secondSocketNum);
if (ret == -1)
{
lua_pushnil(L);
lua_pushinteger(L, errno);
}
else
{
lua_pushinteger(L, firstSocketNum);
lua_pushinteger(L, secondSocketNum);
}
return 2;
}
inline static void syscalls_socket_types(lua_State* L)
{
lua_createtable(L, 0, 0);
lua_pushinteger(L, SOCK_STREAM);
lua_setfield(L, -2, "STREAM");
lua_pushinteger(L, SOCK_RAW);
lua_setfield(L, -2, "RAW");
lua_pushinteger(L, SOCK_DGRAM);
lua_setfield(L, -2, "DGRAM");
lua_setfield(L, -2, "SOCK");
}
inline static void syscalls_socket_ipproto(lua_State* L)
{
lua_createtable(L, 0, 0);
lua_pushinteger(L, IPPROTO_IP);
lua_setfield(L, -2, "IP");
lua_pushinteger(L, IPPROTO_ICMP);
lua_setfield(L, -2, "ICMP");
lua_pushinteger(L, IPPROTO_TCP);
lua_setfield(L, -2, "TCP");
lua_pushinteger(L, IPPROTO_UDP);
lua_setfield(L, -2, "UDP");
lua_pushinteger(L, IPPROTO_RAW);
lua_setfield(L, -2, "RAW");
lua_setfield(L, -2, "IPPROTO");
}
inline static void syscalls_socket_ip(lua_State* L)
{
lua_createtable(L, 0, 0);
lua_pushinteger(L, IP_TTL);
lua_setfield(L, -2, "TTL");
lua_setfield(L, -2, "IP");
}
inline static void syscalls_socket_AF(lua_State* L)
{
lua_createtable(L, 0, 0);
lua_pushinteger(L, AF_UNSPEC);
lua_setfield(L, -2, "UNSCPEC");
lua_pushinteger(L, AF_LOCAL);
lua_setfield(L, -2, "LOCAL");
lua_pushinteger(L, AF_INET);
lua_setfield(L, -2, "INET");
lua_pushinteger(L, AF_INET4);
lua_setfield(L, -2, "INET4");
lua_pushinteger(L, AF_INET6);
lua_setfield(L, -2, "INET6");
lua_setfield(L, -2, "AF");
}
inline static void syscalls_socket_options(lua_State* L)
{
lua_createtable(L, 0, 0);
lua_pushinteger(L, SO_BINDTODEVICE);
lua_setfield(L, -2, "BINDTODEVICE");
lua_pushinteger(L, SO_NONBLOCK);
lua_setfield(L, -2, "NONBLOCK");
lua_setfield(L, -2, "SO");
}
void syscalls_register_socket(lua_State* L)
{
syscalls_socket_types(L);
syscalls_socket_ipproto(L);
syscalls_socket_ip(L);
syscalls_socket_AF(L);
syscalls_socket_options(L);
}

View File

@@ -1,7 +1,7 @@
#ifndef __SOCKET_H__
#define __SOCKET_H__
#include "syscalls.h"
#include "../syscalls.h"
int syscalls_OpenSocket(lua_State* L);
int syscalls_CloseSocket(lua_State* L);
@@ -11,8 +11,11 @@ int syscalls_Connect(lua_State* L);
int syscalls_Accept(lua_State* L);
int syscalls_Send(lua_State* L);
int syscalls_Receive(lua_State* L);
int syscalls_GetSocketOptions(lua_State* L);
int syscalls_GetPairSocket(lua_State* L);
int syscalls_SetSocketOption(lua_State* L);
int syscalls_GetSocketOption(lua_State* L);
int syscalls_PairSocket(lua_State* L);
void syscalls_register_socket(lua_State* L);
#endif // __SOCKET_H__

View File

@@ -12,7 +12,8 @@
#include "ARP_entry.h"
#include "systemColors.h"
#include "socket.h"
#include "sockets/socket_lua.h"
#include "graphic.h"
/*
@@ -22,27 +23,6 @@
*/
static ksys_key_input_mode_t syscalls_KeyInputState = KSYS_KEY_INPUT_MODE_ASCII;
/*
Кеш размера экрана.
Нужно для того чтобы не вызывать систменое прерывание лишний раз (другие функции тоже используют это значение)
Сомневаюсь что в размер экрана в колибри вообще может меняться без перезагрузки
обновляется функцией syscalls_updateScreenSize
*/
static ksys_pos_t syscalls_screenSizeCache = { 0 };
/*
функции для того чтобы возвращаемые значения функций были болле-мение едиообразны
*/
static int syscalls_createWindow(lua_State* L)
{
@@ -57,6 +37,7 @@ static int syscalls_createWindow(lua_State* L)
{
uint32_t borderColor = luaL_checkinteger(L, 5);
uint32_t titleColor = luaL_checkinteger(L, 8);
asm_inline(
"int $0x40" ::"a"(0),
"b"((x << 16) | ((w - 1) & 0xFFFF)),
@@ -415,25 +396,6 @@ static int syscalls_getButton(lua_State* L)
return 2;
}
static void syscalls_updateScreenSize()
{
syscalls_screenSizeCache = _ksys_screen_size();
}
static int syscalls_screenSize(lua_State* L)
{
syscalls_updateScreenSize();
lua_createtable(L, 0, 2);
lua_pushinteger(L, syscalls_screenSizeCache.x);
lua_setfield(L, -2, "x");
lua_pushinteger(L, syscalls_screenSizeCache.y);
lua_setfield(L, -2, "y");
return 1;
}
/*
Backgound
@@ -473,173 +435,7 @@ static int syscalls_getCPUClock(lua_State* L)
return 1;
}
static int syscalls_drawLine(lua_State* L)
{
_ksys_draw_line(
luaL_checkinteger(L, 1),
luaL_checkinteger(L, 2),
luaL_checkinteger(L, 3),
luaL_checkinteger(L, 4),
luaL_checkinteger(L, 5));
return 0;
}
enum TextScale
{
TextScale_SIZE_6x9, // 1x 6x9
TextScale_SIZE_8x16, // 1x 8x16
TextScale_SIZE_12x18, // 2x 6x9
TextScale_SIZE_16x32, // 2x 8x16
TextScale_SIZE_18x27, // 3x 6x9
TextScale_SIZE_24x36, // 4x 6x9
TextScale_SIZE_24x48, // 3x 8x16
TextScale_SIZE_30x45, // 5x 6x9
TextScale_SIZE_32x64, // 4x 8x16
TextScale_SIZE_36x54, // 6x 6x9
TextScale_SIZE_40x80, // 5x 8x16
TextScale_SIZE_42x63, // 7x 6x9
TextScale_SIZE_48x72, // 8x 6x9
TextScale_SIZE_48x96, // 6x 8x16
TextScale_SIZE_56x112, // 7x 8x16
TextScale_SIZE_64x128 // 8x 8x16
};
static void syscall_drawText(const char* text, uint32_t x, uint32_t y, ksys_color_t color, enum TextScale size, uint32_t len, bool fillBackground, ksys_color_t backgroundColor)
{
enum DrawTextEncoding
{
cp866_6x9 = 0,
cp866_8x16 = 1,
utf8 = 3,
utf16 = 4
};
enum scale
{
scale_x1 = 0,
scale_x2 = 1,
scale_x3 = 2,
scale_x4 = 3,
scale_x5 = 4,
scale_x6 = 5,
scale_x7 = 6,
scale_x8 = 7
};
color &= 0x00FFFFFF;
color |= (fillBackground << 30);
switch (size)
{
case TextScale_SIZE_6x9:
color |= (cp866_8x16 << 28) | (scale_x1 << 24);
break;
case TextScale_SIZE_8x16:
color |= (cp866_8x16 << 28);
break;
case TextScale_SIZE_12x18:
color |= (cp866_6x9 << 28) | (scale_x2 << 24);
break;
case TextScale_SIZE_16x32:
color |= (cp866_8x16 << 28) | (scale_x2 << 24);
break;
case TextScale_SIZE_18x27:
color |= (cp866_6x9 << 28) | (scale_x3 << 24);
break;
case TextScale_SIZE_24x36:
color |= (cp866_6x9 << 28) | (scale_x4 << 24);
break;
case TextScale_SIZE_24x48:
color |= (cp866_8x16 << 28) | (scale_x3 << 24);
break;
case TextScale_SIZE_30x45:
color |= (cp866_6x9 << 28) | (scale_x5 << 24);
break;
case TextScale_SIZE_36x54:
color |= (cp866_6x9 << 28) | (scale_x6 << 24);
break;
case TextScale_SIZE_40x80:
color |= (cp866_8x16 << 28) | (scale_x5 << 24);
break;
case TextScale_SIZE_42x63:
color |= (cp866_6x9 << 28) | (scale_x7 << 24);
break;
case TextScale_SIZE_48x72:
color |= (cp866_6x9 << 28) | (scale_x8 << 24);
break;
case TextScale_SIZE_48x96:
color |= (cp866_8x16 << 28) | (scale_x6 << 24);
break;
case TextScale_SIZE_56x112:
color |= (cp866_8x16 << 28) | (scale_x7 << 24);
break;
case TextScale_SIZE_64x128:
color |= (cp866_8x16 << 28) | (scale_x8 << 24);
break;
default:
break;
};
if (len <= 0)
color |= (1 << 31);
asm_inline(
"int $0x40" ::"a"(4),
"b"((x << 16) | y),
"c"(color),
"d"(text),
"S"(len),
"D"(backgroundColor));
}
static int syscalls_drawText(lua_State* L)
{
syscall_drawText(
luaL_checkstring(L, 1),
luaL_checkinteger(L, 2),
luaL_checkinteger(L, 3),
luaL_checkinteger(L, 4),
luaL_optinteger(L, 5, TextScale_SIZE_8x16),
luaL_optinteger(L, 6, 0),
luaL_optinteger(L, 7, 0),
luaL_optinteger(L, 8, 0));
return 0;
}
static int syscalls_drawRectangle(lua_State* L)
{
_ksys_draw_bar(
luaL_checkinteger(L, 1),
luaL_checkinteger(L, 2),
luaL_checkinteger(L, 3),
luaL_checkinteger(L, 4),
luaL_checkinteger(L, 5));
return 0;
}
static int syscalls_ReadPoint(lua_State* L)
{
ksys_color_t color;
if (syscalls_screenSizeCache.val == 0)
syscalls_updateScreenSize();
uint32_t x = luaL_checkinteger(L, 1);
uint32_t y = luaL_checkinteger(L, 2);
asm_inline(
"int $ 0x40"
: "=a"(color)
: "a"(35), "b"(x * syscalls_screenSizeCache.x + y));
lua_pushnumber(L, color);
return 1;
}
static int syscalls_getSystemColors(lua_State* L)
{
@@ -1854,11 +1650,13 @@ static const luaL_Reg syscallsLib[] = {
{"Accept", syscalls_Accept},
{"Send", syscalls_Send},
{"Receive", syscalls_Receive},
{"GetSocketOptions", syscalls_GetSocketOptions},
{"GetPairSocket", syscalls_GetPairSocket},
{ "SetSocketOption", syscalls_SetSocketOption },
{ "GetSocketOption", syscalls_GetSocketOption },
{"PairSocket", syscalls_PairSocket},
/* Debug */
{"DebugPuts", syscalls_DebugPuts},
{ "DebugPutc", syscalls_DebugPutc },
{"SetMessageArea", syscalls_SetMessageArea},
{NULL, NULL}
};
@@ -2043,60 +1841,7 @@ static inline void syscalls_push_connectionStatus(lua_State* L)
lua_setfield(L, -2, "connectionStatus");
}
inline void syscalls_push_textSizes(lua_State* L)
{
lua_newtable(L);
lua_pushinteger(L, TextScale_SIZE_6x9);
lua_setfield(L, -2, "6x9");
lua_pushinteger(L, TextScale_SIZE_8x16);
lua_setfield(L, -2, "8x16");
lua_pushinteger(L, TextScale_SIZE_12x18);
lua_setfield(L, -2, "12x18");
lua_pushinteger(L, TextScale_SIZE_16x32);
lua_setfield(L, -2, "16x32");
lua_pushinteger(L, TextScale_SIZE_18x27);
lua_setfield(L, -2, "18x27");
lua_pushinteger(L, TextScale_SIZE_24x36);
lua_setfield(L, -2, "24x36");
lua_pushinteger(L, TextScale_SIZE_24x48);
lua_setfield(L, -2, "24x48");
lua_pushinteger(L, TextScale_SIZE_30x45);
lua_setfield(L, -2, "30x45");
lua_pushinteger(L, TextScale_SIZE_32x64);
lua_setfield(L, -2, "32x64");
lua_pushinteger(L, TextScale_SIZE_36x54);
lua_setfield(L, -2, "36x54");
lua_pushinteger(L, TextScale_SIZE_40x80);
lua_setfield(L, -2, "40x80");
lua_pushinteger(L, TextScale_SIZE_42x63);
lua_setfield(L, -2, "42x63");
lua_pushinteger(L, TextScale_SIZE_48x72);
lua_setfield(L, -2, "48x72");
lua_pushinteger(L, TextScale_SIZE_48x96);
lua_setfield(L, -2, "48x96");
lua_pushinteger(L, TextScale_SIZE_56x112);
lua_setfield(L, -2, "56x112");
lua_pushinteger(L, TextScale_SIZE_64x128);
lua_setfield(L, -2, "64x128");
lua_setfield(L, -2, "textSize");
}
LUALIB_API int luaopen_syscalls(lua_State* L)
{

View File

@@ -37,7 +37,7 @@ inline void syscalls_ReturnTrueOrNil(LUA_INTEGER value, lua_State* L)
}
else
{
lua_pushboolean(L, true);
lua_pushboolean(L, 1);
}
}

View File

@@ -3,9 +3,6 @@
#include <string.h>
#include <stdlib.h>
static int syscalls_SystemColors_m_index;
int syscalls_newSystemColors(lua_State* L)
{
ksys_colors_table_t* colorsTable = syscalls_pushSystemColors(L);