OSDN Git Service

8d79551b549e5338457cfa5cb18570ed8f092553
[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 int
40         Drd64_Marshald_Cmd_AttachRequest_toINet(
41                 int             i_fds,
42                 Drd64_PacketHeader      *p_phead,
43                 Drd64_PacketData_AttachRequest  *p_attachreq,
44                 Drd64_Marshald_MasterInformation        *p_marshald )
45 {
46         int             i_err;
47         Drd64_Marshald_ConnectInfo      *p_cinfo;
48
49         /* Phase 0 : Init ----------------------------*/
50         /* Phase 1 : Connect INet-Marshald -----------*/
51
52         p_cinfo = Drd64_Marshald_SendCmd_Connect( &(p_attachreq->t_prog_addr) );
53         if( NULL == p_cinfo )   {
54                 return 0x01;
55         }
56         puts("connected");
57
58         /* Phase 2 : Transport Attach-Request Packet -*/
59         p_phead->w_packettype   = DRD64_PACKETTYPE_TRANSPORT;
60         i_err   = Drd64_Server_Packet_SendPacket(
61                                         p_cinfo->i_dest_socket, (void *)p_phead,
62                                         p_phead->i_datalen, p_phead->i_datalen );
63         if( 0 > i_err ) { return 0x02; }
64
65         return 0x00;
66 }
67
68
69 int
70         Drd64_Marshald_Cmd_AttachRequest_fromINet(
71                 int             i_fds,
72                 Drd64_PacketHeader      *p_phead,
73                 Drd64_PacketData_AttachRequest  *p_attach,
74                 Drd64_Marshald_MasterInformation        *p_marshald )
75 {
76         /* Phase 0 : Init ----------------------------*/
77         /* Phase 1 : Generate Debugd Param -----------*/
78         /* Phase 2 : Exec debugd ----------------------*/
79         /* Phase 3 : Alloc & Set Connect Info. --------*/
80         /* Phase 4 : Set Answer Packet Info. ---------*/
81
82         return 0x00;
83 }
84
85
86 int
87         Drd64_Marshald_Cmd_AttachRequest_toDebugd(
88                 int             i_fds,
89                 Drd64_PacketHeader      *p_phead,
90                 Drd64_PacketData_AttachRequest  *p_attach,
91                 Drd64_Marshald_MasterInformation        *p_marshald )
92 {
93         Drd64_Marshald_ConnectInfo              *p_cinfo_now;
94         Drd64_Marshald_ConnectInfo              *p_cinfo_marshald;
95         char                                                    str_sockname[256];
96         char    str_pid_debugd[10];
97         int             i_pid_debugd;
98
99
100         /* Phase 0 : Init ----------------------------*/
101         p_cinfo_now     = Drd64_Marshald_CInfo_AllocConnectInfo();
102         if( NULL == p_cinfo_now )
103                 { return 0x00; }
104
105         p_cinfo_marshald
106                 = Drd64_Marshald_GetConnectInfo( p_phead->i_connect_id );
107
108         /* Phase 1 : Generate Debugd Param -----------*/
109         /* n : socketname(PF_UNIX) */
110         strcpy( str_sockname, "/tmp/tmpdrd64debugd_XXXXXXXXXX" );
111         if( NULL == mktemp( str_sockname ))     { return 0x01; }
112         puts( mktemp(str_sockname) );
113
114
115         /* a : attach pid => p_attach->i_prog_pid */
116         snprintf( str_pid_debugd, 10, "%d", p_attach->i_prog_pid );
117
118         /* XXX c : coredump file */
119
120         puts("attach req : p1 ");
121
122         /* Phase 2 : Exec debugd ----------------------*/
123         i_pid_debugd    = fork();
124         /* fork error */
125         if( 0 > i_pid_debugd )  {
126                 return 0x02;
127         }
128         /* child Proc. */
129         else if( 0 == i_pid_debugd )    {
130                 /* XXX */
131                 execl("drd64_debugd", "drd64_debugd", "-n", str_sockname, "-a", str_pid_debugd, NULL );
132                 puts("debugd error");
133                 exit( 0 );
134         }
135
136         /* XXX : Polling form debugd-Initialized */
137
138         /* Phase 3 : Alloc & Set Connect Info. --------*/
139         puts("attach req : p2 ");
140
141         p_cinfo_now->i_dest_socket                      = -1;
142         p_cinfo_now->str_dest_addr_local[0]     = '\0';         // ***
143         Drd64_Server_INetAddr_SetInAddr_LocalHost(
144                                                         &(p_cinfo_now->t_dest_addr_inet) );
145         p_cinfo_now->i_dest_cinfo_id            = -1;
146
147         p_cinfo_now->i_src_socket                       = p_cinfo_marshald->i_src_socket;
148         Drd64_Server_INetAddr_CopyInAddr(
149                                 &(p_cinfo_now->t_src_addr_inet),
150                                 &(p_cinfo_marshald->t_client_addr_inet) );
151         p_cinfo_now->i_src_cinfo_id                     = p_phead->i_connect_id;
152
153         Drd64_Server_INetAddr_SetInAddr_LocalHost(
154                                                         &(p_cinfo_now->t_prog_addr_inet) );
155         Drd64_Server_INetAddr_CopyInAddr(
156                                 &(p_cinfo_now->t_prog_addr_inet),
157                                 &(p_attach->t_prog_addr) );
158         p_cinfo_now->i_prog_pid                         = p_attach->i_prog_pid;
159         p_cinfo_now->i_debugd_pid                       = i_pid_debugd;
160         Drd64_Server_INetAddr_CopyInAddr(
161                                 &(p_cinfo_now->t_client_addr_inet),
162                                 &(p_cinfo_marshald->t_client_addr_inet) );
163         p_cinfo_now->i_client_pid                       = p_cinfo_marshald->i_client_pid;
164
165
166         /* Phase 4 : Set Answer Packet Info. ---------*/
167 /*    p_connect->i_connect_id           = p_cinfo_now->i_cinfo_id;
168     p_connect->i_marshald_pid   = getpid();
169
170         i_wlen  = send( i_fds, (void *)p_phead, DRD64_PacketSize(p_phead), 0x00 );
171         
172         if( i_wlen != DRD64_PacketSize(p_phead) )       {
173                 return 0x00;
174         }
175 */
176         return 0x00;
177 }
178
179
180 int
181         Drd64_Marshald_Cmd_AttachRequest(
182                 int             i_fds,
183                 Drd64_PacketHeader      *p_phead,
184                 Drd64_PacketData_AttachRequest  *p_attachreq,
185                 Drd64_Marshald_MasterInformation        *p_marshald )
186 {
187         int                     i_wlen;
188         int                     i_err;
189         Drd64_Marshald_ConnectInfo              *p_cinfo;
190
191         puts("Attach start");
192         /* INet => Local */
193         if( DRD64_PACKETTYPE_TRANSPORT == p_phead->w_packettype )       {
194                 puts("Attach fromINet");
195                 Drd64_Marshald_Cmd_AttachRequest_fromINet(
196                                         i_fds, p_phead, p_attachreq, p_marshald );
197         }
198         else    {
199                 printf("%08x\n", p_attachreq->t_prog_addr );
200                 i_err   = Drd64_Server_INetAddr_CmpInAddr(
201                                                         &(p_attachreq->t_prog_addr),
202                                                         &(p_marshald->t_marshald_addr) );
203                 /* Local => Local : Boot Debugd */
204                 if( 0x00 == i_err )             {
205                         puts("Attach to Debugd");
206                         Drd64_Marshald_Cmd_AttachRequest_toDebugd(
207                                                 i_fds, p_phead, p_attachreq, p_marshald );
208                 }
209                 /* Local => INet marshald */
210                 else    {
211                         puts("Attach to INet");
212                         Drd64_Marshald_Cmd_AttachRequest_toINet(
213                                                 i_fds, p_phead, p_attachreq, p_marshald );
214                 }
215         }
216
217         
218         return 0x02;
219 }
220
221
222 /* EOF of drd64_.c ----------------------------------- */