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 -----------------------------------------------------------
35 ----------------------------------------------------------------------*/
37 #include"drd64_marshald.h"
39 static fd_set g_fds_orig;
42 /* for EXTERNAL Function */
44 Drd64_Marshald_Dispatch_SetFD(
47 FD_SET( i_fds, &g_fds_orig );
52 /* for EXTERNAL Function */
54 Drd64_Marshald_Dispatch_CloseSocket(
58 FD_CLR( i_fds, &g_fds_orig );
59 Drd64_Server_RecvStatus_FreeRecvStatus( i_fds );
60 DRD64_DEBUG_PRINT("CloseSocket",i_fds,"errono",errno,NULL,0);
66 Drd64_Marshald_Dispatch_OpenSocket(
70 Drd64_Server_RecvStatus *p_recv;
72 i_socket_new = accept( i_socket_server, NULL, NULL );
73 DRD64_DEBUG_SYSCALL("accept(New Comm.)",i_socket_new,errno);
75 if( -1 == i_socket_new ) {
79 FD_SET( i_socket_new, &g_fds_orig );
81 p_recv = Drd64_Server_RecvStatus_AllocRecvStatus(
82 i_socket_new, DRD64_MARSHALD_RECVSTATUS_UNITS );
84 if( NULL == p_recv ) {
88 Drd64_Server_RecvStatus_InitRecvStatus( p_recv );
95 Drd64_Marshald_Dispatch_ExecPacket(
97 Drd64_Server_RecvStatus *p_recv,
98 Drd64_Marshald_MasterInformation *p_marshald )
101 Drd64_PacketHeader *p_phead;
102 Drd64_Server_RecvStatus *p_recv_parent;
105 /* Phase 1 : Init. ================================*/
107 i_result = DRD64_MARSHALD_DISPATCH_RESULT_CLOSE; // XXX > error
109 p_phead = (Drd64_PacketHeader *)p_recv->pv_buf;
110 assert( NULL != p_phead );
112 if( 0 < p_phead->i_datalen )
113 { pv_data = DRD64_PacketData( p_recv->pv_buf ); }
116 /* Phase 2 : Exec. Command ========================*/
117 /* CMD: Connect -----------------------------------*/
118 if( DRD64_COMMAND_CONNECT == p_phead->dw_command ) {
119 i_result = Drd64_Marshald_Cmd_Connect( i_recv_id, p_phead, pv_data );
121 /* CMD: DisConnect --------------------------------*/
122 else if( DRD64_COMMAND_DISCONNECT == p_phead->dw_command ) {
123 i_result = Drd64_Marshald_Cmd_DisConnect( i_recv_id, p_phead, pv_data );
125 /* CMD: Attach Request ---------------------------*/
126 else if( DRD64_COMMAND_ATTACH_REQUEST == p_phead->dw_command ) {
127 i_result = Drd64_Marshald_Cmd_AttachRequest(
128 i_recv_id, p_phead, pv_data, p_marshald );
130 else if( DRD64_COMMAND_DEBUG_REQUEST == p_phead->dw_command ) {
132 else if( DRD64_COMMAND_DETACH == p_phead->dw_command ) {
134 else if( DRD64_COMMAND_EXIT == p_phead->dw_command ) {
136 else if( DRD64_COMMAND_DEBUGD_BOOTINFO == p_phead->dw_command ) {
137 i_result = Drd64_Marshald_Msg_DebugdBootInfo(
138 i_recv_id, p_phead, pv_data, p_marshald );
142 /* Phase 3 : Result Proc. =======================*/
143 if( DRD64_MARSHALD_DISPATCH_RESULT_RESTART == i_result ) {
144 if( -1 < p_phead->i_resume_recvstatus_id ) {
145 p_recv_parent = Drd64_Server_RecvStatus_GetRecvStatus(
146 p_phead->i_resume_recvstatus_id );
147 assert( NULL != p_recv_parent );
149 p_recv_parent->b_recv_status
150 = DRD64_SERVER_RECVSTATUS_STATUS_RESUME;
153 else if( DRD64_MARSHALD_DISPATCH_RESULT_POLL == i_result ) {
154 p_recv->b_recv_status = DRD64_SERVER_RECVSTATUS_STATUS_STOP;
158 if(( DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE == i_result )
159 || ( DRD64_MARSHALD_DISPATCH_RESULT_RESTART == i_result )) {
160 Drd64_Server_RecvStatus_DeleteResumeChain( i_recv_id );
168 Drd64_Marshald_Dispatch_JudgePacket(
171 Drd64_Server_RecvStatus *p_recv,
172 Drd64_Marshald_MasterInformation *p_marshald )
176 Drd64_PacketHeader *p_phead;
177 Drd64_Server_RecvStatus *p_recv_new;
181 /* Judge 1: Receiving : Remain Bytes Receiving = 0x01 */
182 if( 0 < i_remainbytes )
183 { return DRD64_MARSHALD_DISPATCH_RESULT_RECEVING; }
184 /* Judge 2: Error: Connection Down or Close = 0x00 */
185 else if( 0 > i_remainbytes )
186 { return DRD64_MARSHALD_DISPATCH_RESULT_CLOSE; }
188 p_phead = (Drd64_PacketHeader *)p_recv->pv_buf;
189 assert( NULL != p_phead );
191 /* Check 1 : Header Check */
192 if( DRD64_PACKET_HEADER != p_phead->w_header )
193 { return DRD64_MARSHALD_DISPATCH_RESULT_CLOSE; }
195 /* Judge 3: Remain Packet Data? = 0x01 */
196 if(( DRD64_SERVER_RECVSTATUS_PHASE_HEADER == p_recv->i_read_phase ) &&
197 ( 0 < p_phead->i_datalen )) {
198 p_recv->i_read_phase = DRD64_SERVER_RECVSTATUS_PHASE_DATA;
200 /* Check BOF Attack */
201 if( DRD64_MAX_PACKET_DATA < p_phead->i_datalen )
202 { return DRD64_MARSHALD_DISPATCH_RESULT_CLOSE; }
203 p_recv->i_remain_bytes = p_phead->i_datalen;
205 return DRD64_MARSHALD_DISPATCH_RESULT_RECEVING;
208 /* Check 2: Standart Packet Header Check */
209 /* XXX : NO implement */
211 /* Check 4: Transport Packet? */
213 /* Push Readed Command Packet for Resume Pool */
214 i_recv_id = Drd64_Server_RecvStatus_PushResumeChain(
215 i_fds, DRD64_MARSHALD_RECVSTATUS_UNITS );
217 { return DRD64_MARSHALD_DISPATCH_RESULT_CLOSE; } // XXX > error
219 p_recv_new = Drd64_Server_RecvStatus_GetRecvStatus( i_fds );
220 assert( NULL != p_recv_new );
222 // Drd64_Marshald_Dispatch_InitRecvStatus( p_recv_new );
223 Drd64_Server_RecvStatus_InitRecvStatus( p_recv_new );
225 /* Exec Packet by Command-Code */
226 i_result = Drd64_Marshald_Dispatch_ExecPacket(
227 i_recv_id, p_recv, p_marshald );
234 Drd64_Marshald_Dispatch_ExecResumeRecvStatus(
235 Drd64_Marshald_MasterInformation *p_marshald )
238 Drd64_Server_RecvStatus *p_recv;
240 p_recv = Drd64_Server_RecvStatus_GetResumeStart();
241 while( NULL != p_recv ) {
242 if( DRD64_SERVER_RECVSTATUS_STATUS_RESUME
243 == p_recv->b_recv_status ) {
245 i_result = Drd64_Marshald_Dispatch_ExecPacket(
246 p_recv->i_recvstatus_id, p_recv, p_marshald );
248 /* XXX : support for disconnect (CLOSE) */
249 /* 0x00 = Judge 1 : Disconnect ( Others Packet ) */
250 if( DRD64_MARSHALD_DISPATCH_RESULT_CLOSE == i_result ) {
251 Drd64_Marshald_Dispatch_CloseSocket( p_recv->i_fds_id );
253 else if( DRD64_MARSHALD_DISPATCH_RESULT_RESTART == i_result ) {
258 if( NULL != p_recv ) {
259 p_recv = (Drd64_Server_RecvStatus *)p_recv->pv_recv_next;
262 p_recv = Drd64_Server_RecvStatus_GetResumeStart();
270 Drd64_Marshald_Dispatch_Polling(
271 Drd64_Marshald_MasterInformation *p_marshald )
284 //int i_socket_server;
285 Drd64_Server_RecvStatus *p_recv;
286 Drd64_Server_RecvStatus *p_recv_resume;
287 struct timeval tmval;
289 FD_ZERO( &g_fds_orig );
290 FD_SET( p_marshald->i_socket_local, &g_fds_orig );
291 FD_SET( p_marshald->i_socket_inet, &g_fds_orig );
293 if( p_marshald->i_socket_local > p_marshald->i_socket_inet )
294 { i_selects_base = p_marshald->i_socket_local + 1; }
296 { i_selects_base = p_marshald->i_socket_inet + 1; }
297 i_selects_max = i_selects_base;
300 tmval.tv_usec = 5000;
303 /* Phase 1: Packet & Signal Polling */
304 memcpy( &fds_now, &g_fds_orig, sizeof( struct fd_set ) );
305 i_selects = select( i_selects_max, &fds_now, NULL, NULL, &tmval );
307 /* Phase 2: Receive Packet */
308 if( 0 < i_selects ) {
309 //i_socket_server = -1;
310 /*if( FD_ISSET( p_marshald->i_socket_local, &fds_now ) )
311 { i_socket_server = p_marshald->i_socket_local; }
312 else if( FD_ISSET( p_marshald->i_socket_inet, &fds_now ) )
313 { i_socket_server = p_marshald->i_socket_inet; }
315 if( -1 < i_socket_server ) {
316 i_socket_new = Drd64_Marshald_Dispatch_OpenSocket( i_socket_server );
321 /* Server Socket from Local */
322 if( FD_ISSET( p_marshald->i_socket_local, &fds_now )) {
323 Drd64_Marshald_Dispatch_OpenSocket(
324 p_marshald->i_socket_local );
327 /* Server Socket from Local */
328 if( FD_ISSET( p_marshald->i_socket_inet, &fds_now )) {
329 Drd64_Marshald_Dispatch_OpenSocket(
330 p_marshald->i_socket_inet );
333 i_resume_flag = 0x00;
334 for( i_cnt = 0; i_cnt < i_selects_max; i_cnt++ ) {
336 /* Drd64 Clinet & Marshald => No Judge */
337 if(( i_cnt == p_marshald->i_socket_local ) ||
338 ( i_cnt == p_marshald->i_socket_inet ))
341 p_recv = Drd64_Server_RecvStatus_GetRecvStatus( i_cnt );
342 if( NULL == p_recv ) { continue; }
344 if( FD_ISSET( i_cnt, &fds_now ) ) {
346 assert( DRD64_SERVER_RECVSTATUS_STATUS_READ
347 == p_recv->b_recv_status );
349 /*i_err = Drd64_Server_RecvSocket_SocketRead_Cert(
351 i_err = Drd64_Server_RecvSocket_SocketRead( i_cnt );
352 DRD64_DEBUG_PRINT("SocketRead",i_err,"FD",i_cnt,"DestPid",i_pid);
354 i_result = Drd64_Marshald_Dispatch_JudgePacket(
355 i_cnt, i_err, p_recv, &drd64_marshald_info );
357 /* 0x00 = Judge 1 : Disconnect ( Others Packet ) */
358 if( DRD64_MARSHALD_DISPATCH_RESULT_CLOSE == i_result ) {
359 Drd64_Marshald_Dispatch_CloseSocket( i_cnt );
361 else if( DRD64_MARSHALD_DISPATCH_RESULT_RESTART
363 { i_resume_flag = 0x01; }
364 /* 0x01 = Judge 1 : Reading Next */
368 /* Check Restart Packet (RecvStatus) */
369 if( 0x00 != i_resume_flag ) {
370 Drd64_Marshald_Dispatch_ExecResumeRecvStatus(
371 &drd64_marshald_info );
375 i_selects_last = Drd64_Server_RecvStatus_GetRecvStatMax();
376 if( i_selects_last > i_selects_base )
377 { i_selects_max = i_selects_last; }
379 { i_selects_max = i_selects_base; }
380 printf("%d\n", i_selects_max );
383 /* Phase 3: Check TimeOut Resume Packet */
385 /* Phase 4: Signal Check & Proc */
392 /* EOF of drd64_.c ----------------------------------- */