OSDN Git Service

(LibGoblin)
[drdeamon64/drdeamon64.git] / deamon / drd64_marshald_cmd_detach.c
1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
2
3                          D r . D e a m o n  6 4
4                         for INTEL64(R), AMD64(R)
5         
6    Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
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.
16
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.
28
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
30
31 /* File Info -----------------------------------------------------------
32 File: drd64_.c
33 Function: 
34 Comment: 
35 ----------------------------------------------------------------------*/
36
37 #include"drd64_marshald.h"
38
39 #define DRD64_CMDSTATUS_DETACH_NORMAL                   0x00
40 #define DRD64_CMDSTATUS_DETACH_WAITDISCONNECT   0x01
41
42
43 /*----------------------------------------------------------------------
44 ----------------------------------------------------------------------*/
45 int
46         Drd64_Marshald_Cmd_Detach_Scn4_INetAnswer(
47                 int             i_recv_id,
48                 Drd64_PacketHeader      *p_phead,
49                 Drd64_Marshald_MasterInformation        *p_marshald )
50 {
51         int             i_result;
52         int             i_err;
53         int             i_socket;
54         int             i_cmd_status;
55         Drd64_Marshald_ConnectInfo      *p_cinfo_now;
56         Drd64_Marshald_ConnectInfo      *p_cinfo_connect;
57
58         DRD64_LOG_DEBUG("  [DEBUG]CMD: Detach (INet : Answer) Start");
59
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 );
64
65         i_cmd_status    = Drd64_Server_RecvStatus_GetCmdStatus( i_recv_id );
66
67         if( DRD64_CMDSTATUS_DETACH_NORMAL == i_cmd_status )             {
68         
69                 p_cinfo_connect = p_cinfo_now->p_dest_cinfo_connection;
70                 assert( NULL != p_cinfo_connect );
71
72                 Drd64_Marshald_SendCmd_ConnectCount(
73                                 p_cinfo_connect, -1, i_recv_id );
74                 
75                 Drd64_Server_RecvStatus_SetCmdStatus( i_recv_id,
76                         DRD64_CMDSTATUS_DETACH_WAITDISCONNECT );
77
78                 i_result        = DRD64_MARSHALD_DISPATCH_RESULT_POLL;
79
80                 DRD64_LOG_DEBUG("  [DEBUG]CMD: Detach (INet : Answer) Polling(Waiting INet-DisConnect)");
81         }
82         else if( DRD64_CMDSTATUS_DETACH_WAITDISCONNECT == i_cmd_status )        {
83                 i_socket                = p_cinfo_now->i_client_socket;
84
85                 Drd64_Marshald_Cinfo_FreeConnectInfo( p_cinfo_now );
86                 p_cinfo_now             = NULL;
87
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;
91         
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; }
96
97                 Drd64_Server_RecvStatus_SetCmdStatus( i_recv_id,
98                                 DRD64_CMDSTATUS_DETACH_NORMAL );
99
100
101                 DRD64_LOG_DEBUG("  [DEBUG]CMD: Detach (INet : Answer) Ended");
102         }
103         else    {
104                 DRD64_LOG_DEBUG("  [DEBUG]CMD: Detach (INet : Answer) Error");
105         }
106
107         return i_result;
108 }
109
110
111 /*----------------------------------------------------------------------
112 ----------------------------------------------------------------------*/
113 int
114         Drd64_Marshald_Cmd_Detach_Scn3_LocalAnswer(
115                 int             i_recv_id,
116                 Drd64_PacketHeader      *p_phead,
117                 Drd64_Marshald_MasterInformation        *p_marshald )
118 {
119         int             i_result;
120         int             i_err;
121         int             i_socket;
122         Drd64_Marshald_ConnectInfo      *p_cinfo_now;
123         Drd64_Marshald_ConnectInfo      *p_cinfo_connect;
124
125         DRD64_LOG_DEBUG("  [DEBUG]CMD: Detach (Local : Answer) Start");
126
127         i_result        = DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
128
129         p_cinfo_now = Drd64_Marshald_CInfo_GetConnectInfo( p_phead->i_cid_src );
130         assert( NULL != p_cinfo_now );
131
132         i_socket        = p_cinfo_now->i_src_socket;
133         Drd64_Marshald_Dispatch_CloseSocket( p_cinfo_now->i_dest_socket );
134
135         Drd64_Marshald_Cinfo_FreeConnectInfo( p_cinfo_now );
136         p_cinfo_now             = NULL;
137
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;
141
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; }
146
147         DRD64_LOG_DEBUG("  [DEBUG]CMD: Detach (Local : Answer) Ended");
148
149         return i_result;
150 }
151
152
153 /*----------------------------------------------------------------------
154 ----------------------------------------------------------------------*/
155 int
156         Drd64_Marshald_Cmd_Detach_Scn2_INetRequest(
157                 int             i_recv_id,
158                 Drd64_PacketHeader      *p_phead,
159                 Drd64_Marshald_MasterInformation        *p_marshald )
160 {
161         int             i_result;
162         int             i_err;
163         Drd64_Marshald_ConnectInfo      *p_cinfo;
164
165         DRD64_LOG_DEBUG("  [DEBUG]CMD: Detach (INet : Request) Start");
166
167         i_result        = DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
168
169         p_cinfo = Drd64_Marshald_CInfo_GetConnectInfo( p_phead->i_cid_dest );
170         assert( NULL != p_cinfo );
171
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;
176
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; }
181
182         DRD64_LOG_DEBUG("  [DEBUG]CMD: Detach (INet : Request) Ended");
183
184         return i_result;
185 }
186
187
188 /*----------------------------------------------------------------------
189 ----------------------------------------------------------------------*/
190 int
191         Drd64_Marshald_Cmd_Detach_Scn1_LocalRequest(
192                 int             i_recv_id,
193                 Drd64_PacketHeader      *p_phead,
194                 Drd64_Marshald_MasterInformation        *p_marshald )
195 {
196         int             i_result;
197         int             i_err;
198         Drd64_Marshald_ConnectInfo      *p_cinfo;
199
200         DRD64_LOG_DEBUG("  [DEBUG]CMD: Detach (Local : Request) Start");
201
202         i_result        = DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
203
204         p_cinfo = Drd64_Marshald_CInfo_GetConnectInfo( p_phead->i_cid_dest );
205         assert( NULL != p_cinfo );
206
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 */
211
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; }
216
217         DRD64_LOG_DEBUG("  [DEBUG]CMD: Detach (Local : Request) Ended");
218
219         return i_result;
220 }
221
222
223 /*----------------------------------------------------------------------
224 ----------------------------------------------------------------------*/
225 int
226         Drd64_Marshald_Cmd_Detach(
227                 int             i_recv_id,
228                 Drd64_PacketHeader      *p_phead,
229                 Drd64_PacketData_AttachReport           *p_areport,
230                 Drd64_Marshald_MasterInformation        *p_marshald )
231 {
232         int             i_result;
233         Drd64_Marshald_ConnectInfo              *p_cinfo;
234
235         DRD64_LOG_VERBOSE("[STAT]CMD: Detach Start");
236
237         i_result        = DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
238
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 );
244                 }
245                 /* Scnery 4: (INet)Detach Answer from INet Marshald */
246                 else    {
247                         i_result = Drd64_Marshald_Cmd_Detach_Scn4_INetAnswer(
248                                                         i_recv_id, p_phead, p_marshald );
249                 }
250         }
251         else    {
252                 p_cinfo = Drd64_Marshald_CInfo_GetConnectInfo( p_phead->i_cid_dest );
253                 assert( NULL != p_cinfo );
254
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 );
259                 }
260                 /* Scnery 2: (INet)Detach Packet for INet Marshald */
261                 else    {
262                         i_result = Drd64_Marshald_Cmd_Detach_Scn2_INetRequest(
263                                                         i_recv_id, p_phead, p_marshald );
264                 }
265         }
266
267         DRD64_LOG_VERBOSE("[STAT]CMD: Detach Ended");
268
269         return i_result;
270 }
271
272
273 /* EOF of drd64_.c ----------------------------------- */