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 #define DRD64_CMDSTATUS_DETACH_NORMAL 0x00
40 #define DRD64_CMDSTATUS_DETACH_WAITDISCONNECT 0x01
43 /*----------------------------------------------------------------------
44 ----------------------------------------------------------------------*/
46 Drd64_Marshald_Cmd_Detach_Scn4_INetAnswer(
48 Drd64_PacketHeader *p_phead,
49 Drd64_Marshald_MasterInformation *p_marshald )
55 Drd64_Marshald_ConnectInfo *p_cinfo_now;
56 Drd64_Marshald_ConnectInfo *p_cinfo_connect;
58 DRD64_LOG_DEBUG(" [DEBUG]CMD: Detach (INet : Answer) Start");
60 i_result = DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
61 p_cinfo_now = Drd64_Marshald_CInfo_GetConnectInfo(
62 p_phead->i_cid_client );
63 assert( NULL != p_cinfo_now );
65 i_cmd_status = Drd64_Server_RecvStatus_GetCmdStatus( i_recv_id );
67 if( DRD64_CMDSTATUS_DETACH_NORMAL == i_cmd_status ) {
69 p_cinfo_connect = p_cinfo_now->p_dest_cinfo_connection;
70 assert( NULL != p_cinfo_connect );
72 Drd64_Marshald_SendCmd_ConnectCount(
73 p_cinfo_connect, -1, i_recv_id );
75 Drd64_Server_RecvStatus_SetCmdStatus( i_recv_id,
76 DRD64_CMDSTATUS_DETACH_WAITDISCONNECT );
78 i_result = DRD64_MARSHALD_DISPATCH_RESULT_POLL;
80 DRD64_LOG_DEBUG(" [DEBUG]CMD: Detach (INet : Answer) Polling(Waiting INet-DisConnect)");
82 else if( DRD64_CMDSTATUS_DETACH_WAITDISCONNECT == i_cmd_status ) {
83 i_socket = p_cinfo_now->i_client_socket;
85 Drd64_Marshald_Cinfo_FreeConnectInfo( p_cinfo_now );
88 p_phead->w_packettype ^= DRD64_PACKETTYPE_FLAG_TRANSPORT;
89 p_phead->i_cid_dest = p_phead->i_cid_client;
90 p_phead->i_cid_client = DRD64_CONNECTID_NONE;
92 i_err = send( i_socket, (void *)p_phead,
93 DRD64_PacketSize(p_phead), 0x00 );
94 DRD64_DEBUG_PRINT("send",i_err,"FD",i_socket,"errno",errno);
95 if( i_err != DRD64_PacketSize(p_phead) ) { return 0x02; }
97 Drd64_Server_RecvStatus_SetCmdStatus( i_recv_id,
98 DRD64_CMDSTATUS_DETACH_NORMAL );
101 DRD64_LOG_DEBUG(" [DEBUG]CMD: Detach (INet : Answer) Ended");
104 DRD64_LOG_DEBUG(" [DEBUG]CMD: Detach (INet : Answer) Error");
111 /*----------------------------------------------------------------------
112 ----------------------------------------------------------------------*/
114 Drd64_Marshald_Cmd_Detach_Scn3_LocalAnswer(
116 Drd64_PacketHeader *p_phead,
117 Drd64_Marshald_MasterInformation *p_marshald )
122 Drd64_Marshald_ConnectInfo *p_cinfo_now;
123 Drd64_Marshald_ConnectInfo *p_cinfo_connect;
125 DRD64_LOG_DEBUG(" [DEBUG]CMD: Detach (Local : Answer) Start");
127 i_result = DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
129 p_cinfo_now = Drd64_Marshald_CInfo_GetConnectInfo( p_phead->i_cid_src );
130 assert( NULL != p_cinfo_now );
132 i_socket = p_cinfo_now->i_src_socket;
133 Drd64_Marshald_Dispatch_CloseSocket( p_cinfo_now->i_dest_socket );
135 Drd64_Marshald_Cinfo_FreeConnectInfo( p_cinfo_now );
138 p_phead->w_packettype ^= DRD64_PACKETTYPE_OPTION_INDICATE;
139 p_phead->i_cid_dest = p_phead->i_cid_src;
140 p_phead->i_cid_src = DRD64_CONNECTID_NONE;
142 i_err = send( i_socket, (void *)p_phead,
143 DRD64_PacketSize(p_phead), 0x00 );
144 DRD64_DEBUG_PRINT("send",i_err,"FD",i_socket,"errno",errno);
145 if( i_err != DRD64_PacketSize(p_phead) ) { return 0x02; }
147 DRD64_LOG_DEBUG(" [DEBUG]CMD: Detach (Local : Answer) Ended");
153 /*----------------------------------------------------------------------
154 ----------------------------------------------------------------------*/
156 Drd64_Marshald_Cmd_Detach_Scn2_INetRequest(
158 Drd64_PacketHeader *p_phead,
159 Drd64_Marshald_MasterInformation *p_marshald )
163 Drd64_Marshald_ConnectInfo *p_cinfo;
165 DRD64_LOG_DEBUG(" [DEBUG]CMD: Detach (INet : Request) Start");
167 i_result = DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
169 p_cinfo = Drd64_Marshald_CInfo_GetConnectInfo( p_phead->i_cid_dest );
170 assert( NULL != p_cinfo );
172 p_phead->w_packettype |= DRD64_PACKETTYPE_FLAG_TRANSPORT;
173 p_phead->i_cid_client = p_phead->i_cid_dest;
174 p_phead->i_cid_dest = p_cinfo->i_dest_cinfo_id;
175 //p_phead->i_cid_src = p_cinfo->i_cinfo_id;
177 i_err = send( p_cinfo->i_dest_socket, (void *)p_phead,
178 DRD64_PacketSize(p_phead), 0x00 );
179 DRD64_DEBUG_PRINT("send",i_err,"FD",p_cinfo->i_dest_socket,"errno",errno);
180 if( i_err != DRD64_PacketSize(p_phead) ) { return i_result; }
182 DRD64_LOG_DEBUG(" [DEBUG]CMD: Detach (INet : Request) Ended");
188 /*----------------------------------------------------------------------
189 ----------------------------------------------------------------------*/
191 Drd64_Marshald_Cmd_Detach_Scn1_LocalRequest(
193 Drd64_PacketHeader *p_phead,
194 Drd64_Marshald_MasterInformation *p_marshald )
198 Drd64_Marshald_ConnectInfo *p_cinfo;
200 DRD64_LOG_DEBUG(" [DEBUG]CMD: Detach (Local : Request) Start");
202 i_result = DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
204 p_cinfo = Drd64_Marshald_CInfo_GetConnectInfo( p_phead->i_cid_dest );
205 assert( NULL != p_cinfo );
207 p_phead->w_packettype |= DRD64_PACKETTYPE_OPTION_INDICATE;
208 p_phead->i_cid_src = p_phead->i_cid_dest;
209 p_phead->i_cid_dest = p_cinfo->i_dest_cinfo_id;
210 /* = DRD64_CONNECTID_NONE */
212 i_err = send( p_cinfo->i_dest_socket, (void *)p_phead,
213 DRD64_PacketSize(p_phead), 0x00 );
214 DRD64_DEBUG_PRINT("send",i_err,"FD",p_cinfo->i_dest_socket,"errno",errno);
215 if( i_err != DRD64_PacketSize(p_phead) ) { return i_result; }
217 DRD64_LOG_DEBUG(" [DEBUG]CMD: Detach (Local : Request) Ended");
223 /*----------------------------------------------------------------------
224 ----------------------------------------------------------------------*/
226 Drd64_Marshald_Cmd_Detach(
228 Drd64_PacketHeader *p_phead,
229 Drd64_PacketData_AttachReport *p_areport,
230 Drd64_Marshald_MasterInformation *p_marshald )
233 Drd64_Marshald_ConnectInfo *p_cinfo;
235 DRD64_LOG_VERBOSE("[STAT]CMD: Detach Start");
237 i_result = DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
239 if( DRD64_IsPacketType_Answer( p_phead ) ) {
240 /* Scnery 3: (Local)Detach Answer from local-debugd */
241 if( DRD64_CONNECTID_NONE == p_phead->i_cid_dest ) {
242 i_result = Drd64_Marshald_Cmd_Detach_Scn3_LocalAnswer(
243 i_recv_id, p_phead, p_marshald );
245 /* Scnery 4: (INet)Detach Answer from INet Marshald */
247 i_result = Drd64_Marshald_Cmd_Detach_Scn4_INetAnswer(
248 i_recv_id, p_phead, p_marshald );
252 p_cinfo = Drd64_Marshald_CInfo_GetConnectInfo( p_phead->i_cid_dest );
253 assert( NULL != p_cinfo );
255 /* Scnery 1: (Local)Detach Packet for Local Debugd */
256 if( DRD64_CONNECTID_NONE == p_cinfo->i_dest_cinfo_id ) {
257 i_result = Drd64_Marshald_Cmd_Detach_Scn1_LocalRequest(
258 i_recv_id, p_phead, p_marshald );
260 /* Scnery 2: (INet)Detach Packet for INet Marshald */
262 i_result = Drd64_Marshald_Cmd_Detach_Scn2_INetRequest(
263 i_recv_id, p_phead, p_marshald );
267 DRD64_LOG_VERBOSE("[STAT]CMD: Detach Ended");
273 /* EOF of drd64_.c ----------------------------------- */