From eb72cf5cb9dad33a1b42d987af6b1300c4d4b468 Mon Sep 17 00:00:00 2001
From: Mikhail Frolov
Date: Fri, 23 May 2025 08:12:42 +0500
Subject: [PATCH] fix bugs and update sys_func.inc code
fixed size sockaddr struct
update function CreateThread
clear code in main file
---
bin/httpd | Bin 6204 -> 6220 bytes
bin/modules/block_access.obj | Bin 674 -> 674 bytes
bin/modules/redirect.obj | Bin 687 -> 687 bytes
bin/modules/srv_control.obj | Bin 1643 -> 1643 bytes
bin/modules/test_unit.obj | Bin 1810 -> 1810 bytes
bin/modules/test_unit4.obj | Bin 828 -> 848 bytes
bin/modules/test_unit5.obj | Bin 718 -> 718 bytes
bin/modules/test_unit6.obj | Bin 0 -> 659 bytes
bin/modules/test_unit_2.obj | Bin 2012 -> 2012 bytes
example/readme.md | 1 +
example/srv_control.asm | 1 -
example/test_unit4.asm | 3 +-
example/test_unit5.asm | 1 -
example/test_unit6.asm | 113 +++++++++++++++++++++++++++++++++++
example/test_unit_2.asm | 1 -
httpd.asm | 56 +++++++----------
module_api.inc | 17 +++++-
sys_func.inc | 39 ++++++++----
utils/block_access.asm | 1 -
utils/redirect.asm | 1 -
20 files changed, 180 insertions(+), 54 deletions(-)
create mode 100644 bin/modules/test_unit6.obj
create mode 100644 example/test_unit6.asm
diff --git a/bin/httpd b/bin/httpd
index 06edceaeca2b00fa103eb807edcdbb160eda8562..3f85bda91ac209594d0cd099bee6a0d09f5a45be 100644
GIT binary patch
delta 2494
zcmZWqeN0=|6~E8e;1L@;#C$X%l{X$O6dFuhvap!OUX4Q#^&Z4FEXhKH8ur4v6=lx}
zNLg(3LY9|TwrWrNW9m933#$4tZRw~cqeRpJ4`*4?Sk^U_7ENvc=$-~$`A7$CqTT)O
zv)Sl&rE}l8=lssO=bn4+c~?DedA2{<5{k5hJq;Woq}WEtTqz;v8glgd_CeF3hbD-V
z5GA8bHKbNv8=ktihY%|9wjY|3kHY8*vz+*?iI7>}!Ja8I>85j|&+#NhX)?g{c1*Lr
zB*mEZ?a#_K8M1@ZI^%P59}FJhe@zX%o1%_KuaY?iWu~)Lat`
zn~o@bME}93$j%y-^7G8RoHiRt%2?XV2|Edqn+L!VY0E|S73hGI3f69wjHF`A8H}t1cru2`}&Y?mvG1G~8UXv)L-AxqY$Q${jiF?8{i5g2+U~UQ~|QnDw~`pK-)j
znBAS7BFR!JHygo7mL#i9LG*5jV*xg2(|wnE;jX_>^#6~l?@~8YpyUvrD1jH-H$c`;
zu^)cBCKx9ECIdC3mVf!R;g1=sG)pLv9{tOJtos>+M2!5OpIB|y$D2&gT+HmH^-A-g
z8}{PaLfBNp2FYUwZAeXv>>cVy)+j|L&)mRCRr^kMTZ%Q~Gc)EAn?`;Y%TxSj)W5{L
zMh9JEi8v*(PcxP?aLk6SDdTI+SeWuWC}Ux&9~&G~UI0xw3GOs$
zV;v!Ps3Gl%O_lK@P=3B(Vx96rbvUXYMF_a*fZEQxJM@Q*m9&$sluSogRJRyOk?xn%
z)k^az#Hg%s1*${NnB^uCyA#zNFq!Vst@r>F)#*Pe%~%-n9ExvR|2@|3WHmv*N?@Ax
ziL4Rot1CvbMo`>bRG*Cfl|+OBQ=f-@0@NDerfRtUhTYTj+aox&Uot)s&OA
z=A=91X5%$URV+v3%G1VnNaWw-X5%qRe-%GNBi4TcgZY~|>v!&;on~98ybw;tH$*xb
z=FR=i&K&SAfC$WSW*L4JGcS?^e5K%v70sWSFu=Q%DdodV5WykgY*K^e2C&A=(-STZ
z^G^Mfbx+R&fcWybVEOO@u>u|1?$Vp_k|BL&y>T2e8V9QGgjYLm-yeSh`gw~!pGU}W
znpw%Gco&hrfM178UxRP@7_W~bzj8V}ooK3;8kNvvyF(R@?-$|e_!C3)E3w5HKP7#`
zP4)G$GWnWG3GFffA0Z$HsE;k~Q$k+l59hg8{f6dG(46OH3W!%bP;_6(9PZYOT)Ygi
zGUa#thC82_)6Nw=$OW{^MXr3`K4zxfD0+aa(3Xn6RNso_$s*?49lOIe$FnoiKAj2H
z!3h~XOHgV`(9>{J4OVDhbyRV6n&@bam*)jtO0YscU0!^=R|)aV(SZ$)*t$*M@h_u}
z{Yt2s37Y(U!$Z_w7+dbkU^C)ZZq!Cy^50EO(el$3dKHp{s^0>rv`GoIW5=57N>ET1
zrxBMLsvd4?4TlBC$OTTTcW&jpTAS0|YILDns-5+rl`(a|JC-=j8UUX9E%{@2XP5rQ
zGNq$?-xWIbXTh
zemuShmq$q?9>Mq*Ja`hP>65iHw*FCnK+_X!dk3h7UGZCJ~8r?k79YsagLg}kb_;Qcmep6vp1pg?%gZcrQO0O;8GizSuZ7g?{r
z4PxV&W4*_|b8N@6z5V3*HOS0(xlZl<(kn(2WbK;`*6&!SyP&;ZR{PWv>OUXFpK=fq
z#djO%EGP~73#bhL@kj9o`8H?>^fKsekOu0?CnSs~vjhwe{yFfUZALu!vKG(AzX3+x
BWgh?l
delta 2463
zcmZ8jeN0=|6~E8e;2Imde6J;y+dLX9P_Vm@Knj&T8Hb?OGXzXY+khg(UMSk8#!k|x
zi_Ko>`uZA)?)_7>ofZav(5|aCu~i^CX26T9Dy$jP+DMJ2blR$`g)AY^LAS1Nzw>O?
zq*prkoqN9SIp>~p?2F!ay*nOj4R^P8d3^$7>}nxnsdC0n`Eu~99j8p5owLlvn37Qz
zeW~@Ik1R4jV>91`_#Ek|kBatX{}X+SW;VTM`i>yfO!t~ig6XdRYEM}j8{aBp?1l0L
zZVvzTy7GzI$|UHpAzO#;<pdPQ5dRP0C^0;Z?>jx5?)v`6g{
z?P~iTH72^$&PGkhueG|f2N8#Atv7$lzg5iGY!$9ppWJLUCxOK6^S>tIH@1n^EV1nl
zNrqTr_W4pRP*5sd(xL^m6;p6MqFnN=Y&J}Og`U@5DR7q$kaA?(qKPcl&U>{#6!Z!E
zwB6Q+5*~Tgk_n1}!{)GEFpJ)=VwWtCrWil@oWi#tanT-M$_S1!@to+APX}4-UiBIO
z!|lP>PvoiXK~H;7X!m!lPd@&W6IGsth>^vPsQwU7k(DhymY-)9<+RyIRmM`%T*)XT
zCb#qhW3iI)er?TKlJMu~OUiP_LPE4M79wY{U=EX4UCO6JY{(UrJQa*dZfxCp*=3Z+
zXv#TShM0XTzSOK4Y9_N-=M8RFpGTUK&7$}CKY!K*GYbydt#Vp87{8)y$Z6MLB4dew
zW@3^TwI)?(jb1g3#%&o3-A-=LP;TWG!%GLY{(#k1E`Hf9ozt(;(
zR2tD6NJpB1xL!7e9pZmfLay<*fGZ*U_%DsGHDe*>X+Xw8tWg6a<``hn#qfAD+Ofhy
z;gl9H+?nVA_0E!rcgm|ZT~R)OyGK*;AiCP!!Rw4uY%iUZOh-?Yn~kVr_sQuRrDYh-
zDO*B;>Xb8PxrxO$qPz$yOFg^*AIL=cm;ciBjD;jmp}dx6f{d|UbEqD+?4LnC*<8}V
zC7N9Pfej<6qw}E67HRwJb%%e7DMBTC79{GMq(l`aQPc8Hq>#Gj>4`^?z#*4J)u}ho
zfe+<)LA`;BDMvk?qwbbl{Mv8rl?kKMVtNY3JWDbb<-Y-gD&)^Z4~kZ0QTa3z!adnQm>RN62T9ap7WETW0sCIQ
zW82yo#PHmCLdZU{%B(1(u$3P|*dPvX&xI$)sd6w|Pk6Og9fuOV;9s+F!OYl5nv~?{
zL@SHkg~4p)*O6R(kH|k>*Y$HRiESyw7sM@d4s3XhY^=$q`dEV!u6a1@a{j0Yxeg?s
z)%VA5UI^%HaHOfeK3*X&n3QmxA#fe4Bv2o}c~A-4yvheJ3U3C$()x?4%TjpqX5D#q
z3R22q!1<2wVlt(@TD0rlM&HV}M*f`y{rIr*(uZ6B(RC%d=b)i^rRYJyrR6yvsBea$
zlSO3T9p4}a(0zuROPP=xy6oKZ32kA((XMRB2b@wBQ`yi>G{6asu)y)_1@UQ^)S_8qDTQ!S@W~7II
zXz0cqs$Gn9bo0ldbnPnlgWAnsK<9Sz*WeN+9@fwkQhzBLX)pib&25_W8W>W##2`OS
zBqErv)nLoQK>=v3y4&z{;G(lR8-4`HAiu+X>4q|u{e@f{Vp!J2>2Lq
zgDwM3ld+w7$RqGW_`VF70{jgNVc`63#@@u28j{xk0QWRdO8@`>
diff --git a/bin/modules/block_access.obj b/bin/modules/block_access.obj
index a2dd1cd6ecaa3d0fae6b542d0b8d26dab842b2cd..5e88979a150b013e23a34fba85a46e4c5f2f5714 100644
GIT binary patch
delta 17
YcmZ3)x`>s-hmncl`(yo#jU2O>04^T|YybcN
delta 17
YcmZ3)x`>s-hmnb)=5uD+Mvhrb04xawIRF3v
diff --git a/bin/modules/redirect.obj b/bin/modules/redirect.obj
index 0b52967d623a957722a4a20b24a4f4b0461135c1..c43c180dae1527bb0fece4f8f1d7044652bcd60b 100644
GIT binary patch
delta 17
YcmZ3_x}KH8hmncl`(yo#jU3CF0591ElK=n!
delta 17
YcmZ3_x}KH8hmnb)=5uD+Mvmo704>7>U;qFB
diff --git a/bin/modules/srv_control.obj b/bin/modules/srv_control.obj
index 071e6ccbc497d11b74d4c904342d059aab3d94c0..dbdf1aa0a525acf4541f64fbb56544e2e0c393b8 100644
GIT binary patch
delta 17
YcmaFO^O}dlhmncl`(yo#jU35r05_)v*#H0l
delta 17
YcmaFO^O}dlhmnb)=5uD+Mvi1Q05y>XrT_o{
diff --git a/bin/modules/test_unit.obj b/bin/modules/test_unit.obj
index a0d0c255e7a71a0319f136516ce69f016da8be04..87a1df804a2695b9a0cb327aefb4597f5a84d1aa 100644
GIT binary patch
delta 38
ucmbQlH;IqKhmncl`(yo#i5$DR9T@qWW-~A_bi27sJm<>juvvuhA1eUd4GWq8
delta 38
ucmbQlH;IqKhmnb)=5uD+M2_9uCXD<|vl$o|y4@@$o^xe1*(}2Nj}-va01HC^
diff --git a/bin/modules/test_unit4.obj b/bin/modules/test_unit4.obj
index 7e7b44614cb6ce80337696954cfd62337d52d31e..53c14877a0acd121634df55aef272f8deeba0dc1 100644
GIT binary patch
delta 190
zcmdnPc7cu4hmncl`(ynKv5B10hQAmX7*c@Pj|oTs0Ur=6Fa$X0r6iUlf<++22Ot&4
z$iQ%GVrY(1X?K{7;Ym-&1{*Gh(w~9N$5}EIfO28~MRx#|wH_$(pZM5>-zMO{=oTQq
tn?(i4x-waYv6AuoH(48D^>si
delta 170
zcmcb>wug<=hmnb)_H$+$(?m{b!w(D$3@JeD!UQCMfES1r7y=yhQW8rN!6Fa>q%MS!
zf#KN1&>W@g?l1$xlb((ZHe3v)KLeYOvt%d$<--1p?f@!lJy7C0@v#Z3LBM~}EtAz4
iD;eKTUcmTIb1zU1WD6U^IXLSUob?dSdOrCgQ#}CHoF>%(
diff --git a/bin/modules/test_unit5.obj b/bin/modules/test_unit5.obj
index 92ba1a96ab40ede873abfba17dc9e6d3dba43603..47d8fae12658fde53d53f681e9f1abfd123759f4 100644
GIT binary patch
delta 17
YcmX@ddXAODhmncl`(yo#jU30A05kUm@Bjb+
delta 17
YcmX@ddXAODhmnb)_H$<1Mvh}l05RzWz5oCK
diff --git a/bin/modules/test_unit6.obj b/bin/modules/test_unit6.obj
new file mode 100644
index 0000000000000000000000000000000000000000..97d53e934302575f78aa5c8c1f704549779a0fda
GIT binary patch
literal 659
zcmeZaWMcUKSU)3@iGhKc0R&nY_0n<@OTcUhaTrLY0P$-^2%i;5DKG>$=%plr2B2)I(0&)7M7JNy!Iw;*m+k-xF~r9m
z;$a921u5!$nqi|~V3(l)1UtEaa{Sxf*xHU5Ui$vA;gCUxh)VO3|E&i~-@9bw7nN9n
zlojk`0V&(&!p9C&WeQ|7Agg?Rj73EcsL8YRPV*6_jLZTng$$blJB2KUu>YbxK*g;G
zN+dd8bw1R56c7{`@L#k8DE41;0+8%{6B~DkgW(Vh1IQr?KnwypK&%eL7C?Leh(REu
zq@*AvJ~J<~gkb`NU7T7}24g4ZLM2(%j%Gi(fbaMo-%YdxH`70v>MD?|qe
wkOhh;HU=KJm;hW%1TH247jumW@DBCTCXD<|%8U#Q-EI~ePYSaG0HP%cO#lD@
diff --git a/example/readme.md b/example/readme.md
index 8afdd4b..323dcd4 100644
--- a/example/readme.md
+++ b/example/readme.md
@@ -5,3 +5,4 @@
- `test_unit4.asm` - Модуль отправляет в ответе заданную в файле конфигурации строку параметров и uri адрес запроса клиента. Используется chunked передача ответа.
- `test_unit5.asm` - Модуль отправляет ответ используя chunked передачу.
- `srv_control.asm` - Модуль, позволяющий удалённо выключать сервер.
+ - `test_unit6.asm` - Модуль выводящий данные об ipv4 адресе и порте клиента, с которого было установлено соединение с сервером.
diff --git a/example/srv_control.asm b/example/srv_control.asm
index 1ec1854..9db4673 100644
--- a/example/srv_control.asm
+++ b/example/srv_control.asm
@@ -4,7 +4,6 @@ public @EXPORT as 'EXPORTS'
NO_DEBUG_INPUT = 0
include "macros.inc"
-purge mov,add,sub
include "proc32.inc"
include '../module_api.inc'
diff --git a/example/test_unit4.asm b/example/test_unit4.asm
index 11816e7..7bc031a 100644
--- a/example/test_unit4.asm
+++ b/example/test_unit4.asm
@@ -4,7 +4,6 @@ public @EXPORT as 'EXPORTS'
NO_DEBUG_INPUT = 0
include "macros.inc"
-purge mov,add,sub
include "proc32.inc"
include '../module_api.inc'
@@ -83,6 +82,8 @@ server_entry:
invoke IMPORT.send_resp, eax,\
[esi + CONNECT_DATA.uri_path],\
[esp + 4]
+ mov eax, [esp]
+ invoke IMPORT.finish_send_resp, eax
invoke IMPORT.destruct_resp ; arg in stack
add esp, 4
.exit:
diff --git a/example/test_unit5.asm b/example/test_unit5.asm
index ef41694..da5765b 100644
--- a/example/test_unit5.asm
+++ b/example/test_unit5.asm
@@ -4,7 +4,6 @@ public @EXPORT as 'EXPORTS'
NO_DEBUG_INPUT = 0
include "macros.inc"
-purge mov,add,sub
include "proc32.inc"
include '../module_api.inc'
diff --git a/example/test_unit6.asm b/example/test_unit6.asm
new file mode 100644
index 0000000..77110e7
--- /dev/null
+++ b/example/test_unit6.asm
@@ -0,0 +1,113 @@
+; test api 0.1.0 - get cmd path and get context unit
+format MS COFF ;<- this is lib format
+public @EXPORT as 'EXPORTS'
+
+NO_DEBUG_INPUT = 0
+include "macros.inc"
+include "proc32.inc"
+
+include '../module_api.inc'
+
+section '.flat' code readable align 16
+
+unit_init:
+ xor eax, eax
+ push esi edi
+ mov esi, [esp + 4*2 + 4]
+
+ cmp dword[esi + IMPORT_DATA.version], API_VERSION
+ jne .exit
+
+ mov edi, IMPORT
+ mov ecx, [esi + IMPORT_DATA.sizeof]
+ shr ecx, 2 ; div 4
+ rep movsd
+
+ ; create unit context
+ mov eax, 1
+ ;unit init successful
+.exit:
+ pop edi esi
+ ret 12
+
+
+server_entry:
+ push esi ebp
+ mov esi, [esp + 4*2 + 4] ; request context
+
+ mov ebp, esp
+ push dword '
'
+ push dword ' '
+
+ mov ecx, 10
+ movzx eax, word[esi + CONNECT_DATA.sockaddr.sin_port]
+ xchg al, ah
+@@:
+ xor edx, edx
+ div ecx
+ add dl, '0'
+ mov byte[esp], dl
+ add esp, -1
+ test eax, eax
+ jnz @b
+
+ inc esp
+ push dword 'ort:'
+ push dword ' p'
+
+ mov ecx, 4
+.loop:
+ movzx eax, byte[esi + CONNECT_DATA.sockaddr.sin_addr + ecx - 1]
+@@:
+ xor edx, edx
+ div dword[__10]
+ add dl, '0'
+ mov byte[esp], dl
+ add esp, -1
+ test eax, eax
+ jnz @b
+
+ mov byte[esp], '.'
+ add esp, -1
+ dec ecx
+ jnz .loop
+
+ add esp, 2
+
+ push dword 'ip: '
+ push dword ' '
+
+ invoke IMPORT.create_resp, esi, 0
+ test eax, eax
+ jz .exit
+
+ mov edx, ebp
+ mov ecx, esp
+ sub edx, esp
+
+ push eax
+ invoke IMPORT.send_resp, eax, ecx, edx
+ invoke IMPORT.destruct_resp
+ mov esp, ebp
+.exit:
+ pop ebp esi
+ ret 8
+
+server_close:
+
+ ret 4
+
+
+section '.data' data readable writable align 16
+
+__10: dd 10
+
+
+@EXPORT:
+export \
+ unit_init, 'httpd_init', \
+ server_entry, 'httpd_serv',\
+ server_close, 'httpd_close'
+
+
+IMPORT IMPORT_DATA
\ No newline at end of file
diff --git a/example/test_unit_2.asm b/example/test_unit_2.asm
index b12b651..35f3d25 100644
--- a/example/test_unit_2.asm
+++ b/example/test_unit_2.asm
@@ -3,7 +3,6 @@ public @EXPORT as 'EXPORTS'
NO_DEBUG_INPUT = 0
include "macros.inc"
-purge mov,add,sub
include "proc32.inc"
include '../module_api.inc'
diff --git a/httpd.asm b/httpd.asm
index 8b1b0e5..5c3edab 100644
--- a/httpd.asm
+++ b/httpd.asm
@@ -8,6 +8,9 @@
; ;
;*****************************************************************************;
+HTTPD_FIRST_REQUEST_BUFFER = 0x8000
+
+
;include "macros.inc"
use32
org 0
@@ -16,7 +19,6 @@
M01header.params:
dd PATH, 0
include "macros.inc"
-purge mov,add,sub
include 'module_api.inc'
@@ -31,7 +33,7 @@ include 'settings.inc'
;CODE
START:
- mcall SF_SYS_MISC, SSF_HEAP_INIT ; init heap
+ call InitHeap
mcall SF_SET_EVENTS_MASK, EVM_STACK ;set event bitmap
; init library
@@ -75,17 +77,12 @@ START:
je .sock_err
mov [srv_socket], eax
- push srv_sockaddr.length
- push dword srv_sockaddr
- push dword[srv_socket]
- call netfunc_bind; [srv_socket], srv_sockaddr, srv_sockaddr.length
+ stdcall netfunc_bind, [srv_socket], srv_sockaddr, srv_sockaddr.length
cmp eax, -1
je .bind_err
; listen()
- push dword[srv_backlog]
- push dword[srv_socket]
- call netfunc_listen; [srv_socket], [srv_backlog]
+ stdcall netfunc_listen, [srv_socket], [srv_backlog]
cmp eax, -1
jz .listen_err
@@ -107,12 +104,11 @@ START:
.shutdown:
.listen_err:
.bind_err:
- push dword[srv_socket]
- call netfunc_close; [srv_socket]
+ stdcall netfunc_close, [srv_socket]
.err_settings:
.sock_err:
- mcall SF_TERMINATE_PROCESS
+ ThreadExit
;-----------------------------------------------------------------------------
@@ -120,28 +116,23 @@ thread_connect:
sub esp, sizeof.CONNECT_DATA
mcall SF_SET_EVENTS_MASK, EVM_STACK ; set event - network event
- ; ожидание подключения Accept, sockaddr находится на вершине стека нового потока
- ;lea edx, [esp + CONNECT_DATA.sockaddr] ; new sockaddr
- ;push dword 16 ; 16 byte - sockaddr length
- ;push edx
- push srv_sockaddr.length
- push dword srv_sockaddr
-
+ ; Accept - wait connection, get socket and sockaddr
+ lea edx, [esp + CONNECT_DATA.sockaddr] ; new sockaddr
+ push sizeof.sockaddr_in
+ push edx
push dword[srv_socket]
call netfunc_accept
cmp eax, -1
jz .err_accept
+ ; connection is enable
mov [esp + CONNECT_DATA.socket], eax
- mov ebp, esp
- ; соединение установленно, теперь нужно выделить буфер(тоже на 16 кб наверное), и
+ ; теперь нужно выделить буфер(тоже на 16 кб наверное), и
; прочитать в этот буфер из сокета, когда прочтём ноль(или больше 4 кб), тогда
; выходим из цикла и анализируем заголовки и стартовую стоку.
- mov esi, 0x8000
- push esi
- call Alloc ;alloc memory 32 kib
+ stdcall Alloc, HTTPD_FIRST_REQUEST_BUFFER ;alloc memory 32 kib
test eax, eax
jz .err_alloc
@@ -153,7 +144,7 @@ thread_connect:
;read data from socket
push dword 0 ;flags
mov eax, [esi + CONNECT_DATA.request_size]
- push dword 0x8000
+ push dword HTTPD_FIRST_REQUEST_BUFFER
sub [esp], eax
push dword[esi + CONNECT_DATA.buffer_request]
add [esp], eax
@@ -166,7 +157,7 @@ thread_connect:
test eax, eax
jz @f
add [esi + CONNECT_DATA.request_size], eax
- ; cmp [esi + CONNECT_DATA.request_size], 0x8000 ; check end buffer
+ ; cmp [esi + CONNECT_DATA.request_size], HTTPD_FIRST_REQUEST_BUFFER ; check end buffer
; jb @b
@@:
; после получения всего запроса(более или менее всего) выделяем озу для
@@ -269,15 +260,14 @@ thread_connect:
; free IN buffer
cmp dword[esp + CONNECT_DATA.buffer_request], 0
jz .err_alloc
- push dword[esp + CONNECT_DATA.buffer_request]
- call Free
+
+ stdcall Free, [esp + CONNECT_DATA.buffer_request]
.err_alloc:
- push dword[esp + CONNECT_DATA.socket]
- call netfunc_close
+ stdcall netfunc_close, [esp + CONNECT_DATA.socket]
.err_accept:
- lea ecx,[esp + sizeof.CONNECT_DATA - 0x4000] ; get pointer to alloc memory
- mcall 68, 13 ; free
- mcall SF_TERMINATE_PROCESS ; close thread
+ add esp, sizeof.CONNECT_DATA
+ ; close this thread
+ ret
include 'parser.inc'
diff --git a/module_api.inc b/module_api.inc
index 5cdbd67..efb7c41 100644
--- a/module_api.inc
+++ b/module_api.inc
@@ -19,9 +19,16 @@ FLAG_NO_CACHE_CONTROL = 0x80
FLAG_TRANSFER_CHUNKED = 0x100
FLAG_RAW_STREAM = 0x200
+struct sockaddr_in
+ sin_family dw ? ; sa_family_t
+ sin_port dw ? ; in_port_t
+ sin_addr dd ? ; struct in_addr
+ sin_zero rb 8 ; zero
+ends
+
struct CONNECT_DATA ; 16*4 = 64 bytes
- socket dd 0 ; номер сокета подключения
- sockaddr dd 16/4 ; socaddr connection
+ socket dd 0 ; connection socket number
+ sockaddr sockaddr_in ; socaddr connection
buffer_request dd 0 ; pointer to buffer for geting message socket
request_size dd 0 ; size geted data from client
end_buffer_request dd 0 ; privat data for parser
@@ -42,6 +49,8 @@ struct CONNECT_DATA ; 16*4 = 64 bytes
message_body_len dd 0 ; length message_body in buffer
ends
+diff10 'sizeof.CONNECT_DATA: ', 0, sizeof.CONNECT_DATA
+
struct FILED
opcode rd 1
offset rd 2
@@ -112,4 +121,6 @@ struct IMPORT_DATA
;void close_server();
GLOBAL_DATA rd 1
-ends
\ No newline at end of file
+ends
+
+HTTPD_THREAD_STACK = 0x4000 ; 16 kib
diff --git a/sys_func.inc b/sys_func.inc
index b7211cf..1054a73 100644
--- a/sys_func.inc
+++ b/sys_func.inc
@@ -57,13 +57,6 @@ SOL_SOCKET = 0xffff
SO_BINDTODEVICE = 1 shl 9
SO_NONBLOCK = 1 shl 31
-struct sockaddr_in
- sin_family dw ? ; sa_family_t
- sin_port dw ? ; in_port_t
- sin_addr dd ? ; struct in_addr
- sin_zero rb 8 ; zero
-ends
-
struct addrinfo
ai_flags dd ? ; bitmask of AI_*
ai_family dd ? ; PF_*
@@ -162,30 +155,52 @@ netfunc_recv:
pop ebx edi esi
ret 16
+macro ThreadExit {
+ mcall SF_TERMINATE_PROCESS
+}
+
; stdcall CreatThread(void* entry_thread);
CreateThread:
push ebx edi
- mcall SF_SYS_MISC, SSF_MEM_ALLOC, 0x4000 ;alloc memory 16 kib for stack
+ ;alloc memory for stack
+ mcall SF_SYS_MISC, SSF_MEM_ALLOC, HTTPD_THREAD_STACK
test eax, eax
jz .err
- mov ecx, 0x4000/4
+ mov ecx, HTTPD_THREAD_STACK/4
mov edi, eax
;start thread for new connection
mov edx, eax
xor eax, eax
rep stosd
- add edx, 0x4000
- mcall SF_CREATE_THREAD, 1, [esp + 2*4 + 4] ;<- thread entry
+ add edx, HTTPD_THREAD_STACK - 4
+ m2m dword[edx], dword[esp + 2*4 + 4]
+ mcall SF_CREATE_THREAD, 1, .thread ;<- thread entry
.err:
pop ebx edi
ret 4
+
+.thread:
+ pop eax
+ call eax
+ lea ecx, [esp - HTTPD_THREAD_STACK]
+ mcall SF_SYS_MISC, SSF_MEM_FREE
+ ThreadExit
+
+
+InitHeap:
+ push ebx
+ mcall SF_SYS_MISC, SSF_HEAP_INIT ; init heap
+ pop ebx
+ ret
+
; stdcall Alloc(uint32_t size)
Alloc:
push ebx
mcall SF_SYS_MISC, SSF_MEM_ALLOC, [esp + 4 + 4]
pop ebx
ret 4
+
; stdcall Free(void* ptr)
Free:
push ebx
@@ -788,7 +803,7 @@ finish_send_resp:
mov byte[esp], '0'
mov ecx, esp
- mov eax, [ebp + RESPD.session]
+ mov eax, [edx + RESPD.session]
push dword 0
push dword 5 ; size buffer
diff --git a/utils/block_access.asm b/utils/block_access.asm
index b9ed45c..b379282 100644
--- a/utils/block_access.asm
+++ b/utils/block_access.asm
@@ -4,7 +4,6 @@ public @EXPORT as 'EXPORTS'
NO_DEBUG_INPUT = 0
include "macros.inc"
-purge mov,add,sub
include "proc32.inc"
include '../module_api.inc'
diff --git a/utils/redirect.asm b/utils/redirect.asm
index 0859082..37d8165 100644
--- a/utils/redirect.asm
+++ b/utils/redirect.asm
@@ -4,7 +4,6 @@ public @EXPORT as 'EXPORTS'
NO_DEBUG_INPUT = 0
include "macros.inc"
-purge mov,add,sub
include "proc32.inc"
include '../module_api.inc'