OSDN Git Service

*** empty log message ***
[drdeamon64/drdeamon64.git] / deamon / drd64_marshald_cmd_attach_request.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
40 #define DRD64_CMDSTATUS_ATTACHREQ_NORMAL                0x00
41 #define DRD64_CMDSTATUS_ATTACHREQ_WAITCONNECT   0x01
42 #define DRD64_CMDSTATUS_ATTACHREQ_WAITTRANS             0x02
43 #define DRD64_CMDSTATUS_ATTACHREQ_WAITEXEC              0x03
44
45
46
47 int
48         Drd64_Marshald_Cmd_AttachRequest_Scn4_RecvBootInfo(
49                 int             i_recv_id,
50                 Drd64_PacketHeader                                      *p_phead,
51                 Drd64_PacketData_AttachRequest          *p_attach,
52                 Drd64_Marshald_MasterInformation        *p_marshald )
53 {
54         int             i_wlen;
55         int             i_result;
56         int             i_fds;
57         Drd64_Marshald_ConnectInfo      *p_cinfo;
58
59         DRD64_LOG_DEBUG("  [DEBUG]CMD: Attach Req. (Scn4:RecvBootInfo) Start");
60
61         p_cinfo = Drd64_Marshald_CInfo_GetConnectInfo(
62                                                                         p_phead->i_connect_id );
63         assert( NULL != p_cinfo );
64
65         i_fds   = Drd64_Server_RecvStatus_GetSocketID( i_recv_id );
66         assert( -1 != i_fds );
67
68         /* Set Answer Data ---------*/
69         p_phead->w_packettype           = DRD64_PACKETTYPE_ANSWER;
70         p_attach->i_connect_id                  = p_phead->i_connect_id;
71
72         i_wlen  = send( i_fds, (void *)p_phead,
73                                                 DRD64_PacketSize(p_phead), 0x00 );
74         if( i_wlen != DRD64_PacketSize(p_phead) )
75                 { return DRD64_MARSHALD_DISPATCH_RESULT_CLOSE; }        // XXX > error 
76
77         DRD64_LOG_DEBUG("  [DEBUG]CMD: Attach Req. (Scn4:RecvBootInfo) Ended");
78
79         return DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
80 }
81
82
83 int
84         Drd64_Marshald_Cmd_AttachRequest_Scn2_ConnectINetMarshald(
85                 int             i_recv_id,
86                 Drd64_PacketHeader      *p_phead,
87                 Drd64_PacketData_AttachRequest  *p_attachreq,
88                 Drd64_Marshald_MasterInformation        *p_marshald )
89 {
90         int             i_result;
91         Drd64_Marshald_ConnectInfo      *p_cinfo_inet;
92
93         i_result        = DRD64_MARSHALD_DISPATCH_RESULT_CLOSE;         // XXX > error
94
95         p_cinfo_inet = Drd64_Marshald_SendCmd_Connect(
96                                                         &(p_attachreq->t_prog_addr), i_recv_id );
97         if( NULL != p_cinfo_inet )      {
98                 i_result
99                         = Drd64_Marshald_Cmd_AttachRequest_Scn3_TransAttachRequest(
100                                                 i_recv_id, p_phead, p_attachreq, p_marshald );
101         }
102         else    {
103                 Drd64_Server_RecvStatus_SetCmdStatus( i_recv_id,
104                                                 DRD64_CMDSTATUS_ATTACHREQ_WAITCONNECT );
105
106                 DRD64_LOG_DEBUG("  [DEBUG]CMD: Attach Req. (Scn2:ConnectINetMarshald) Ended");
107                 /* Polling form debugd-Initialized */
108                 i_result        = DRD64_MARSHALD_DISPATCH_RESULT_POLL; 
109         }
110
111         return i_result;
112 }
113
114
115 int
116         Drd64_Marshald_Cmd_AttachRequest_Scn3_TransAttachRequest(
117                 int             i_recv_id,
118                 Drd64_PacketHeader      *p_phead,
119                 Drd64_PacketData_AttachRequest  *p_attachreq,
120                 Drd64_Marshald_MasterInformation        *p_marshald )
121 {
122         int             i_err;
123         Drd64_Marshald_ConnectInfo      *p_cinfo;
124
125         /* XXX : Error Check from Connect */
126
127         p_cinfo = Drd64_Marshald_SearchINetConnection(
128                                                         &(p_attachreq->t_prog_addr) );
129         assert( NULL != p_cinfo );
130
131         p_phead->w_packettype   = DRD64_PACKETTYPE_TRANSPORT;
132         i_err   = Drd64_Server_Packet_SendPacket(
133                                         p_cinfo->i_dest_socket,
134                                         (void *)p_phead,
135                                         p_phead->i_datalen,
136                                         p_phead->i_datalen );
137         if( 0 > i_err ) { return 0x02; }
138
139         Drd64_Server_RecvStatus_SetCmdStatus( i_recv_id,
140                                                 DRD64_CMDSTATUS_ATTACHREQ_WAITTRANS );
141
142         DRD64_LOG_DEBUG("  [DEBUG]CMD: Attach Req. (Scn3:TransAttachReq.) Ended");
143
144         /* Polling form debugd-Initialized */
145         return DRD64_MARSHALD_DISPATCH_RESULT_POLL;
146 }
147
148
149 int
150         Drd64_Marshald_Cmd_AttachRequest_Scn1_BootDebugd(
151                 int             i_recv_id,
152                 Drd64_PacketHeader                                      *p_phead,
153                 Drd64_PacketData_AttachRequest          *p_attach,
154                 Drd64_Marshald_MasterInformation        *p_marshald )
155 {
156         Drd64_Marshald_ConnectInfo              *p_cinfo_now;
157         Drd64_Marshald_ConnectInfo              *p_cinfo_marshald;
158         char                                                    str_sockname[256];
159         char    str_pid_debugd[10];
160         char    str_request_fd[10];
161         char    str_debugd_connect_id[10];
162         int             i_pid_debugd;
163
164         DRD64_LOG_DEBUG("  [DEBUG]CMD: Attach Req. (Scn1:BootDebugd) Start");
165
166         /* Phase 0 : Init ----------------------------*/
167         p_cinfo_now     = Drd64_Marshald_CInfo_AllocConnectInfo();
168         if( NULL == p_cinfo_now )
169                 { return 0x00; }
170
171         p_cinfo_marshald
172                 = Drd64_Marshald_CInfo_GetConnectInfo( p_phead->i_connect_id );
173
174
175         /* Phase 1 : Generate Debugd Param -----------*/
176         /* n : socketname(PF_UNIX) */
177         strcpy( str_sockname, "/tmp/tmpdrd64debugd_XXXXXXXXXX" );
178         if( NULL == mktemp( str_sockname ))     { return 0x01; }
179
180         /* a : attach pid => p_attach->i_prog_pid */
181         snprintf( str_pid_debugd, 10, "%d", p_attach->i_prog_pid );
182
183         /* r : request fd */
184         snprintf( str_request_fd, 10, "%d", i_recv_id );
185
186         /* m : to Debugd ConnectInfo ID */
187         snprintf( str_debugd_connect_id, 10, "%d", p_cinfo_now->i_cinfo_id );
188
189         /* XXX c : coredump file */
190
191         DRD64_LOG_DEBUG("  [DEBUG]CMD: Attach Req. (Scn1) Param. Init. End");
192
193         /* Phase 2 : Exec debugd ----------------------*/
194         i_pid_debugd    = fork();
195         /* fork error */
196         if( 0 > i_pid_debugd )  {
197                 return 0x02;
198         }
199         /* child Proc. */
200         else if( 0 == i_pid_debugd )    {
201                 /* XXX */
202                 execl( p_marshald->str_path_debugd,
203                                 DRD64_MODULENAME_DEBUGD,
204                                 "-n", str_sockname,
205                                 "-r", str_request_fd,
206                                 "-m", str_debugd_connect_id,
207                                 "-a", str_pid_debugd, NULL );
208                 exit( 0 );
209         }
210         /* Parent Proc. */
211         else    {
212                 /* Phase 3 : Alloc & Set Connect Info. --------*/
213                 DRD64_LOG_DEBUG("  [DEBUG]CMD: Attach Req. (Scn1) Debugd Booted");
214
215                 p_cinfo_now->i_dest_socket                      = -1;
216                 p_cinfo_now->str_dest_addr_local[0]     = '\0';         // ***
217                 Drd64_Server_INetAddr_SetInAddr_LocalHost(
218                                 &(p_cinfo_now->t_dest_addr_inet) );
219                 p_cinfo_now->i_dest_cinfo_id            = -1;
220
221                 p_cinfo_now->i_src_socket                       = p_cinfo_marshald->i_src_socket;
222                 Drd64_Server_INetAddr_CopyInAddr(
223                                 &(p_cinfo_now->t_src_addr_inet),
224                                 &(p_cinfo_marshald->t_client_addr_inet) );
225                 p_cinfo_now->i_src_cinfo_id                     = p_phead->i_connect_id;
226
227                 Drd64_Server_INetAddr_SetInAddr_LocalHost(
228                                                         &(p_cinfo_now->t_prog_addr_inet) );
229                 Drd64_Server_INetAddr_CopyInAddr(
230                                 &(p_cinfo_now->t_prog_addr_inet),
231                                 &(p_attach->t_prog_addr) );
232                 p_cinfo_now->i_prog_pid                         = p_attach->i_prog_pid;
233                 p_cinfo_now->i_debugd_pid                       = i_pid_debugd;
234                 Drd64_Server_INetAddr_CopyInAddr(
235                                 &(p_cinfo_now->t_client_addr_inet),
236                                 &(p_cinfo_marshald->t_client_addr_inet) );
237                 p_cinfo_now->i_client_pid                       = p_cinfo_marshald->i_client_pid;
238         }
239
240         Drd64_Server_RecvStatus_SetCmdStatus( i_recv_id,
241                                         DRD64_CMDSTATUS_ATTACHREQ_WAITEXEC );
242
243         DRD64_LOG_DEBUG("  [DEBUG]CMD: Attach Req. (Scn1:BootDebugd) Ended");
244
245         /* Polling form debugd-Initialized */
246         return DRD64_MARSHALD_DISPATCH_RESULT_POLL;
247 }
248
249
250
251 //#define DRD64_CMDSTATUS_ATTACHREQ_NORMAL              0x00
252 //#define DRD64_CMDSTATUS_ATTACHREQ_WAITCONNECT 0x01
253 //#define DRD64_CMDSTATUS_ATTACHREQ_WAITTRANS           0x02
254 //#define DRD64_CMDSTATUS_ATTACHREQ_WAITEXEC            0x03
255
256 int
257         Drd64_Marshald_Cmd_AttachRequest(
258                 int             i_recv_id,
259                 Drd64_PacketHeader      *p_phead,
260                 Drd64_PacketData_AttachRequest  *p_attachreq,
261                 Drd64_Marshald_MasterInformation        *p_marshald )
262 {
263         int                     i_wlen;
264         int                     i_err;
265         int                     i_result;
266         int                     i_cmd_status;
267         int                     i_inet_flag;
268         Byte            b_packet_status;
269         Drd64_Marshald_ConnectInfo              *p_cinfo;
270
271         DRD64_LOG_VERBOSE("[STAT]CMD: Attach Request Start");
272
273         i_result        = DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
274
275         b_packet_status = Drd64_Server_RecvStatus_GetPacketStatus( i_recv_id );
276         if( DRD64_SERVER_RECVSTATUS_STATUS_ERROR == b_packet_status )
277                 { return i_result; }
278
279         i_cmd_status    = Drd64_Server_RecvStatus_GetCmdStatus( i_recv_id );
280         if( -1 == i_cmd_status )
281                 { return i_result; }
282         
283         i_inet_flag     = Drd64_Server_INetAddr_CmpInAddr(
284                                                 &(p_attachreq->t_prog_addr),
285                                                 &(p_marshald->t_marshald_addr) );
286
287
288         if( DRD64_SERVER_RECVSTATUS_STATUS_READ == b_packet_status )    {
289                 /* Scenery 1 : Local Debug Started (from Local or Inet)---*/
290                 if( 0x00 == i_inet_flag )       {
291                         i_result = Drd64_Marshald_Cmd_AttachRequest_Scn1_BootDebugd(
292                                                 i_recv_id, p_phead, p_attachreq, p_marshald );
293
294                 }
295                 /* Scenery 2 : Inet Debug Started (for Trans Inet Marshald ) ---*/
296                 else    {
297                         i_result
298                                 = Drd64_Marshald_Cmd_AttachRequest_Scn2_ConnectINetMarshald(
299                                                 i_recv_id, p_phead, p_attachreq, p_marshald );
300                 }
301         }
302         else if( DRD64_SERVER_RECVSTATUS_STATUS_RESUME == b_packet_status )     {
303                 /* Scenery 3 : Trans Attach Req. for Inet Marshald ---*/
304                 if( DRD64_CMDSTATUS_ATTACHREQ_WAITCONNECT == i_cmd_status )     {
305                         assert( 0x00 != i_inet_flag );
306
307                         i_result
308                                 = Drd64_Marshald_Cmd_AttachRequest_Scn3_TransAttachRequest(
309                                                 i_recv_id, p_phead, p_attachreq, p_marshald );
310                 }
311                 /* Scenery 4 : Recv. BootInfo Cmd from Debugd ---*/
312                 else if( DRD64_CMDSTATUS_ATTACHREQ_WAITEXEC == i_cmd_status )   {
313                         i_result
314                                 = Drd64_Marshald_Cmd_AttachRequest_Scn4_RecvBootInfo(
315                                                 i_recv_id, p_phead, p_attachreq, p_marshald );
316                 }
317                 /* Scenery 5 : Recv. Answer Trans. Attach req. from Inet Marshald -*/
318                 else if( DRD64_CMDSTATUS_ATTACHREQ_WAITTRANS == i_cmd_status )  {
319
320                 }
321
322         }
323         else    {
324                 /* XXX : Error Proc. */
325         }
326
327
328         //i_result      = 0x02;         /* XXX */
329
330         
331         return i_result;
332 }
333
334
335 /* EOF of drd64_.c ----------------------------------- */