OSDN Git Service

(LibGoblin)
[drdeamon64/drdeamon64.git] / deamon / drd64_server_recvstatus.c
index b39a02f..aba4b44 100644 (file)
@@ -46,6 +46,8 @@ int                                                   gi_recvstat_max;
 Drd64_Server_RecvStatus                *gp_recv_resume_start;
 Drd64_Server_RecvStatus                *gp_recv_resume_end;
 int                                                    gi_recv_resume_max;
+Drd64_Server_RecvStatus                *gp_recv_sockets_start;
+Drd64_Server_RecvStatus                *gp_recv_sockets_end;
 
 
 int
@@ -67,7 +69,7 @@ int
        free( gpp_recvstat );
        gpp_recvstat            = NULL;
 
-       return;
+       return 0x00;
 }
 
 
@@ -158,6 +160,9 @@ int
        gp_recv_resume_start    = NULL;
        gi_recv_resume_max              = FD_SETSIZE;
 
+       gp_recv_sockets_start   = NULL;
+       gp_recv_sockets_end             = NULL;
+
        return 0x00;
 }
 
@@ -169,7 +174,7 @@ int
 {
        Drd64_Server_RecvStatus_FreeRecvStatus_All();
 
-       return;
+       return 0x00;
 }
 
 
@@ -224,9 +229,25 @@ Drd64_Server_RecvStatus *
 }
 
 
-EXTERN_SERVER_RECVSTATUS
 void
        Drd64_Server_RecvStatus_FreeRecvStatus(
+               Drd64_Server_RecvStatus *p_recv )
+{
+       assert( NULL != p_recv );
+
+       p_recv->pv_recv_before          = NULL;
+       p_recv->pv_recv_next            = NULL;
+       
+       p_recv->i_recvstatus_id         = -1;
+       p_recv->i_fds_id                        = -1;
+
+       return;
+}
+
+
+EXTERN_SERVER_RECVSTATUS
+void
+       Drd64_Server_RecvStatus_CloseRecvStatus(
                int i_fds )
 {
        int             i_cnt;
@@ -250,8 +271,7 @@ void
                        if( 0 == i_cnt ) { gi_recvstat_max      = 0; }
                }
 
-               p_recv_now->i_recvstatus_id     = -1;
-               p_recv_now->i_fds_id            = -1;
+               Drd64_Server_RecvStatus_FreeRecvStatus( p_recv_now );
        }
        
        return;
@@ -308,7 +328,6 @@ int
                p_recv_self->pv_recv_next       = (void *)p_recv_before->pv_recv_next;
                p_recv_before->pv_recv_next     = (void *)p_recv_self;
                gp_recv_resume_end                      = p_recv_self;
-
        }
 
        i_recv_id       = i_cnt;
@@ -331,6 +350,7 @@ int
        Drd64_Server_RecvStatus *p_recv_before;
        Drd64_Server_RecvStatus *p_recv_next;
 
+
        p_recv_self     = *(gpp_recvstat + i_recv_id);
        if( NULL == p_recv_self )       {
                return 0x01;
@@ -347,6 +367,10 @@ int
                p_recv_next->pv_recv_before     = (void *)p_recv_before;
        }
 
+       if( gp_recv_resume_end == p_recv_self )         {
+               gp_recv_resume_end              = p_recv_before;
+       }
+
        if( p_recv_self->i_recvstatus_id == (gi_recv_resume_max - 1) )  {
                gi_recv_resume_max--;
        }
@@ -357,12 +381,107 @@ int
        }
 
        *(gpp_recvstat + i_recv_id)             = NULL;
-       p_recv_self->pv_recv_before             = NULL;
-       p_recv_self->pv_recv_next               = NULL;
+
+       Drd64_Server_RecvStatus_FreeRecvStatus( p_recv_self );
+
+       return 0x00;
+}
+
+
+EXTERN_SERVER_RECVSTATUS
+int
+       Drd64_Server_RecvStatus_AddSocketsChain(
+               Drd64_Server_RecvStatus *p_recv )
+{
+       Drd64_Server_RecvStatus *p_before;
+
+       if( NULL == p_recv )    { return 0x01; }
+
+       p_before        = gp_recv_sockets_end;
+       
+       p_recv->pv_recv_before  = (void *)p_before;
+       if( NULL != p_before )
+               { p_before->pv_recv_next        = (void *)p_recv; }
+       else
+               { gp_recv_sockets_start = p_recv; }
+
+       gp_recv_sockets_end             = p_recv;
+       
+       return 0x00;
+}
+
+
+EXTERN_SERVER_RECVSTATUS
+int
+       Drd64_Server_RecvStatus_DeleteSocketsChain(
+               Drd64_Server_RecvStatus *p_recv )
+{
+       Drd64_Server_RecvStatus *p_before;
+       Drd64_Server_RecvStatus *p_next;
+
+       if( NULL == p_recv )    { return -1; }
+
+       p_before        = (Drd64_Server_RecvStatus *)p_recv->pv_recv_before;
+       p_next          = (Drd64_Server_RecvStatus *)p_recv->pv_recv_next;
+
+       if( NULL != p_before )
+               { p_before->pv_recv_next        = (void *)p_next; }
+       if( NULL != p_next )
+               { p_next->pv_recv_before        = (void *)p_before; }
+
+       if( p_recv == gp_recv_sockets_start )
+               { gp_recv_sockets_start = p_next; }     
+       if( p_recv == gp_recv_sockets_end )
+               { gp_recv_sockets_end   = p_before; }
+
+       p_recv->pv_recv_next    = NULL;
+       p_recv->pv_recv_before  = NULL;
        
-       p_recv_self->i_recvstatus_id    = -1;
-       p_recv_self->i_fds_id                   = -1;
+       return 0x00;
+}
+
 
+EXTERN_SERVER_RECVSTATUS
+void
+       Drd64_Server_RecvStatus_InitRecvStatus(
+               Drd64_Server_RecvStatus *p_recv,
+               int     i_socket )
+{
+       assert( NULL != p_recv );
+
+       p_recv->i_read_phase            = DRD64_SERVER_RECVSTATUS_PHASE_HEADER;
+       p_recv->b_recv_status           = DRD64_SERVER_RECVSTATUS_STATUS_READ;
+       p_recv->i_command_status        = DRD64_SERVER_CMDSTATUS_STATUS_NORMAL;
+       p_recv->i_remain_bytes          = sizeof( Drd64_PacketHeader );
+       p_recv->pv_resume                       = p_recv->pv_buf;
+       p_recv->pv_recv_before          = NULL;
+       p_recv->pv_recv_next            = NULL;
+       p_recv->pv_cinfo_connection     = NULL;
+       p_recv->i_fds_id                        = i_socket;
+
+       return;
+}
+
+
+EXTERN_SERVER_RECVSTATUS
+int
+       Drd64_Server_RecvStatus_SetConnectionInfoPointer(
+               Drd64_Server_RecvStatus *p_recv_now,
+               void *pv_cinfo )
+{
+       int             i_socket;
+       Drd64_Server_RecvStatus *p_recv_socket;
+
+       assert( NULL != p_recv_now );
+
+       p_recv_now->pv_cinfo_connection         = pv_cinfo;
+
+       p_recv_socket   = *(gpp_recvstat + p_recv_now->i_fds_id);
+       if(( NULL != p_recv_socket ) && ( p_recv_socket != p_recv_now ))        {
+               assert( NULL == p_recv_socket->pv_cinfo_connection );
+               p_recv_socket->pv_cinfo_connection      = pv_cinfo;
+       }
+       
        return 0x00;
 }
 
@@ -446,10 +565,20 @@ int
 
 EXTERN_SERVER_RECVSTATUS
 Drd64_Server_RecvStatus *
-       Drd64_Server_RecvStatus_GetResumeStart(
+       Drd64_Server_RecvStatus_GetResumeChainStart(
                void )
 {
        return gp_recv_resume_start;
 }
 
+
+EXTERN_SERVER_RECVSTATUS
+Drd64_Server_RecvStatus *
+       Drd64_Server_RecvStatus_GetSocketsChainStart(
+               void )
+{
+       return gp_recv_sockets_start;
+}
+
+
 /* EOF of drd64_.c ----------------------------------- */