----------------------------------------------------------------------*/
#include"drd64_debugd.h"
-#include"drd64_debugd_info.h"
-#include"drd64_server_recvstatus.h"
-static fd_set fds_orig;
+static fd_set g_fds_orig;
void
Drd64_Debugd_Dispatch_CloseSocket(
int i_fds )
{
+ Drd64_Server_RecvStatus *p_recv;
+
+ p_recv = Drd64_Server_RecvStatus_GetRecvStatus( i_fds );
+ assert( NULL != p_recv );
+
close( i_fds );
- FD_CLR( i_fds, &fds_orig );
+ FD_CLR( i_fds, &g_fds_orig );
+ Drd64_Server_RecvStatus_DeleteSocketsChain( p_recv );
Drd64_Server_RecvStatus_CloseRecvStatus( i_fds );
DRD64_DEBUG_PRINT("CloseSocket",i_fds,"errono",errno,NULL,0);
+
return;
}
int
+ Drd64_Debugd_Dispatch_OpenSocket(
+ int i_socket_server )
+{
+ int i_socket_new;
+ Drd64_Server_RecvStatus *p_recv;
+
+ i_socket_new = accept( i_socket_server, NULL, NULL );
+ DRD64_DEBUG_SYSCALL("accept(New Comm.)",i_socket_new,errno);
+
+ if( -1 == i_socket_new ) {
+ return -1;
+ }
+
+ FD_SET( i_socket_new, &g_fds_orig );
+
+ p_recv = Drd64_Server_RecvStatus_AllocRecvStatus(
+ i_socket_new, DRD64_DEBUGD_RECVSTATUS_UNITS );
+
+ if( NULL == p_recv ) {
+ return -2;
+ }
+
+ Drd64_Server_RecvStatus_InitRecvStatus( p_recv, i_socket_new );
+ Drd64_Server_RecvStatus_AddSocketsChain( p_recv );
+
+ return i_socket_new;
+}
+
+
+int
Drd64_Debugd_Dispatch_ExecPacket(
int i_recv_id,
Drd64_Server_RecvStatus *p_recv,
/* Push Readed Command Packet for Resume Pool */
+ Drd64_Server_RecvStatus_DeleteSocketsChain( p_recv );
i_recv_id = Drd64_Server_RecvStatus_PushResumeChain(
i_fds, DRD64_DEBUGD_RECVSTATUS_UNITS );
if( 0 > i_recv_id )
assert( NULL != p_recv_new );
Drd64_Server_RecvStatus_InitRecvStatus( p_recv_new, p_recv->i_fds_id );
+ Drd64_Server_RecvStatus_AddSocketsChain( p_recv_new );
/* Exec Packet by Command-Code */
i_result = Drd64_Debugd_Dispatch_ExecPacket( i_recv_id, p_recv, p_debugd );
Drd64_Debugd_MasterInformation *p_debugd )
{
fd_set fds_now;
- int i_cnt;
+ //int i_cnt;
+ int i_socket;
int i_result;
int i_err;
int i_pid;
- int i_socket_new;
+ int i_selects;
+ //int i_socket_new;
int i_selects_base;
int i_selects_max;
int i_selects_last;
Drd64_Server_RecvStatus *p_recv;
struct timeval tm_val;
- FD_ZERO( &fds_orig );
- FD_SET( p_debugd->i_socket_debugd, &fds_orig );
+ FD_ZERO( &g_fds_orig );
+ FD_SET( p_debugd->i_socket_debugd, &g_fds_orig );
i_selects_base = p_debugd->i_socket_debugd + 1;
i_selects_max = i_selects_base;
while( 1 ) {
/* Phase 1: Packet & Signal Polling */
- memcpy( &fds_now, &fds_orig, sizeof( struct fd_set ) );
- select( i_selects_max, &fds_now, NULL, NULL, &tm_val );
+ memcpy( &fds_now, &g_fds_orig, sizeof( struct fd_set ) );
+ i_selects = select( i_selects_max, &fds_now, NULL, NULL, &tm_val );
/* Phase 2: Receive Packet */
- /* from Client */
- /*if( -1 != p_debugd->i_socket_client ) {
- if( FD_ISSET( p_debugd->i_socket_client, &fds_now ) ) {
-
+ if( 0 < i_selects ) {
+ /* Server Socket from Local( Client or Marshald ) */
+ if( FD_ISSET( p_debugd->i_socket_debugd, &fds_now ) ) {
+ Drd64_Debugd_Dispatch_OpenSocket(
+ p_debugd->i_socket_debugd );
+ i_selects--;
}
- }*/
- /* from New Packet */
- if( FD_ISSET( p_debugd->i_socket_debugd, &fds_now ) ) {
- i_socket_new = accept( p_debugd->i_socket_debugd, NULL, NULL );
- DRD64_DEBUG_SYSCALL("accept(New Comm.)",i_socket_new,errno);
-
- if( -1 != i_socket_new ) {
- // XXX ?
- if( i_socket_new >= i_selects_max )
- { i_selects_max = i_socket_new + 1; }
-
- FD_SET( i_socket_new, &fds_orig );
- p_recv = Drd64_Server_RecvStatus_AllocRecvStatus(
- i_socket_new, DRD64_DEBUGD_RECVSTATUS_UNITS );
-
- if( NULL != p_recv )
- { Drd64_Server_RecvStatus_InitRecvStatus(
- p_recv, i_socket_new ); }
-
- /* XXX : Error Proc.
- else {
- } */
- }
- /* XXX : Error Proc.
- else {
- } */
- }
- /* Exist/Resume Packet Proc. & Timer Check */
- else {
i_resume_flag = 0x00;
- for( i_cnt = 0; i_cnt < i_selects_max; i_cnt++ ) {
- /* Drd64 Clinet & Marshald => No Judge */
- if(( i_cnt == p_debugd->i_socket_debugd ) ||
- ( i_cnt == p_debugd->i_socket_client ))
- { continue; }
+ p_recv = Drd64_Server_RecvStatus_GetSocketsChainStart();
+ while(( NULL != p_recv ) && ( 0 < i_selects )) {
+
+ i_socket = p_recv->i_fds_id;
- p_recv = Drd64_Server_RecvStatus_GetRecvStatus( i_cnt );
- if( NULL == p_recv ) { continue; }
-
- if( FD_ISSET( i_cnt, &fds_now ) ) {
+ if( FD_ISSET( i_socket, &fds_now ) ) {
/* Read */
i_err = Drd64_Server_RecvSocket_SocketRead_Cert(
- i_cnt, &i_pid );
- DRD64_DEBUG_PRINT("SocketRead",i_err,"FD",i_cnt,"SrcPID",i_pid);
+ i_socket, &i_pid );
+ DRD64_DEBUG_PRINT("SocketRead",i_err,"FD",
+ i_socket,"SrcPID",i_pid);
+ i_selects--;
/* Judge Packet */
i_result = Drd64_Debugd_Dispatch_JudgePacket(
- i_cnt, i_err, p_recv, p_debugd );
+ i_socket, i_err, p_recv, p_debugd );
/* 0x00 = Judge 1 : Disconnect ( Others Packet ) */
if( DRD64_DEBUGD_DISPATCH_RESULT_CLOSE == i_result )
- { Drd64_Debugd_Dispatch_CloseSocket( i_cnt ); }
+ { Drd64_Debugd_Dispatch_CloseSocket( i_socket ); }
/* 0x03 = Judge 2 : Restart Flag ON */
else if( DRD64_DEBUGD_DISPATCH_RESULT_RESTART == i_result )
{ i_resume_flag = 0x01; }
/* 0x05 = Judge 3 : from Clinet Connect Request */
else if( DRD64_DEBUGD_DISPATCH_RESULT_SETCLIENT
== i_result )
- { p_debugd->i_socket_client = i_cnt; }
+ { p_debugd->i_socket_client = i_socket; }
/* 0x01 = Judge 1 : Reading Next */
}
- /* Check Resume Packet */
- /*if( DRD64_SERVER_RECVSTATUS_STATUS_RESUME
- == p_recv->b_recv_status ) {
- i_result = Drd64_Debugd_Dispatch_ExecPacket(
- i_cnt, p_recv, p_debugd );
-
- // 0x00 = Judge 1 : Disconnect ( Others Packet )
- if( DRD64_DEBUGD_DISPATCH_RESULT_CLOSE == i_result ) {
- close( i_cnt );
- FD_CLR( i_cnt, &fds_orig );
- Drd64_Server_RecvStatus_FreeRecvStatus( i_cnt );
- }
- // 0x05 = Judge 2 : from Clinet Connect Request
- else if( DRD64_DEBUGD_DISPATCH_RESULT_SETCLIENT
- == i_result ) {
- p_debugd->i_socket_client = i_cnt;
- }
- }*/
+ p_recv = (Drd64_Server_RecvStatus *)p_recv->pv_recv_next;
}
-
+
+ /* Check Restart Packet (RecvStatus) */
if( 0x00 != i_resume_flag )
{ Drd64_Debugd_Dispatch_ExecResumeRecvStatus( p_debugd ); }
+ /* Set Max fd */
i_selects_last = Drd64_Server_RecvStatus_GetRecvStatMax();
if( i_selects_last > i_selects_base )
{ i_selects_max = i_selects_last; }