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_server.h"
38 #define DRD64_SRC_SERVER_RECVSTATUS
39 #include"drd64_server_recvstatus.h"
41 Drd64_Server_RecvStatus **gpp_recvstat;
42 Drd64_Server_RecvStatus *gp_recvalloc;
46 Drd64_Server_RecvStatus *gp_recv_resume_start;
47 Drd64_Server_RecvStatus *gp_recv_resume_end;
48 int gi_recv_resume_max;
49 Drd64_Server_RecvStatus *gp_recv_sockets_start;
50 Drd64_Server_RecvStatus *gp_recv_sockets_end;
54 Drd64_Server_RecvStatus_FreeRecvStatus_All(
59 for( i_cnt = 0; i_cnt < gi_recvalloc_max; i_cnt++ ) {
60 free( (gp_recvalloc + i_cnt)->pv_buf );
61 (gp_recvalloc + i_cnt)->pv_buf = NULL;
76 Drd64_Server_RecvStatus *
77 Drd64_Server_RecvStatus_AllocRecvStatus_Unit(
84 Drd64_Server_RecvStatus *p_recvs;
88 if( 0 == gi_recvalloc_max ) {
89 p_recvs = (Drd64_Server_RecvStatus *)malloc(
90 sizeof( Drd64_Server_RecvStatus )
94 i_init_end_id = i_alloc_units;
97 p_recvs = realloc( gp_recvalloc,
98 gi_recvalloc_max + i_alloc_units );
100 i_init_start_id = gi_recvalloc_max;
101 i_init_end_id = gi_recvalloc_max + i_alloc_units;
104 if( NULL == p_recvs ) {
109 for( i_cnt = i_init_start_id; i_cnt < i_init_end_id; i_cnt++ ) {
110 memset( (p_recvs + i_cnt), 0x00,
111 sizeof( Drd64_Server_RecvStatus ) );
112 (p_recvs + i_cnt)->i_recvstatus_id = -1;
113 (p_recvs + i_cnt)->i_fds_id = -1;
115 pv_temp = malloc( DRD64_MAX_PACKET_LENGTH );
116 if( NULL == pv_temp ) { break; }
117 (p_recvs + i_cnt)->pv_buf = pv_temp;
121 if( gi_recvalloc_max == i_init_start_id ) {
125 gp_recvalloc = p_recvs;
130 EXTERN_SERVER_RECVSTATUS
132 Drd64_Server_RecvStatus_Init(
135 Drd64_Server_RecvStatus *p_recvs;
137 /* Alloc RecvStatus Struct Management Area --- */
139 = (Drd64_Server_RecvStatus **)malloc(
140 sizeof( Drd64_Server_RecvStatus *)
141 * FD_SETSIZE * DRD64_PACKET_MAX_MULTIPLE);
142 if( NULL == gpp_recvstat ) { return 0x01; }
144 memset( gpp_recvstat, 0x00,
145 sizeof( Drd64_Server_RecvStatus *)
146 * FD_SETSIZE * DRD64_PACKET_MAX_MULTIPLE );
150 /* Alloc RecvStatus Area ( with Packet Data buffer ) ---*/
151 p_recvs = Drd64_Server_RecvStatus_AllocRecvStatus_Unit( i_alloc_units );
152 if( NULL == p_recvs ) {
153 Drd64_Server_RecvStatus_FreeRecvStatus_All();
157 gp_recvalloc = p_recvs;
158 gi_recvalloc_now = 0;
160 gp_recv_resume_start = NULL;
161 gi_recv_resume_max = FD_SETSIZE;
163 gp_recv_sockets_start = NULL;
164 gp_recv_sockets_end = NULL;
170 EXTERN_SERVER_RECVSTATUS
172 Drd64_Server_RecvStatus_Term(
175 Drd64_Server_RecvStatus_FreeRecvStatus_All();
181 EXTERN_SERVER_RECVSTATUS
182 Drd64_Server_RecvStatus *
183 Drd64_Server_RecvStatus_AllocRecvStatus(
188 Drd64_Server_RecvStatus *p_recv;
189 Drd64_Server_RecvStatus *p_temp;
193 /* Check No-Use RecvStatus --- */
194 if( gi_recvalloc_now >= gi_recvalloc_max ) {
195 /* Search No-Use RecvStatus --- */
196 for( i_cnt = 0; i_cnt < gi_recvalloc_max; i_cnt++ ) {
197 if( -1 == (gp_recvalloc + i_cnt)->i_recvstatus_id ) {
198 p_recv = (gp_recvalloc + i_cnt);
203 /* Realloc RecvStatus --- */
204 if( NULL == p_recv ) {
206 = Drd64_Server_RecvStatus_AllocRecvStatus_Unit(
208 if( NULL == p_temp ) { return NULL; }
210 gp_recvalloc = p_temp;
211 p_recv = gp_recvalloc + gi_recvalloc_now++;
215 p_recv = gp_recvalloc + gi_recvalloc_now++;
218 /* Set RecvStatus Init. Param ---*/
219 p_recv->i_recvstatus_id = i_fds;
220 p_recv->i_fds_id = i_fds;
221 *(gpp_recvstat + i_fds) = p_recv;
225 if( i_fds + 1 > gi_recvstat_max )
226 { gi_recvstat_max = i_fds + 1; }
233 Drd64_Server_RecvStatus_FreeRecvStatus(
234 Drd64_Server_RecvStatus *p_recv )
236 assert( NULL != p_recv );
238 p_recv->pv_recv_before = NULL;
239 p_recv->pv_recv_next = NULL;
241 p_recv->i_recvstatus_id = -1;
242 p_recv->i_fds_id = -1;
248 EXTERN_SERVER_RECVSTATUS
250 Drd64_Server_RecvStatus_CloseRecvStatus(
254 Drd64_Server_RecvStatus *p_recv_now;
255 Drd64_Server_RecvStatus *p_recv_temp;
257 p_recv_now = *(gpp_recvstat + i_fds);
259 if( NULL != p_recv_now ) {
260 *(gpp_recvstat + i_fds) = NULL;
262 if( i_fds + 1 == gi_recvstat_max ) {
263 for( i_cnt = i_fds+1; i_cnt > 0; i_cnt-- ) {
264 p_recv_temp = *(gpp_recvstat + i_cnt);
265 if( NULL != p_recv_temp ) {
266 gi_recvstat_max = i_cnt + 1;
271 if( 0 == i_cnt ) { gi_recvstat_max = 0; }
274 Drd64_Server_RecvStatus_FreeRecvStatus( p_recv_now );
281 EXTERN_SERVER_RECVSTATUS
283 Drd64_Server_RecvStatus_PushResumeChain(
289 Drd64_Server_RecvStatus *p_recv_self;
290 Drd64_Server_RecvStatus *p_recv_new;
291 Drd64_Server_RecvStatus *p_recv_before;
295 /* Get Self RecvStatus --- */
296 p_recv_self = *(gpp_recvstat + i_fds);
297 if( NULL == p_recv_self ) {
301 /* Get New RecvStatus --- */
303 = Drd64_Server_RecvStatus_AllocRecvStatus(
304 i_fds, i_alloc_units );
305 if( NULL == p_recv_new ) {
309 /* Push & Chain RecvStatus ---*/
311 if( NULL == gp_recv_resume_start ) {
312 gp_recv_resume_start = p_recv_self;
313 gp_recv_resume_end = p_recv_self;
314 p_recv_self->pv_recv_before = NULL;
315 p_recv_self->pv_recv_next = NULL;
316 i_cnt = gi_recv_resume_max;
320 while(( NULL != *(gpp_recvstat + i_cnt) )
321 && ( i_cnt < gi_recv_resume_max )) { i_cnt++; }
322 assert( NULL == *(gpp_recvstat + i_cnt) );
324 p_recv_before = gp_recv_resume_end;
325 assert( NULL != p_recv_before );
327 p_recv_self->pv_recv_before = (void *)p_recv_before;
328 p_recv_self->pv_recv_next = (void *)p_recv_before->pv_recv_next;
329 p_recv_before->pv_recv_next = (void *)p_recv_self;
330 gp_recv_resume_end = p_recv_self;
334 p_recv_self->i_recvstatus_id = i_cnt;
335 *(gpp_recvstat + p_recv_self->i_recvstatus_id) = p_recv_self;
336 if( gi_recv_resume_max == i_cnt ) {
337 gi_recv_resume_max++;
344 EXTERN_SERVER_RECVSTATUS
346 Drd64_Server_RecvStatus_DeleteResumeChain(
349 Drd64_Server_RecvStatus *p_recv_self;
350 Drd64_Server_RecvStatus *p_recv_before;
351 Drd64_Server_RecvStatus *p_recv_next;
354 p_recv_self = *(gpp_recvstat + i_recv_id);
355 if( NULL == p_recv_self ) {
359 p_recv_before = (Drd64_Server_RecvStatus *)p_recv_self->pv_recv_before;
360 p_recv_next = (Drd64_Server_RecvStatus *)p_recv_self->pv_recv_next;
362 if( NULL != p_recv_before ) {
363 p_recv_before->pv_recv_next = (void *)p_recv_next;
366 if( NULL != p_recv_next ) {
367 p_recv_next->pv_recv_before = (void *)p_recv_before;
370 if( gp_recv_resume_end == p_recv_self ) {
371 gp_recv_resume_end = p_recv_before;
374 if( p_recv_self->i_recvstatus_id == (gi_recv_resume_max - 1) ) {
375 gi_recv_resume_max--;
378 if( FD_SETSIZE == gi_recv_resume_max ) {
379 gp_recv_resume_start = NULL;
380 gp_recv_resume_end = NULL;
383 *(gpp_recvstat + i_recv_id) = NULL;
385 Drd64_Server_RecvStatus_FreeRecvStatus( p_recv_self );
391 EXTERN_SERVER_RECVSTATUS
393 Drd64_Server_RecvStatus_AddSocketsChain(
394 Drd64_Server_RecvStatus *p_recv )
396 Drd64_Server_RecvStatus *p_before;
398 if( NULL == p_recv ) { return 0x01; }
400 p_before = gp_recv_sockets_end;
402 p_recv->pv_recv_before = (void *)p_before;
403 if( NULL != p_before )
404 { p_before->pv_recv_next = (void *)p_recv; }
406 { gp_recv_sockets_start = p_recv; }
408 gp_recv_sockets_end = p_recv;
414 EXTERN_SERVER_RECVSTATUS
416 Drd64_Server_RecvStatus_DeleteSocketsChain(
417 Drd64_Server_RecvStatus *p_recv )
419 Drd64_Server_RecvStatus *p_before;
420 Drd64_Server_RecvStatus *p_next;
422 if( NULL == p_recv ) { return -1; }
424 p_before = (Drd64_Server_RecvStatus *)p_recv->pv_recv_before;
425 p_next = (Drd64_Server_RecvStatus *)p_recv->pv_recv_next;
427 if( NULL != p_before )
428 { p_before->pv_recv_next = (void *)p_next; }
430 { p_next->pv_recv_before = (void *)p_before; }
432 if( p_recv == gp_recv_sockets_start )
433 { gp_recv_sockets_start = p_next; }
434 if( p_recv == gp_recv_sockets_end )
435 { gp_recv_sockets_end = p_before; }
437 p_recv->pv_recv_next = NULL;
438 p_recv->pv_recv_before = NULL;
444 EXTERN_SERVER_RECVSTATUS
446 Drd64_Server_RecvStatus_InitRecvStatus(
447 Drd64_Server_RecvStatus *p_recv,
450 assert( NULL != p_recv );
452 p_recv->i_read_phase = DRD64_SERVER_RECVSTATUS_PHASE_HEADER;
453 p_recv->b_recv_status = DRD64_SERVER_RECVSTATUS_STATUS_READ;
454 p_recv->i_command_status = DRD64_SERVER_CMDSTATUS_STATUS_NORMAL;
455 p_recv->i_remain_bytes = sizeof( Drd64_PacketHeader );
456 p_recv->pv_resume = p_recv->pv_buf;
457 p_recv->pv_recv_before = NULL;
458 p_recv->pv_recv_next = NULL;
459 p_recv->pv_cinfo_connection = NULL;
460 p_recv->i_fds_id = i_socket;
466 EXTERN_SERVER_RECVSTATUS
468 Drd64_Server_RecvStatus_SetConnectionInfoPointer(
469 Drd64_Server_RecvStatus *p_recv_now,
473 Drd64_Server_RecvStatus *p_recv_socket;
475 assert( NULL != p_recv_now );
477 p_recv_now->pv_cinfo_connection = pv_cinfo;
479 p_recv_socket = *(gpp_recvstat + p_recv_now->i_fds_id);
480 if(( NULL != p_recv_socket ) && ( p_recv_socket != p_recv_now )) {
481 assert( NULL == p_recv_socket->pv_cinfo_connection );
482 p_recv_socket->pv_cinfo_connection = pv_cinfo;
489 EXTERN_SERVER_RECVSTATUS
490 Drd64_Server_RecvStatus *
491 Drd64_Server_RecvStatus_GetRecvStatus(
494 return *(gpp_recvstat + i_recv_id);
498 EXTERN_SERVER_RECVSTATUS
500 Drd64_Server_RecvStatus_GetSocketID(
503 Drd64_Server_RecvStatus *p_recv;
504 p_recv = *(gpp_recvstat + i_recv_id);
506 if( NULL == p_recv ) { return -1; }
508 return p_recv->i_fds_id;
512 EXTERN_SERVER_RECVSTATUS
514 Drd64_Server_RecvStatus_GetPacketStatus(
517 Drd64_Server_RecvStatus *p_recv;
518 p_recv = *(gpp_recvstat + i_recv_id);
520 if( NULL == p_recv ) { return -1; }
522 return p_recv->b_recv_status;
526 EXTERN_SERVER_RECVSTATUS
528 Drd64_Server_RecvStatus_GetCmdStatus(
531 Drd64_Server_RecvStatus *p_recv;
532 p_recv = *(gpp_recvstat + i_recv_id);
534 if( NULL == p_recv ) { return -1; }
536 return p_recv->i_command_status;
540 EXTERN_SERVER_RECVSTATUS
542 Drd64_Server_RecvStatus_SetCmdStatus(
544 int i_command_status )
546 Drd64_Server_RecvStatus *p_recv;
547 p_recv = *(gpp_recvstat + i_recv_id);
549 if( NULL == p_recv ) { return -1; }
551 p_recv->i_command_status = i_command_status;
553 return p_recv->i_command_status;
557 EXTERN_SERVER_RECVSTATUS
559 Drd64_Server_RecvStatus_GetRecvStatMax(
562 return gi_recvstat_max;
566 EXTERN_SERVER_RECVSTATUS
567 Drd64_Server_RecvStatus *
568 Drd64_Server_RecvStatus_GetResumeChainStart(
571 return gp_recv_resume_start;
575 EXTERN_SERVER_RECVSTATUS
576 Drd64_Server_RecvStatus *
577 Drd64_Server_RecvStatus_GetSocketsChainStart(
580 return gp_recv_sockets_start;
584 /* EOF of drd64_.c ----------------------------------- */