diff --git a/kernel/branches/net/network/socket.inc b/kernel/branches/net/network/socket.inc index b77eda4b45..ccbc01f00c 100644 --- a/kernel/branches/net/network/socket.inc +++ b/kernel/branches/net/network/socket.inc @@ -31,7 +31,7 @@ struct SOCKET Type dd ? ; RAW/STREAM/DGRAP Protocol dd ? ; ICMP/IPv4/ARP/TCP/UDP errorcode dd ? - device dd ? + device dd ? ; driver pointer, socket pointer if it's an UNIX socket options dd ? state dd ? @@ -275,6 +275,7 @@ sys_socket: dd SOCKET_receive ; 7 dd SOCKET_set_opt ; 8 dd SOCKET_get_opt ; 9 + dd SOCKET_pair ; 10 .number = ($ - .table) / 4 - 1 s_error: @@ -283,8 +284,6 @@ s_error: ret - - ;----------------------------------------------------------------- ; ; SOCKET_open @@ -360,7 +359,7 @@ align 4 .tcp: mov [eax + SOCKET.Protocol], IP_PROTO_TCP mov [eax + SOCKET.snd_proc], SOCKET_send_tcp - mov [eax + SOCKET.rcv_proc], SOCKET_receive_tcp + mov [eax + SOCKET.rcv_proc], SOCKET_receive_stream TCP_init_socket eax ret @@ -835,9 +834,9 @@ SOCKET_receive_dgram: align 4 -SOCKET_receive_tcp: +SOCKET_receive_stream: - DEBUGF 1,"SOCKET_receive: TCP\n" + DEBUGF 1,"SOCKET_receive: STREAM\n" mov ecx, esi mov edi, edx @@ -949,6 +948,28 @@ SOCKET_send_pppoe: +align 4 +SOCKET_send_unix: + + DEBUGF 1,"SOCKET_send: UNIX\n" + + call SOCKET_check + jz s_error + mov eax, [eax + SOCKET.device] + call SOCKET_check + jz s_error + + push eax + add eax, STREAM_SOCKET.rcv + call SOCKET_ring_write + pop eax + + mov [esp+32], ecx + + call SOCKET_notify_owner + + ret + ;----------------------------------------------------------------- ; @@ -1074,6 +1095,63 @@ SOCKET_set_opt: +;----------------------------------------------------------------- +; +; SOCKET_pair +; +; Allocates a pair of linked UNIX domain sockets +; +; IN: / +; OUT: eax is socket1 num, -1 on error +; ebx is socket2 num +; +;----------------------------------------------------------------- +align 4 +SOCKET_pair: + + DEBUGF 1,"SOCKET_pair\n" + + call SOCKET_alloc + jz s_error + mov [esp+32], edi ; application's eax + + mov [eax + SOCKET.Domain], AF_UNIX + mov [eax + SOCKET.Type], SOCK_STREAM + mov [eax + SOCKET.Protocol], 0 ;;; CHECKME + mov [eax + SOCKET.snd_proc], SOCKET_send_unix + mov [eax + SOCKET.rcv_proc], SOCKET_receive_stream + mov ebx, eax + + call SOCKET_alloc + jz .error + mov [esp+24], edi ; application's ebx + + mov [eax + SOCKET.Domain], AF_UNIX + mov [eax + SOCKET.Type], SOCK_STREAM + mov [eax + SOCKET.Protocol], 0 ;;; CHECKME + mov [eax + SOCKET.snd_proc], SOCKET_send_unix + mov [eax + SOCKET.rcv_proc], SOCKET_receive_stream + + ; Link the two sockets to eachother + mov [eax + SOCKET.device], ebx + mov [ebx + SOCKET.device], eax + + lea eax, [eax + STREAM_SOCKET.rcv] + call SOCKET_ring_create + + lea eax, [ebx + STREAM_SOCKET.rcv] + call SOCKET_ring_create + pop eax + + + + ret + + .error: + mov eax, ebx + call SOCKET_free + jmp s_error + ;-----------------------------------------------------------------