From 8e107a1443447e04546c7026c713e6beec4732d8 Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Wed, 29 May 2013 11:46:06 +0000 Subject: [PATCH] Socket_receive: return -1 when socket is closed. git-svn-id: svn://kolibrios.org@3565 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/gui/event.inc | 2 +- kernel/trunk/network/socket.inc | 36 ++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/kernel/trunk/gui/event.inc b/kernel/trunk/gui/event.inc index 9fa10f4874..3ee514d222 100644 --- a/kernel/trunk/gui/event.inc +++ b/kernel/trunk/gui/event.inc @@ -516,7 +516,7 @@ align 4 btr ecx, eax ; сбрасываем проверяемый бит маски ; переходим на обработчик этого (eax) бита cmp eax, 10 - jae .loop ; eax=[10..31], ignored (event 10...32) + jae .loop ; eax=[10..31], ignored (event 11...32) cmp eax, 3 je .loop ; eax=3, ignored (event 4) diff --git a/kernel/trunk/network/socket.inc b/kernel/trunk/network/socket.inc index 0c755b303e..aba251016f 100644 --- a/kernel/trunk/network/socket.inc +++ b/kernel/trunk/network/socket.inc @@ -772,7 +772,10 @@ SOCKET_receive: call SOCKET_num_to_ptr jz s_error - jmp [eax + SOCKET.rcv_proc] + call [eax + SOCKET.rcv_proc] + + mov [esp+32], eax + ret align 4 @@ -792,10 +795,10 @@ SOCKET_receive_dgram: cmp ecx, ebx ja .too_small + push ecx push [esi + socket_queue_entry.buf_ptr] ; save the buffer addr so we can clear it later mov esi, [esi + socket_queue_entry.data_ptr] DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_receive: Source buffer=%x real addr=%x\n", [esp], esi - mov [esp+32+4], ecx ; return number of bytes copied ; copy the data shr ecx, 1 @@ -812,16 +815,20 @@ SOCKET_receive_dgram: .nd: call kernel_free ; remove the packet + pop eax + ret .too_small: DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_receive: Buffer too small\n" - jmp s_error + .fail: + mov eax, -1 + ret .block: test [eax + SOCKET.options], SO_NONBLOCK - jnz s_error + jnz .fail call SOCKET_block jmp .loop @@ -866,12 +873,11 @@ SOCKET_receive_stream: call SOCKET_ring_read call SOCKET_ring_free - mov [esp+32], ecx ; return number of bytes copied + mov eax, ecx ; return number of bytes copied ret .peek: - mov ecx, [eax + STREAM_SOCKET.rcv + RING_BUFFER.size] - mov [esp+32], ecx ; return number of bytes available + mov eax, [eax + STREAM_SOCKET.rcv + RING_BUFFER.size] ret .block: @@ -882,8 +888,15 @@ SOCKET_receive_stream: jmp .loop .return0: - xor ecx, ecx - mov [esp+32], ecx + test [eax + SOCKET.options], SS_CANTRCVMORE + jz .ok + + xor eax, eax + dec eax + ret + + .ok: + xor eax, eax ret @@ -2261,6 +2274,8 @@ SOCKET_cant_recv_more: or [eax + SOCKET.options], SS_CANTRCVMORE + call SOCKET_notify + ret @@ -2280,5 +2295,8 @@ SOCKET_cant_send_more: DEBUGF DEBUG_NETWORK_VERBOSE, "SOCKET_cant_send_more: %x\n", eax or [eax + SOCKET.options], SS_CANTSENDMORE + mov [eax + SOCKET.snd_proc], s_error + + call SOCKET_notify ret \ No newline at end of file