1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
4 for INTEL64(R), AMD64(R)
6 Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
11 1. Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
31 /* File Info -----------------------------------------------------------
32 File: drd64_debugd_dispatch.c
35 ----------------------------------------------------------------------*/
37 #include"drd64_debugd.h"
39 static fd_set g_fds_orig;
43 Drd64_Debugd_Dispatch_CloseSocket(
46 Drd64_Server_RecvStatus *p_recv;
48 p_recv = Drd64_Server_RecvStatus_GetRecvStatus( i_fds );
49 assert( NULL != p_recv );
52 FD_CLR( i_fds, &g_fds_orig );
53 Drd64_Server_RecvStatus_DeleteSocketsChain( p_recv );
54 Drd64_Server_RecvStatus_CloseRecvStatus( i_fds );
55 DRD64_DEBUG_PRINT("CloseSocket",i_fds,"errono",errno,NULL,0);
62 Drd64_Debugd_Dispatch_OpenSocket(
66 Drd64_Server_RecvStatus *p_recv;
68 i_socket_new = accept( i_socket_server, NULL, NULL );
69 DRD64_DEBUG_SYSCALL("accept(New Comm.)",i_socket_new,errno);
71 if( -1 == i_socket_new ) {
75 FD_SET( i_socket_new, &g_fds_orig );
77 p_recv = Drd64_Server_RecvStatus_AllocRecvStatus(
78 i_socket_new, DRD64_DEBUGD_RECVSTATUS_UNITS );
80 if( NULL == p_recv ) {
84 Drd64_Server_RecvStatus_InitRecvStatus( p_recv, i_socket_new );
85 Drd64_Server_RecvStatus_AddSocketsChain( p_recv );
92 Drd64_Debugd_Dispatch_ExecPacket(
94 Drd64_Server_RecvStatus *p_recv,
95 Drd64_Debugd_MasterInformation *p_debugd )
98 Drd64_PacketHeader *p_phead;
99 Drd64_Server_RecvStatus *p_recv_parent;
102 /* Phase 1 : Init. ================================*/
104 i_result = DRD64_DEBUGD_DISPATCH_RESULT_CLOSE;
106 p_phead = (Drd64_PacketHeader *)p_recv->pv_buf;
107 assert( NULL != p_phead );
109 if( 0 < p_phead->i_datalen )
110 { pv_data = DRD64_PacketData( p_recv->pv_buf ); }
113 /* Phase 2 : Exec. Command ========================*/
114 /* CMD: Connect -----------------------------------*/
115 if( DRD64_COMMAND_CONNECT == p_phead->dw_command ) {
116 //i_result = Drd64_Debugd_Cmd_Connect( i_recv_id, p_phead, pv_data );
118 /* CMD: DisConnect --------------------------------*/
119 else if( DRD64_COMMAND_DISCONNECT == p_phead->dw_command ) {
121 /* CMD: Attach Link -------------------------------*/
122 else if( DRD64_COMMAND_ATTACH_LINK == p_phead->dw_command ) {
123 i_result = Drd64_Debugd_Cmd_AttachLink(
124 i_recv_id, p_phead, pv_data, p_debugd );
126 /* CMD: Attach Report -----------------------------*/
127 else if( DRD64_COMMAND_ATTACH_REPORT == p_phead->dw_command ) {
128 i_result = Drd64_Debugd_Cmd_AttachReport(
129 i_recv_id, p_phead, pv_data, p_debugd );
131 /* CMD: Detach ------------------------------------*/
132 else if( DRD64_COMMAND_DETACH == p_phead->dw_command ) {
133 i_result = Drd64_Debugd_Cmd_Detach(
134 i_recv_id, p_phead, p_debugd );
136 /* CMD: No Support Command ------------------------*/
141 /* Phase 3 : Result Proc. =======================*/
142 if( DRD64_DEBUGD_DISPATCH_RESULT_RESTART == i_result ) {
143 if( -1 < p_phead->i_rid_resume ) {
144 p_recv_parent = Drd64_Server_RecvStatus_GetRecvStatus(
145 p_phead->i_rid_resume );
146 assert( NULL != p_recv_parent );
148 p_recv_parent->b_recv_status
149 = DRD64_SERVER_RECVSTATUS_STATUS_RESUME;
152 else if( DRD64_DEBUGD_DISPATCH_RESULT_POLL == i_result ) {
153 p_recv->b_recv_status = DRD64_SERVER_RECVSTATUS_STATUS_STOP;
156 if(( DRD64_DEBUGD_DISPATCH_RESULT_COMPLETE == i_result )
157 || ( DRD64_DEBUGD_DISPATCH_RESULT_RESTART == i_result ))
158 { Drd64_Server_RecvStatus_DeleteResumeChain( i_recv_id ); }
165 Drd64_Debugd_Dispatch_JudgePacket(
168 Drd64_Server_RecvStatus *p_recv,
169 Drd64_Debugd_MasterInformation *p_debugd )
173 Drd64_PacketHeader *p_phead;
174 Drd64_Server_RecvStatus *p_recv_new;
178 /* Judge 1: Receiving : Remain Bytes Receiving = 0x01 */
179 if( 0 < i_remainbytes )
180 { return DRD64_DEBUGD_DISPATCH_RESULT_RECEVING; }
182 /* Judge 2: Error: Connection Down or Close = 0x00 */
183 else if( 0 > i_remainbytes )
184 { return DRD64_DEBUGD_DISPATCH_RESULT_CLOSE; }
186 p_phead = (Drd64_PacketHeader *)p_recv->pv_buf;
187 assert( NULL != p_phead );
189 /* Check 1 : Header Check */
190 if( DRD64_PACKET_HEADER != p_phead->w_header )
191 { return DRD64_DEBUGD_DISPATCH_RESULT_CLOSE; }
193 /* Judge 3: Remain Packet Data? = 0x01 */
194 if(( DRD64_SERVER_RECVSTATUS_PHASE_HEADER == p_recv->i_read_phase ) &&
195 ( 0 < p_phead->i_datalen )) {
196 p_recv->i_read_phase = DRD64_SERVER_RECVSTATUS_PHASE_DATA;
198 /* Check BOF Attack */
199 if( DRD64_MAX_PACKET_DATA < p_phead->i_datalen )
200 { return DRD64_DEBUGD_DISPATCH_RESULT_CLOSE; }
201 p_recv->i_remain_bytes = p_phead->i_datalen;
203 return DRD64_DEBUGD_DISPATCH_RESULT_RECEVING;
206 /* Check 2: Standart Packet Header Check */
207 /* XXX : NO implement */
209 /* Check 4: Transport Packet? */
212 /* Push Readed Command Packet for Resume Pool */
213 Drd64_Server_RecvStatus_DeleteSocketsChain( p_recv );
214 i_recv_id = Drd64_Server_RecvStatus_PushResumeChain(
215 i_fds, DRD64_DEBUGD_RECVSTATUS_UNITS );
217 { return DRD64_DEBUGD_DISPATCH_RESULT_CLOSE; } // XXX > error
219 p_recv_new = Drd64_Server_RecvStatus_GetRecvStatus( i_fds );
220 assert( NULL != p_recv_new );
222 Drd64_Server_RecvStatus_InitRecvStatus( p_recv_new, p_recv->i_fds_id );
223 Drd64_Server_RecvStatus_AddSocketsChain( p_recv_new );
225 /* Exec Packet by Command-Code */
226 i_result = Drd64_Debugd_Dispatch_ExecPacket( i_recv_id, p_recv, p_debugd );
233 Drd64_Debugd_Dispatch_ExecResumeRecvStatus(
234 Drd64_Debugd_MasterInformation *p_debugd )
237 Drd64_Server_RecvStatus *p_recv;
239 p_recv = Drd64_Server_RecvStatus_GetResumeChainStart();
240 while( NULL != p_recv ) {
241 if( DRD64_SERVER_RECVSTATUS_STATUS_RESUME
242 == p_recv->b_recv_status ) {
244 i_result = Drd64_Debugd_Dispatch_ExecPacket(
245 p_recv->i_recvstatus_id, p_recv, p_debugd );
247 /* 0x00 = Judge 1 : Disconnect ( Others Packet ) */
248 if( DRD64_DEBUGD_DISPATCH_RESULT_CLOSE == i_result )
249 { Drd64_Debugd_Dispatch_CloseSocket( p_recv->i_fds_id ); }
250 else if( DRD64_DEBUGD_DISPATCH_RESULT_RESTART == i_result )
255 { p_recv = (Drd64_Server_RecvStatus *)p_recv->pv_recv_next; }
257 { p_recv = Drd64_Server_RecvStatus_GetResumeChainStart(); }
266 Drd64_Debugd_Dispatch_Polling(
267 Drd64_Debugd_MasterInformation *p_debugd )
281 Drd64_Server_RecvStatus *p_recv;
282 struct timeval tm_val;
284 FD_ZERO( &g_fds_orig );
285 FD_SET( p_debugd->i_socket_debugd, &g_fds_orig );
287 i_selects_base = p_debugd->i_socket_debugd + 1;
288 i_selects_max = i_selects_base;
291 tm_val.tv_usec = 5000;
294 /* Phase 1: Packet & Signal Polling */
295 memcpy( &fds_now, &g_fds_orig, sizeof( struct fd_set ) );
296 i_selects = select( i_selects_max, &fds_now, NULL, NULL, &tm_val );
298 /* Phase 2: Receive Packet */
299 if( 0 < i_selects ) {
300 /* Server Socket from Local( Client or Marshald ) */
301 if( FD_ISSET( p_debugd->i_socket_debugd, &fds_now ) ) {
302 Drd64_Debugd_Dispatch_OpenSocket(
303 p_debugd->i_socket_debugd );
307 i_resume_flag = 0x00;
308 p_recv = Drd64_Server_RecvStatus_GetSocketsChainStart();
309 while(( NULL != p_recv ) && ( 0 < i_selects )) {
311 i_socket = p_recv->i_fds_id;
313 if( FD_ISSET( i_socket, &fds_now ) ) {
315 i_err = Drd64_Server_RecvSocket_SocketRead_Cert(
317 DRD64_DEBUG_PRINT("SocketRead",i_err,"FD",
318 i_socket,"SrcPID",i_pid);
322 i_result = Drd64_Debugd_Dispatch_JudgePacket(
323 i_socket, i_err, p_recv, p_debugd );
325 /* 0x00 = Judge 1 : Disconnect ( Others Packet ) */
326 if( DRD64_DEBUGD_DISPATCH_RESULT_CLOSE == i_result )
327 { Drd64_Debugd_Dispatch_CloseSocket( i_socket ); }
328 /* 0x03 = Judge 2 : Restart Flag ON */
329 else if( DRD64_DEBUGD_DISPATCH_RESULT_RESTART == i_result )
330 { i_resume_flag = 0x01; }
331 else if( DRD64_DEBUGD_DISPATCH_RESULT_TERMINATE
333 p_debugd->i_flag_terminate = 0xff;
336 /* 0x01 = Judge 1 : Reading Next */
339 p_recv = (Drd64_Server_RecvStatus *)p_recv->pv_recv_next;
342 /* Check Terminate Flag => break while loop */
343 if( 0x00 != p_debugd->i_flag_terminate ) { break; }
345 /* Check Restart Packet (RecvStatus) */
346 if( 0x00 != i_resume_flag )
347 { Drd64_Debugd_Dispatch_ExecResumeRecvStatus( p_debugd ); }
350 i_selects_last = Drd64_Server_RecvStatus_GetRecvStatMax();
351 if( i_selects_last > i_selects_base )
352 { i_selects_max = i_selects_last; }
354 { i_selects_max = i_selects_base; }
357 /* Phase 3: Dispatch Complete-Received Packet */
359 /* Phase 4: Signal Check & Proc */
361 /* Check Terminate Flag => break while loop */
362 if( 0x00 != p_debugd->i_flag_terminate ) { break; }
369 /* EOF of drd64_.c ----------------------------------- */