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"
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
48 Drd64_Marshald_Cmd_AttachRequest_Scn4_RecvBootInfo(
50 Drd64_PacketHeader *p_phead,
51 Drd64_PacketData_AttachRequest *p_attach,
52 Drd64_Marshald_MasterInformation *p_marshald )
57 Drd64_Marshald_ConnectInfo *p_cinfo;
59 DRD64_LOG_DEBUG(" [DEBUG]CMD: Attach Req. (Scn4:RecvBootInfo) Start");
61 p_cinfo = Drd64_Marshald_CInfo_GetConnectInfo(
62 p_phead->i_connect_id );
63 assert( NULL != p_cinfo );
65 i_fds = Drd64_Server_RecvStatus_GetSocketID( i_recv_id );
66 assert( -1 != i_fds );
68 /* Set Answer Data ---------*/
69 p_phead->w_packettype = DRD64_PACKETTYPE_ANSWER;
70 p_attach->i_connect_id = p_phead->i_connect_id;
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
77 DRD64_LOG_DEBUG(" [DEBUG]CMD: Attach Req. (Scn4:RecvBootInfo) Ended");
79 return DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
84 Drd64_Marshald_Cmd_AttachRequest_Scn2_ConnectINetMarshald(
86 Drd64_PacketHeader *p_phead,
87 Drd64_PacketData_AttachRequest *p_attachreq,
88 Drd64_Marshald_MasterInformation *p_marshald )
91 Drd64_Marshald_ConnectInfo *p_cinfo_inet;
93 i_result = DRD64_MARSHALD_DISPATCH_RESULT_CLOSE; // XXX > error
95 p_cinfo_inet = Drd64_Marshald_SendCmd_Connect(
96 &(p_attachreq->t_prog_addr), i_recv_id );
97 if( NULL != p_cinfo_inet ) {
99 = Drd64_Marshald_Cmd_AttachRequest_Scn3_TransAttachRequest(
100 i_recv_id, p_phead, p_attachreq, p_marshald );
103 Drd64_Server_RecvStatus_SetCmdStatus( i_recv_id,
104 DRD64_CMDSTATUS_ATTACHREQ_WAITCONNECT );
106 DRD64_LOG_DEBUG(" [DEBUG]CMD: Attach Req. (Scn2:ConnectINetMarshald) Ended");
107 /* Polling form debugd-Initialized */
108 i_result = DRD64_MARSHALD_DISPATCH_RESULT_POLL;
116 Drd64_Marshald_Cmd_AttachRequest_Scn3_TransAttachRequest(
118 Drd64_PacketHeader *p_phead,
119 Drd64_PacketData_AttachRequest *p_attachreq,
120 Drd64_Marshald_MasterInformation *p_marshald )
123 Drd64_Marshald_ConnectInfo *p_cinfo;
125 /* XXX : Error Check from Connect */
127 p_cinfo = Drd64_Marshald_SearchINetConnection(
128 &(p_attachreq->t_prog_addr) );
129 assert( NULL != p_cinfo );
131 p_phead->w_packettype = DRD64_PACKETTYPE_TRANSPORT;
132 i_err = Drd64_Server_Packet_SendPacket(
133 p_cinfo->i_dest_socket,
136 p_phead->i_datalen );
137 if( 0 > i_err ) { return 0x02; }
139 Drd64_Server_RecvStatus_SetCmdStatus( i_recv_id,
140 DRD64_CMDSTATUS_ATTACHREQ_WAITTRANS );
142 DRD64_LOG_DEBUG(" [DEBUG]CMD: Attach Req. (Scn3:TransAttachReq.) Ended");
144 /* Polling form debugd-Initialized */
145 return DRD64_MARSHALD_DISPATCH_RESULT_POLL;
150 Drd64_Marshald_Cmd_AttachRequest_Scn1_BootDebugd(
152 Drd64_PacketHeader *p_phead,
153 Drd64_PacketData_AttachRequest *p_attach,
154 Drd64_Marshald_MasterInformation *p_marshald )
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];
164 DRD64_LOG_DEBUG(" [DEBUG]CMD: Attach Req. (Scn1:BootDebugd) Start");
166 /* Phase 0 : Init ----------------------------*/
167 p_cinfo_now = Drd64_Marshald_CInfo_AllocConnectInfo();
168 if( NULL == p_cinfo_now )
172 = Drd64_Marshald_CInfo_GetConnectInfo( p_phead->i_connect_id );
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; }
180 /* a : attach pid => p_attach->i_prog_pid */
181 snprintf( str_pid_debugd, 10, "%d", p_attach->i_prog_pid );
184 snprintf( str_request_fd, 10, "%d", i_recv_id );
186 /* m : to Debugd ConnectInfo ID */
187 snprintf( str_debugd_connect_id, 10, "%d", p_cinfo_now->i_cinfo_id );
189 /* XXX c : coredump file */
191 DRD64_LOG_DEBUG(" [DEBUG]CMD: Attach Req. (Scn1) Param. Init. End");
193 /* Phase 2 : Exec debugd ----------------------*/
194 i_pid_debugd = fork();
196 if( 0 > i_pid_debugd ) {
200 else if( 0 == i_pid_debugd ) {
202 execl( p_marshald->str_path_debugd,
203 DRD64_MODULENAME_DEBUGD,
205 "-r", str_request_fd,
206 "-m", str_debugd_connect_id,
207 "-a", str_pid_debugd, NULL );
212 /* Phase 3 : Alloc & Set Connect Info. --------*/
213 DRD64_LOG_DEBUG(" [DEBUG]CMD: Attach Req. (Scn1) Debugd Booted");
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;
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;
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;
240 Drd64_Server_RecvStatus_SetCmdStatus( i_recv_id,
241 DRD64_CMDSTATUS_ATTACHREQ_WAITEXEC );
243 DRD64_LOG_DEBUG(" [DEBUG]CMD: Attach Req. (Scn1:BootDebugd) Ended");
245 /* Polling form debugd-Initialized */
246 return DRD64_MARSHALD_DISPATCH_RESULT_POLL;
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
257 Drd64_Marshald_Cmd_AttachRequest(
259 Drd64_PacketHeader *p_phead,
260 Drd64_PacketData_AttachRequest *p_attachreq,
261 Drd64_Marshald_MasterInformation *p_marshald )
268 Byte b_packet_status;
269 Drd64_Marshald_ConnectInfo *p_cinfo;
271 DRD64_LOG_VERBOSE("[STAT]CMD: Attach Request Start");
273 i_result = DRD64_MARSHALD_DISPATCH_RESULT_COMPLETE;
275 b_packet_status = Drd64_Server_RecvStatus_GetPacketStatus( i_recv_id );
276 if( DRD64_SERVER_RECVSTATUS_STATUS_ERROR == b_packet_status )
279 i_cmd_status = Drd64_Server_RecvStatus_GetCmdStatus( i_recv_id );
280 if( -1 == i_cmd_status )
283 i_inet_flag = Drd64_Server_INetAddr_CmpInAddr(
284 &(p_attachreq->t_prog_addr),
285 &(p_marshald->t_marshald_addr) );
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 );
295 /* Scenery 2 : Inet Debug Started (for Trans Inet Marshald ) ---*/
298 = Drd64_Marshald_Cmd_AttachRequest_Scn2_ConnectINetMarshald(
299 i_recv_id, p_phead, p_attachreq, p_marshald );
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 );
308 = Drd64_Marshald_Cmd_AttachRequest_Scn3_TransAttachRequest(
309 i_recv_id, p_phead, p_attachreq, p_marshald );
311 /* Scenery 4 : Recv. BootInfo Cmd from Debugd ---*/
312 else if( DRD64_CMDSTATUS_ATTACHREQ_WAITEXEC == i_cmd_status ) {
314 = Drd64_Marshald_Cmd_AttachRequest_Scn4_RecvBootInfo(
315 i_recv_id, p_phead, p_attachreq, p_marshald );
317 /* Scenery 5 : Recv. Answer Trans. Attach req. from Inet Marshald -*/
318 else if( DRD64_CMDSTATUS_ATTACHREQ_WAITTRANS == i_cmd_status ) {
324 /* XXX : Error Proc. */
328 //i_result = 0x02; /* XXX */
335 /* EOF of drd64_.c ----------------------------------- */