create buffer class && some warnings fixes && update manual && create vscode tasks

This commit is contained in:
2025-05-08 23:48:52 +05:00
parent 79a79c5409
commit 521d00fdb8
16 changed files with 547 additions and 107 deletions

View File

@@ -9,7 +9,9 @@
"syscalls.h": "c", "syscalls.h": "c",
"registers.h": "c", "registers.h": "c",
"version_type.h": "c", "version_type.h": "c",
"library_version.h": "c" "library_version.h": "c",
"scancodes.h": "c",
"ipc.h": "c"
}, },
"cSpell.words": [ "cSpell.words": [
"syscalls", "syscalls",
@@ -30,6 +32,7 @@
"luaL_checkudata", "luaL_checkudata",
"luaL_optinteger", "luaL_optinteger",
"luaL_pushfail", "luaL_pushfail",
"lua_pushlightuserdata",
"lua_pushboolean", "lua_pushboolean",
"lua_pushinteger", "lua_pushinteger",
"lua_pushnumber", "lua_pushnumber",

30
.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,30 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"type": "process",
"command": "make",
"args": [
"syscalls.dll"
],
"group": {
"isDefault": true,
"kind": "build"
},
"problemMatcher": "$gcc"
},
{
"label": "Clean",
"type": "process",
"command": "make",
"args": [
"clean"
],
"group": {
"isDefault": false,
"kind": "build"
}
}
]
}

View File

@@ -35,7 +35,7 @@ MYOBJS =
Socket_O = src/sockets/socket.o src/sockets/socket_lua.o src/sockets/sockaddr.o Socket_O = src/sockets/socket.o src/sockets/socket_lua.o src/sockets/sockaddr.o
IPC_O = src/IPC/ipc.o src/IPC/IPC_msg.o IPC_O = src/IPC/ipc.o src/IPC/IPC_msg.o src/IPC/IPC_buffer.o
Debug_O = src/debug/debug.o src/debug/registers.o Debug_O = src/debug/debug.o src/debug/registers.o
Version_O = src/version/coreversion.o src/version/version_type.o Version_O = src/version/coreversion.o src/version/version_type.o
@@ -61,6 +61,7 @@ src/graphic.o: src/graphic.c src/graphic.h
src/debug/debug.o: src/debug/debug.c src/debug/debug.h src/debug/registers.h src/debug/debug.o: src/debug/debug.c src/debug/debug.h src/debug/registers.h
src/IPC/ipc.o: src/IPC/ipc.c src/IPC/ipc.h src/IPC/IPC_msg.h src/IPC/ipc.o: src/IPC/ipc.c src/IPC/ipc.h src/IPC/IPC_msg.h
src/IPC/IPC_msg.o: src/IPC/IPC_msg.c src/IPC/IPC_msg.h src/IPC/IPC_msg.o: src/IPC/IPC_msg.c src/IPC/IPC_msg.h
src/IPC/IPC_buffer.o: src/IPC/IPC_buffer.c src/IPC/IPC_buffer.h
src/debug/registers.o: src/debug/registers.c src/debug/registers.h src/syscalls.h src/debug.h src/debug/registers.o: src/debug/registers.c src/debug/registers.h src/syscalls.h src/debug.h
src/version/coreversion.o: src/version/coreversion.c src/version/coreversion.h src/version/coreversion.o: src/version/coreversion.c src/version/coreversion.h
src/version/version_type.o: src/version/version_type.c src/version/version_type.h src/debug.h src/version/version_type.o: src/version/version_type.c src/version/version_type.h src/debug.h
@@ -74,6 +75,7 @@ src/sockets/sockaddr.h: src/sockets/socket.h src/syscalls.h
src/debug/debug.h: src/syscalls.h src/debug/debug.h: src/syscalls.h
src/debug/registers.h: src/syscalls.h src/debug/registers.h: src/syscalls.h
src/IPC/IPC_msg.h: src/syscalls.h src/IPC/IPC_msg.h: src/syscalls.h
src/IPC/IPC_buffer.h: src/syscalls.h
src/IPC/ipc.h: src/syscalls.h src/IPC/ipc.h: src/syscalls.h
src/version/coreversion.h: src/version/version_type.h src/version/coreversion.h: src/version/version_type.h
src/version/version_type.h: src/syscalls.h src/version/version_type.h: src/syscalls.h

View File

@@ -4,24 +4,24 @@ This is KolibriOS lua syscalls library. Usually you shouldn't use this library
Better if you read before [KolibriOS syscalls wiki](http://wiki.kolibrios.org/wiki/) Better if you read before [KolibriOS syscalls wiki](http://wiki.kolibrios.org/wiki/)
include: include this library:
```lua ```lua
local syscalls = require("syscalls") local syscalls = require("syscalls")
``` ```
## Events ## Events
### `SetEventMask(newMask)` ### SetEventMask(newMask)
### `CheckEvent()` ### CheckEvent()
check event check [event](#events-list)
### `WaitEvent()` ### WaitEvent()
Endless wait event Endless wait [event](#events-list)
### `WaitEventTimeout(timeout)` ### WaitEventTimeout(timeout)
Wait timeout 1/100 sec Wait timeout 1/100 sec
@@ -44,37 +44,37 @@ syscalls.Event.<EventName>
## Window ## Window
### `CreateWindow(x, y, width, height, workColor, style, borderColor, titleColor)` ### CreateWindow(x, y, width, height, workColor, [style](#window-style), borderColor, titleColor)
Define window Define window
`borderColor` and `borderColor` only for `FixSizes` and `CanChangeSizes` (without skin styles) style. `borderColor` and borderColor` only for FixSizes` and CanChangeSizes` (without skin styles) style.
### `StartRedraw()` ### StartRedraw()
Start window redraw. Just call it before `CreateWindow` Start window redraw. Just call it before CreateWindow`
### `EndRedraw()` ### EndRedraw()
End window redraw. Just call it after you done redraw window. End window redraw. Just call it after you done redraw window.
### `ChangeWindow(newX, newY, newWidth, newHeight)` ### ChangeWindow(newX, newY, newWidth, newHeight)
### `FocusWindow(slot)` ### FocusWindow(slot)
### `UnfocusWindow(slot)` ### UnfocusWindow(slot)
### `SetWindowTitle(newTitle)` ### SetWindowTitle(newTitle)
### `GetSkinHeight()` ### GetSkinHeight()
return skin height. return skin height.
### `SetSkin(path)` ### SetSkin(path)
return error code return error code
### `GetSkinTitleArea()` ### GetSkinTitleArea()
return table: return table:
```lua ```lua
@@ -86,7 +86,7 @@ return table:
} }
``` ```
### Style ### Window Style
```lua ```lua
syscalls.windowStyle.<Value> syscalls.windowStyle.<Value>
@@ -134,34 +134,35 @@ syscalls.textSize.<value>
+ `56x112` + `56x112`
+ `64x128` + `64x128`
### `DrawText(text, xPos, yPos, textColor, textScale, textLen, backgroundColor, encoding)` ### DrawText(text, xPos, yPos, textColor, [textScale](#text-sizes), textLen, backgroundColor, [encoding](#text-encoding))
### `DrawTextFixSize(text, xPos, yPos, textColor, textSize, textLen, backgroundColor, encoding)` ### DrawTextFixSize(text, xPos, yPos, textColor, [textScale](#text-sizes), textLen, backgroundColor, [encoding](#text-encoding))
Draw text. Draw text.
textSize, textLen, backgroundColor, encoding are optional. textSize, textLen, backgroundColor, encoding are optional.
### `DrawLine(x1, y1, x2, y2)` ### DrawLine(x1, y1, x2, y2)
### `DrawRectangle(x, y, widht, height, color)` ### DrawRectangle(x, y, width, height, color)
### `ReadPoint(x, y)` ### ReadPoint(x, y)
return color return color
## Buttons ## Buttons
### `DefineButton(x, y, widht, height, id, color)` ### DefineButton(x, y, width, height, id, color)
### `DeleteButton(id)` ### DeleteButton(id)
### `GetButton()` ### GetButton()
return pressed button or `nil` return pressed button or `nil`
### `SetButtonStyle(style)` ### SetButtonStyle([style](#button-styles))
Set buttons style
### buttons ### buttons
@@ -174,20 +175,23 @@ syscalls.buttons.<Value>
+ `close` + `close`
+ `minimization` + `minimization`
### ButtonStyles ### Button styles
```lua ```lua
syscalls.buttonStyle.<Value> syscalls.buttonStyle.<Value>
``` ```
+ `Flat`
+ `Volume`
## Keyboard ## Keyboard
### `GetKey()` ### GetKey()
return: return:
+ nil if buffer empty + `nil` if buffer empty
+ if hotkey return second number + if hotkey return second number
+ if key pressed and key input mode is ascii return string(1 char), else return scancode + if key pressed and key input mode is ascii return string(1 char), else return [scancode](#scancodes)
example: example:
@@ -199,15 +203,15 @@ if key then
end end
if hotkey then if hotkey then
print(hotkey pressed) print("hotkey pressed")
end end
``` ```
### `SetKeyInputMode(mode)` ### SetKeyInputMode(mode)
by default is `ASCII` by default is `ASCII`
### `GetKeyInputMode()` ### GetKeyInputMode()
return key input mode. return key input mode.
@@ -310,17 +314,18 @@ syscalls.SystemColors.new(
) )
``` ```
### `GetSystemColors()` ### GetSystemColors()
return SystemColors return [SystemColors](#systemcolors-type)
### `SetSystemColors(SystemColors)` ### SetSystemColors([SystemColors](#systemcolors-type))
## Threads ## Threads
### `ThreadInfo(pid)` ### ThreadInfo(pid)
return table: return table:
```lua ```lua
{ {
name: string, name: string,
@@ -339,7 +344,7 @@ return table:
} }
``` ```
### `KillBySlot(slot)` ### KillBySlot(slot)
### Slot states ### Slot states
@@ -357,7 +362,9 @@ syscalls.slotState.<Value>
## Sockets ## Sockets
### `OpenSocket(domain, type, protocol)` ### OpenSocket([domain](#socket-types), [type](#address-families), [protocol](#ip-protocols))
return socket
```lua ```lua
local socket, err = syscalls.OpenSocket( local socket, err = syscalls.OpenSocket(
@@ -373,9 +380,9 @@ else
end end
``` ```
### `CloseSocket(socket)` ### CloseSocket(socket)
### `PairSocket()` ### PairSocket()
```lua ```lua
local first, second = PairSocket() local first, second = PairSocket()
@@ -387,19 +394,19 @@ else
end end
``` ```
### `Bind(socket, address)` ### Bind(socket, address)
### `Listen(socket, backlog)` ### Listen(socket, backlog)
### `Connect(socket, address)` ### Connect(socket, address)
### `Accept(socket, , flags)` ### Accept(socket, , flags)
### `Receive(socket, , flags)` ### Receive(socket, , flags)
### `SetSocketOption(socket, opt)` ### SetSocketOption(socket, [opt](#socket-options))
### `GetSocketOption(socket, opt)` ### GetSocketOption(socket, [opt](#socket-options))
### Socket types ### Socket types
@@ -468,53 +475,116 @@ syscalls.SO.<Value>
} }
``` ```
### `DebugPutc(char)` ### DebugPutc(char)
Put char to debug board Put char to debug board
### `DebugPuts(text)` ### DebugPuts(text)
Put string to debug board Put string to debug board
### `GetRegisters(pid)` ### GetRegisters(pid)
The process must be loaded for debugging (as stated in the general description). The process must be loaded for debugging (as stated in the general description).
return registers table return registers table
### `SetRegisters(pid, registers)` ### SetRegisters(pid, [registers](#registers-type))
The process must be loaded for debugging (as stated in the general description). The process must be loaded for debugging (as stated in the general description).
### `Disconnect(pid)` ### Disconnect(pid)
The process must be loaded for debugging (as stated in the general description). The process must be loaded for debugging (as stated in the general description).
If the process was suspended, it resumes execution. If the process was suspended, it resumes execution.
### `Stop(pid)` ### Stop(pid)
The process must be loaded for debugging (as stated in the general description). The process must be loaded for debugging (as stated in the general description).
### `Continue(pid)` ### Continue(pid)
The process must be loaded for debugging (as stated in the general description). The process must be loaded for debugging (as stated in the general description).
### `ReadFromMem(pid, bytes, pointer, buffer)` ### ReadFromMem(pid, bytes, pointer, buffer)
The process must be loaded for debugging (as stated in the general description). The process must be loaded for debugging (as stated in the general description).
return or `nil` return or `nil`
### `WriteToMem(pid, bytes, pointer, buffer)` ### WriteToMem(pid, bytes, pointer, buffer)
The process must be loaded for debugging (as stated in the general description). The process must be loaded for debugging (as stated in the general description).
return or `nil` return or `nil`
### `Done(pid)` ### Done(pid)
### `DefineBreakpoint(pid, index, condition, len)` ### DefineBreakpoint(pid, index, condition, len)
### `UndefBreakpoint(pid, index, condition, len)` ### UndefBreakpoint(pid, index, condition, len)
## IPC
### DefineIPCBuffer(size)
Define buffer for IPC receive
Return [buffer](#ipc_buffer) type
### SendIPCMessage(pid, [message](#ipc_msg))
Send message to process by pid
return [Error code](#ipc-error-codes)
### IPC Error codes
```lua
syscalls.IPCError.<Value>
```
+ `Ok`
+ `BufferLocked`
+ `BufferNotDefined`
+ `BufferOverflow`
+ `PIDNotExist`
### IPC_buffer
```lua
{
used: number,
lock: boolean,
Lock: (self: IPC_buffer) -> nil
Unlock: (self: IPC_buffer) -> nil
GetMessage: (self: IPC_buffer, i: number) -> IPC_msg
GetLastMessage: (self: IPC_buffer) -> IPC_msg
}
```
#### Lock(self)
Lock buffer
#### Unlock(self)
Unlock buffer
#### GetMessage(self, i)
return [message](#ipc_msg) that were send by number i
#### GetLastMessage(self)
return last sended [message](#ipc_msg)
### IPC_msg
```lua
{
pid: number,
size: number
}
```

1
lua Submodule

repo.diff.submodule_added%!(EXTRA template.HTML=lua, template.HTML=eae2ea0aaa)

View File

@@ -33,7 +33,7 @@ int syscalls_indexARPEntry(lua_State* L)
else if (strcmp(index, "MAC") == 0) else if (strcmp(index, "MAC") == 0)
{ {
char str[7]; char str[7];
memset(str, entry->MAC, 6); memcpy(str, &entry->MAC, 6);
str[6] = '\n'; str[6] = '\n';
lua_pushstring(L, str); lua_pushstring(L, str);
} }
@@ -79,7 +79,7 @@ int syscalls_newindexARPEntry(lua_State* L)
} }
else else
{ {
_ksys_debug_puts("err\n"); luaL_error(L, "wrong index: %s", index);
} }
return 0; return 0;

View File

@@ -10,7 +10,7 @@
struct ARP_entry struct ARP_entry
{ {
uint32_t IP; uint32_t IP;
char MAC[6]; uint8_t MAC[6];
uint16_t Status; uint16_t Status;
uint16_t TTL; uint16_t TTL;
}; };

232
src/IPC/IPC_buffer.c Normal file
View File

@@ -0,0 +1,232 @@
#include "IPC_buffer.h"
#include <string.h>
#include "../debug.h"
#include <ctype.h>
static int syscalls_indexIPC_buffer(lua_State* L)
{
struct IPC_buffer* r = luaL_checkudata(L, 1, syscalls_IPC_buffer_metatable_name);
const char* index = luaL_checkstring(L, 2);
if (strcmp(index, "used") == 0)
{
lua_pushinteger(L, r->used);
}
else if (strcmp(index, "lock") == 0)
{
lua_pushboolean(L, r->lock);
}
else if (strcmp(index, "size") == 0)
{
lua_pushnumber(L, r->size);
}
else
{
lua_pushnil(L);
}
return 1;
}
static int syscalls_newindexIPC_buffer(lua_State* L)
{
struct IPC_buffer* r = luaL_checkudata(L, 1, syscalls_IPC_buffer_metatable_name);
const char* index = luaL_checkstring(L, 2);
int val = luaL_checkinteger(L, 3);
if (strcmp(index, "used") == 0)
{
r->used = val;
}
else if (strcmp(index, "lock") == 0)
{
r->lock = val;
}
else
{
luaL_error(L, "wrong index: %s", index);
}
return 0;
}
static bool compare_ipc_buffer(ksys_ipc_buffer* a, ksys_ipc_buffer* b)
{ // блять че за высер...
if (a == b)
return true;
if (a->used == b->used)
{
return memcmp(
a + (2 * sizeof(unsigned)),
b + (2 * sizeof(unsigned)),
a->used
);
}
else // длина сообщений не совпадает, занчитт они зразу не могут быть равны
{
return false;
}
}
static int syscalls_eqIPC_buffer(lua_State* L)
{
lua_pushboolean(
L,
compare_ipc_buffer(
luaL_checkudata(L, 1, syscalls_IPC_buffer_metatable_name),
luaL_checkudata(L, 2, syscalls_IPC_buffer_metatable_name)
)
);
return 1;
}
static int syscalls_IPC_buffer_lock(lua_State* L)
{
ksys_ipc_buffer* buffer = luaL_checkudata(L, 1, syscalls_IPC_buffer_metatable_name);
buffer->lock = 1;
return 0;
}
static int syscalls_IPC_buffer_unlock(lua_State* L)
{
ksys_ipc_buffer* buffer = luaL_checkudata(L, 1, syscalls_IPC_buffer_metatable_name);
buffer->lock = 0;
return 0;
}
/**
* @brief Получить сообщение под номером
* @param buffer
* @param i
* @return указатель на сообщение, если такого сообщения ещё нет, то возвращает
*/
static ksys_ipc_msg* IPC_buffer_get_message(struct IPC_buffer* buffer, int i)
{
ksys_ipc_msg* j = (ksys_ipc_msg*)(buffer + 8);
unsigned diff = 0;
for (int k = 0; k < i; k++)
{
diff += j->datalen + 8; // прибавление длинны сообщения и заголовка
j += diff;
if (diff >= buffer->used)
return 0;
}
return j;
}
static ksys_ipc_msg* IPC_buffer_get_last_message(struct IPC_buffer* buffer)
{
ksys_ipc_msg* j = (ksys_ipc_msg*)(buffer + 8);
unsigned diff = 0;
while (diff < buffer->used)
{
j += diff;
diff += j->datalen + 8; // прибавление длинны сообщения и заголовка
}
return j;
}
static int syscalls_IPC_buffer_get_message(lua_State* L)
{
struct IPC_buffer* buffer = luaL_checkudata(L, 1, syscalls_IPC_buffer_metatable_name);
unsigned i = luaL_checkinteger(L, 1);
ksys_ipc_msg* msg = IPC_buffer_get_message(buffer, i);
if (msg)
{
lua_pushlightuserdata(L, msg);
}
else
{
lua_pushnil(L);
}
return 1;
}
static int syscalls_IPC_buffer_get_last_message(lua_State* L)
{
struct IPC_buffer* buffer = luaL_checkudata(L, 1, syscalls_IPC_buffer_metatable_name);
lua_pushlightuserdata(L, IPC_buffer_get_last_message(buffer));
return 1;
}
static int syscalls_IPC_buffer_reset(lua_State* L)
{
struct IPC_buffer* buffer = luaL_checkudata(L, 1, syscalls_IPC_buffer_metatable_name);
buffer->used = 0;
memset(&buffer->data, 0, buffer->size);
return 0;
}
static const luaL_Reg syscalls_IPC_buffer_m[] = {
{"__index", syscalls_indexIPC_buffer},
{"__newindex", syscalls_newindexIPC_buffer},
{"__eq", syscalls_eqIPC_buffer},
{"Lock", syscalls_IPC_buffer_lock},
{"Unlock", syscalls_IPC_buffer_unlock},
{"GetMessage", syscalls_IPC_buffer_get_message},
{"GetLastMessage", syscalls_IPC_buffer_get_last_message},
{"Reset", syscalls_IPC_buffer_reset},
{NULL, NULL}
};
struct IPC_buffer* syscalls_pushIPC_buffer(lua_State* L, size_t size)
{
DEBUG_LINE("push " syscalls_IPC_buffer_name " entry");
struct IPC_buffer* buffer = lua_newuserdata(L, sizeof(struct IPC_buffer) + size);
luaL_setmetatable(L, syscalls_IPC_buffer_metatable_name);
buffer->used = 0;
buffer->size = size;
return buffer;
}
static int syscalls_newIPC_buffer(lua_State* L)
{
size_t size = luaL_checkinteger(L, 1);
struct IPC_buffer* buffer = syscalls_pushIPC_buffer(L, size);
return 1;
}
static const luaL_Reg syscalls_IPC_buffer_lib[] = {
{"new", syscalls_newIPC_buffer},
{NULL, NULL}
};
void syscalls_register_IPC_buffer(lua_State* L)
{
DEBUG_LINE("register " syscalls_IPC_buffer_name " entry");
luaL_newlib(L, syscalls_IPC_buffer_lib);
lua_setfield(L, -2, syscalls_IPC_buffer_name);
luaL_newmetatable(L, syscalls_IPC_buffer_metatable_name);
luaL_setfuncs(L, syscalls_IPC_buffer_m, 0);
lua_pop(L, 1);
}

22
src/IPC/IPC_buffer.h Normal file
View File

@@ -0,0 +1,22 @@
#ifndef __IPC_BUFFER_H__
#define __IPC_BUFFER_H__
#include "../syscalls.h"
struct IPC_buffer
{
size_t size;
ksys_ipc_buffer;
};
#define syscalls_IPC_buffer_metatable_name "syscalls IPCbuffer metatable"
#define syscalls_IPC_buffer_name "IPCbuffer"
struct IPC_buffer* syscalls_pushIPC_buffer(lua_State* L, size_t dataLen);
/**
* Register SystemColors lib
*/
void syscalls_register_IPC_buffer(lua_State* L);
#endif // __IPC_BUFFER_H__

View File

@@ -52,7 +52,7 @@ static int syscalls_newindexIPC_msg(lua_State* L)
} }
else else
{ {
if (index_i < r->data) if (index_i < (unsigned)r->data)
{ {
((lua_Integer*)r + (2 * sizeof(unsigned)))[index_i] = val; ((lua_Integer*)r + (2 * sizeof(unsigned)))[index_i] = val;
} }
@@ -62,9 +62,7 @@ static int syscalls_newindexIPC_msg(lua_State* L)
} }
} }
lua_pushboolean(L, true); return 0;
return 1;
} }
static bool compare_ipc_msg(ksys_ipc_msg* a, ksys_ipc_msg* b) static bool compare_ipc_msg(ksys_ipc_msg* a, ksys_ipc_msg* b)
@@ -136,10 +134,19 @@ static int syscalls_IPC_msg_ReadInteger(lua_State* L)
return 1; return 1;
} }
static int syscalls_IPC_msg_tostring(lua_State* L)
{
ksys_ipc_msg* msg = luaL_checkudata(L, 1, syscalls_IPC_msg_metatable_name);
lua_pushstring(L, &msg->data);
return 1;
}
static const luaL_Reg syscalls_IPC_msg_m[] = { static const luaL_Reg syscalls_IPC_msg_m[] = {
{"__index", syscalls_indexIPC_msg}, {"__index", syscalls_indexIPC_msg},
{"__newindex", syscalls_newindexIPC_msg}, {"__newindex", syscalls_newindexIPC_msg},
{"__eq", syscalls_eqIPC_msg}, {"__eq", syscalls_eqIPC_msg},
{"__tostring", syscalls_IPC_msg_tostring},
{"ReadByte", syscalls_IPC_msg_ReadByte}, {"ReadByte", syscalls_IPC_msg_ReadByte},
{"ReadWord", syscalls_IPC_msg_ReadWord}, {"ReadWord", syscalls_IPC_msg_ReadWord},
{"ReadDword", syscalls_IPC_msg_ReadDword}, {"ReadDword", syscalls_IPC_msg_ReadDword},
@@ -151,24 +158,39 @@ ksys_ipc_msg* syscalls_pushIPC_msg(lua_State* L, size_t dataLen)
{ {
DEBUG_LINE("push IPC_msg entry"); DEBUG_LINE("push IPC_msg entry");
ksys_ipc_msg* entry = lua_newuserdata(L, sizeof(ksys_ipc_msg) + dataLen); ksys_ipc_msg* msg = lua_newuserdata(L, sizeof(ksys_ipc_msg) + dataLen);
luaL_setmetatable(L, syscalls_IPC_msg_metatable_name); luaL_setmetatable(L, syscalls_IPC_msg_metatable_name);
return entry; msg->datalen = dataLen;
return msg;
} }
static int syscalls_newIPC_msg(lua_State* L) static int syscalls_newIPC_msg(lua_State* L)
{ {
size_t dataLen = luaL_checkinteger(L, 1); size_t dataLen = luaL_checkinteger(L, 1);
ksys_ipc_msg* r = syscalls_pushIPC_msg(L, dataLen); ksys_ipc_msg* msg = syscalls_pushIPC_msg(L, dataLen);
r->datalen = dataLen;
return 1; return 1;
} }
static int syscalls_fromStringIPC_msg(lua_State* L)
{
const char* text = luaL_checkstring(L, 1);
size_t len = strlen(text);
ksys_ipc_msg* r = syscalls_pushIPC_msg(L, len);
memcpy(&r->data, text, len);
return 1;
}
static const luaL_Reg syscalls_IPC_msg_lib[] = { static const luaL_Reg syscalls_IPC_msg_lib[] = {
{"new", syscalls_newIPC_msg}, {"new", syscalls_newIPC_msg},
{"fromString", syscalls_fromStringIPC_msg},
{NULL, NULL} {NULL, NULL}
}; };

View File

@@ -1,12 +1,13 @@
#include "ipc.h" #include "ipc.h"
#include "IPC_msg.h" #include "IPC_msg.h"
#include "IPC_buffer.h"
#include <sys/ksys.h> #include <sys/ksys.h>
inline static void define_ipc(ksys_ipc_buffer* buffer, size_t bufLen) inline static void define_ipc(struct IPC_buffer* buffer, size_t bufLen)
{ {
asm_inline( asm_inline(
"int $0x40" "int $0x40"
::"a"(60), "b"(1), "c"(buffer), "d"(bufLen) ::"a"(60), "b"(1), "c"(buffer + (sizeof(struct IPC_buffer) - sizeof(ksys_ipc_msg))), "d"(bufLen)
); );
} }
@@ -17,7 +18,7 @@ inline static enum SendIPCErrors send_ipc(int pid, ksys_ipc_msg* msg)
asm_inline( asm_inline(
"int $0x40" "int $0x40"
: "=a"(ret) : "=a"(ret)
: "a"(60), "b"(2), "c"(pid), "d"(msg), "S"(sizeof(ksys_ipc_msg) + msg->datalen) : "a"(60), "b"(2), "c"(pid), "d"(msg), "S"((sizeof(ksys_ipc_msg)) + msg->datalen)
); );
return ret; return ret;
@@ -26,11 +27,11 @@ inline static enum SendIPCErrors send_ipc(int pid, ksys_ipc_msg* msg)
int syscalls_DefineIPCBuffer(lua_State* L) int syscalls_DefineIPCBuffer(lua_State* L)
{ {
uint32_t len = luaL_checkinteger(L, 1); uint32_t len = luaL_checkinteger(L, 1);
ksys_ipc_buffer* buffer; ksys_ipc_buffer* buffer = syscalls_pushIPC_buffer(L, len);
define_ipc(buffer, len); define_ipc(buffer, len);
return 0; return 1;
} }
int syscalls_SendIPCMessage(lua_State* L) int syscalls_SendIPCMessage(lua_State* L)
@@ -39,7 +40,7 @@ int syscalls_SendIPCMessage(lua_State* L)
L, L,
send_ipc( send_ipc(
luaL_checkinteger(L, 1), luaL_checkinteger(L, 1),
luaL_checkudata(L, 1, syscalls_IPC_msg_metatable_name) luaL_checkudata(L, 2, syscalls_IPC_msg_metatable_name)
) )
); );

View File

@@ -20,6 +20,6 @@ struct registers
struct registers* syscalls_pushRegisters(lua_State* L); struct registers* syscalls_pushRegisters(lua_State* L);
inline void syscalls_register_registers(lua_State* L); void syscalls_register_registers(lua_State* L);
#endif // __REGISTERS_H__ #endif // __REGISTERS_H__

View File

@@ -17,6 +17,7 @@
#include "graphic.h" #include "graphic.h"
#include "IPC/ipc.h" #include "IPC/ipc.h"
#include "IPC/IPC_msg.h" #include "IPC/IPC_msg.h"
#include "IPC/IPC_buffer.h"
#include "version/coreversion.h" #include "version/coreversion.h"
#include "version/library_version.h" #include "version/library_version.h"
#include "background/background.h" #include "background/background.h"
@@ -252,7 +253,7 @@ static int syscalls_threadInfo(lua_State* L)
{ {
ksys_thread_t t; ksys_thread_t t;
_ksys_thread_info(&t, luaL_checkinteger(L, 1)); _ksys_thread_info(&t, luaL_optinteger(L, 1, -1));
lua_createtable(L, 0, 13); lua_createtable(L, 0, 13);
@@ -1760,18 +1761,28 @@ LUALIB_API int luaopen_syscalls(lua_State* L)
syscalls_push_events(L); syscalls_push_events(L);
syscalls_push_slotStates(L); syscalls_push_slotStates(L);
syscalls_register_scancodes(L); syscalls_register_scancodes(L);
syscalls_push_hotkey_states(L); syscalls_push_hotkey_states(L);
syscalls_push_buttonsStyle(L); syscalls_push_buttonsStyle(L);
syscalls_push_windowStyles(L); syscalls_push_windowStyles(L);
syscalls_push_buttons(L); syscalls_push_buttons(L);
// net
syscalls_push_connectionStatus(L); syscalls_push_connectionStatus(L);
syscalls_register_ARPEntry(L);
syscalls_push_graphic(L); syscalls_push_graphic(L);
// Register IPC
syscalls_register_IPC_msg(L); syscalls_register_IPC_msg(L);
syscalls_register_IPC_buffer(L);
syscalls_push_IPC_errors(L); syscalls_push_IPC_errors(L);
syscalls_register_ARPEntry(L);
syscalls_register_SystemColors(L); syscalls_register_SystemColors(L);
syscalls_register_Version(L); syscalls_register_Version(L);
_ksys_set_event_mask(7); // set default event mask _ksys_set_event_mask(7); // set default event mask

26
tests/ipc_get.lua Normal file
View File

@@ -0,0 +1,26 @@
--[[
Этот скрипт принимает данные от ipc_send и выводит в консоль
]]
local syscalls = require("syscalls")
syscalls.SetEventMask(1 << (syscalls.Event.IPC - 1))
local pid = syscalls.ThreadInfo().PID
local f = io.open("/tmp0/1/lua_test_ipc_pid", "w")
if f then
f:write(pid)
f:close()
end
local buffer = syscalls.DefineIPCBuffer(4096)
while true do
if syscalls.WaitEvent() == syscalls.Event.IPC then
print(buffer:GetLastMessage())
end
end

20
tests/ipc_send.lua Normal file
View File

@@ -0,0 +1,20 @@
--[[
скрипт который отправляет данные по IPC
]]
local syscalls = require("syscalls")
local f = io.open("/tmp0/1/lua_test_ipc_pid", "r")
local pid
if f then
pid = tonumber(f:read("l"))
f:close()
end
if pid then
while true do
print(syscalls.SendIPCMessage(pid, syscalls.IPC_msg.fromString("Test aboba")))
end
end