OSDN Git Service

82f510eeeca294c811dcc7e019e1e58bc7a69ab9
[drdeamon64/drdeamon64.git] / deamon / drd64_marshald_send_connect.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 Drd64_Marshald_ConnectInfo *
41         Drd64_Marshald_SendCmd_Connect(
42                 struct  in_addr *p_addr_dest,
43                 int             i_recv_id )
44 {
45         int                                                     i_err;
46         int                                                     i_wlen;
47         int                                                     i_socket_inet;
48         Drd64_PacketHeader                      *p_phead;
49         Drd64_PacketData_Connect        *p_connect;
50         Drd64_Marshald_ConnectInfo      *p_cinfo;
51         Drd64_Server_RecvStatus         *p_recv;
52
53         DRD64_LOG_DEBUG("  [DEBUG]SEND: Connect Cmd (for INet-Marshald) Start");
54
55         /* Phase 1 : Check Exist Same-Connection */
56         p_cinfo = Drd64_Marshald_SearchINetConnection( p_addr_dest );
57         if( NULL != p_cinfo )   {
58                 p_cinfo->i_cinfo_refcount++;
59                 
60                 DRD64_LOG_DEBUG("  [DEBUG]SEND: Connect Cmd (for INet-Marshald) Exit");
61
62                 return  p_cinfo;
63         }
64
65         /* Phase 2 : Init & Set Packet Data ----------*/
66         p_cinfo = Drd64_Marshald_CInfo_AllocConnectInfo();
67         if( NULL == p_cinfo )   { return NULL; }
68
69         p_phead = (Drd64_PacketHeader *)gp_sendbuffer;
70         memset( gp_sendbuffer, 0x00, ( sizeof( Drd64_PacketHeader )
71                                                                 + sizeof( Drd64_PacketData_Connect ) ));
72
73         p_phead->w_header               = DRD64_PACKET_HEADER;
74         p_phead->i_cid_dest             = DRD64_CONNECTID_NONE;
75         p_phead->i_cid_src              = DRD64_CONNECTID_NONE;
76         p_phead->dw_command             = DRD64_COMMAND_CONNECT;
77         p_phead->w_packettype   = DRD64_PACKETTYPE_REQUEST;
78         p_phead->i_datalen              = sizeof( Drd64_PacketData_Connect );
79         p_phead->i_resume_recvstatus_id = i_recv_id;
80         p_phead->i_result               = 0x00;
81         p_phead->i_error                = 0x00;
82
83         p_connect
84                 = (Drd64_PacketData_Connect *)DRD64_PacketData( gp_sendbuffer );
85
86         p_connect->i_client_pid                 = getpid();
87         p_connect->i_client_cinfo_id    = p_cinfo->i_cinfo_id;
88         p_connect->i_connect_id                 = -1;
89         /* GOMI : i_err = Drd64_Server_INetAddr_SetInAddr_LocalHost(
90                                                                 &(p_connect->t_client_addr_inet) ); */
91         i_err   = Drd64_LibBrownie_INetAddr_SetInAddr_LocalHost(
92                                                                 &(p_connect->t_client_addr_inet) );
93         /* XXX : i_err Handling  */
94         
95
96         /* Phase 3 : Create INet-Marshald Socket ------*/
97         /* GOMI:        Drd64_Server_Socket_InitSocketClient_INet( */
98         i_socket_inet   =
99                 Drd64_LibBrownie_Socket_InitSocketClient_INet(
100                                                 p_addr_dest, DRD64_SOCKET_NETWORK_PORT ); 
101
102         p_recv = Drd64_Server_RecvStatus_AllocRecvStatus(
103                                         i_socket_inet, DRD64_MARSHALD_RECVSTATUS_UNITS );
104         if( NULL == p_recv )    { return NULL; }
105
106         Drd64_Marshald_Dispatch_SetFD( i_socket_inet );
107         //Drd64_Marshald_Dispatch_InitRecvStatus( p_recv );
108         Drd64_Server_RecvStatus_InitRecvStatus( p_recv );
109
110         /* Phase 4 : Send Packet to INet Marshald -----*/
111         i_wlen  = send( i_socket_inet, (void *)p_phead,
112                                                                 DRD64_PacketSize(p_phead), 0x00 );
113         DRD64_DEBUG_PRINT("send",i_wlen,"FD",i_socket_inet,"errno",errno);
114         if( i_wlen != DRD64_PacketSize(p_phead) )       {
115                 return NULL; 
116         } 
117
118         /* Phase 5 : Set Cinfo Data ------------------*/
119         p_cinfo->b_cinfo_type                   = DRD64_MARSHALD_CINFOTYPE_CLIENT;
120         p_cinfo->i_cinfo_refcount               = 1;
121
122         /* GOMI : Drd64_Server_INetAddr_CopyInAddr(
123                                                 &(p_cinfo->t_dest_addr_inet),
124                                                 p_addr_dest ); */
125         Drd64_LibBrownie_INetAddr_CopyInAddr(
126                                                 &(p_cinfo->t_dest_addr_inet),
127                                                 p_addr_dest );
128         /* p_cinfo->i_dest_cinfo_id             = p_connect->i_connect_id; 
129                                         (Set i_dest_cinfo_id when Connect-recv.) */
130         p_cinfo->str_dest_addr_local[0] = '\0';
131         p_cinfo->i_dest_socket                  = i_socket_inet;
132
133         /* p_cinfo->t_src_addr_inet             = NONE */
134         p_cinfo->i_src_cinfo_id                 = -1;
135         p_cinfo->i_src_socket                   = -1;
136
137         /* t_prog_addr_inet                     = NONE */
138         p_cinfo->i_prog_pid                             = -1;
139
140         p_cinfo->i_debugd_pid                   = -1;
141
142         /* GOMI : i_err = Drd64_Server_INetAddr_SetInAddr_LocalHost(
143                                                                 &(p_cinfo->t_client_addr_inet) ); */
144         i_err   = Drd64_LibBrownie_INetAddr_SetInAddr_LocalHost(
145                                                                 &(p_cinfo->t_client_addr_inet) );
146         p_cinfo->i_client_pid                   = getpid();
147
148
149         DRD64_LOG_DEBUG("  [DEBUG]SEND: Connect Cmd (for INet-Marshald) Ended");
150
151         return NULL;
152 }
153
154
155
156 /* EOF of drd64_.c ----------------------------------- */