1 : //=============================================================================
2 : // File <$/src/cpp/prod/CORBA/YAServerOrb.cpp>
3 : // This file is part of YaOrb : Yet Another Object Request Broker,
4 : // Copyright (c) 2000-2003, Marc Alff.
5 : //
6 : // This program is free software; you can redistribute it and/or
7 : // modify it under the terms of the GNU General Public License
8 : // as published by the Free Software Foundation; either version 2
9 : // of the License, or (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program; if not, write to the Free Software
18 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 : //
20 : //=============================================================================
21 :
22 : // Portability
23 : #include "yaorb/config.h"
24 : #include "src/cpp/prod/port/port_time.h"
25 : #include "src/cpp/prod/port/port_stdc.h"
26 : #include "src/cpp/prod/port/port_socket.h"
27 : #include "src/cpp/prod/port/port_unistd.h"
28 :
29 : #include <sys/types.h>
30 : #include <sys/select.h>
31 : #include <sys/un.h>
32 : #include <rpc/types.h>
33 : #include <stdio.h>
34 :
35 : #include <yaorb/CORBA.h>
36 :
37 : #include "src/cpp/prod/CORBA/YAServerOrb.h"
38 : #include "src/cpp/prod/CORBA/YAConnection.h"
39 : #include "src/cpp/prod/boot/boot.h"
40 : #include "src/cpp/prod/tool/DEVELOPMENT.h"
41 : #include "src/cpp/prod/tool/Assert.h"
42 : #include "src/cpp/prod/protocol/iop/iop.h"
43 : #include "src/cpp/prod/protocol/cdr/cdr_memory.h"
44 :
45 : // Max number of pending connect request on the _listning socket.
46 : const int NUMBER_OF_CONNECTIONS = 5 ;
47 :
48 : //==============================================================================
49 : // SERVICES
50 : //==============================================================================
51 : #define SERVICE_ROOT_POA (const char*)"RootPOA"
52 : #define SERVICE_POA_CURRENT (const char*)"POACurrent"
53 : #define SERVICE_INTERFACE_REPOSITORY (const char*)"InterfaceRepository"
54 : #define SERVICE_NAME_SERVICE (const char*)"NameService"
55 : #define SERVICE_TRADING_SERVICE (const char*)"TradingService"
56 : #define SERVICE_SECURITY_CURRENT (const char*)"SecurityCurrent"
57 : #define SERVICE_TRANSACTION_CURRENT (const char*)"TransactionCurrent"
58 : #define SERVICE_DYN_ANY_FACTORY (const char*)"DynAnyFactory"
59 :
60 : //==============================================================================
61 : // YAServerORB.
62 : //==============================================================================
63 :
64 3 : YAServerOrb::YAServerOrb(const String & confFileName)
65 : : YAOrb(confFileName),
66 : _listningSocket(0),
67 : _listningPort(0),
68 3 : _rootPOA(NULL)
69 : {
70 : int rc ;
71 : int port ;
72 :
73 : CORBA::Boolean brc ;
74 3 : String portString ;
75 3 : brc = readConf("SERVER", "PORT", portString) ;
76 3 : if (brc == TRUE)
77 : {
78 0 : port = atoi(portString) ;
79 : }
80 : else
81 : {
82 : port = 1200 ; // default
83 : }
84 :
85 3 : _listningPort = port ;
86 :
87 : #ifdef LATER
88 : _listningSocket = socket(AF_INET, SOCK_STREAM, 0) ;
89 :
90 : struct sockaddr_in server ;
91 : server.sin_family = AF_INET ;
92 : server.sin_port = _listningPort ;
93 : server.sin_addr.s_addr = ntohl(INADDR_ANY) ;
94 : #else
95 3 : NON_DEV("Using UNIX sockets instead of INET") ;
96 : char buff[80] ;
97 3 : sprintf(buff, "/tmp/port%d", port) ;
98 :
99 3 : _listningSocket = socket(AF_LOCAL, SOCK_STREAM, 0) ;
100 :
101 : struct sockaddr_un server ;
102 3 : server.sun_family = AF_LOCAL ;
103 3 : strcpy(server.sun_path, buff);
104 : #endif
105 :
106 : rc = bind(_listningSocket,
107 : (struct sockaddr*) & server,
108 3 : sizeof(server)) ;
109 3 : if (rc<0)
110 : {
111 1 : perror("bind") ;
112 1 : throw CORBA::COMM_FAILURE() ;
113 : }
114 :
115 2 : rc = listen(_listningSocket, NUMBER_OF_CONNECTIONS) ;
116 2 : if (rc<0)
117 : {
118 0 : perror("listen") ;
119 0 : throw CORBA::COMM_FAILURE() ;
120 : }
121 :
122 2 : YAORB::SkelMgr::RegisterAll() ;
123 4 : _rootPOA = new PortableServer::POA() ;
124 1 : }
125 :
126 0 : YAServerOrb::~YAServerOrb()
127 : {
128 : int rc ;
129 :
130 0 : rc = close(_listningSocket) ;
131 0 : if (rc != 0)
132 : {
133 0 : perror("close") ;
134 : }
135 :
136 : /* tmp -- begin */
137 0 : NON_DEV("Using UNIX sockets instead of INET") ;
138 : char buff[80] ;
139 0 : sprintf(buff, "/tmp/port%d", _listningPort) ;
140 0 : rc = unlink(buff) ;
141 :
142 0 : if (rc != 0)
143 : {
144 0 : perror("unlink") ;
145 : }
146 : /* tmp -- end */
147 :
148 0 : }
149 :
150 : const CORBA::ORB::ObjectIdList&
151 1 : YAServerOrb::listInitialServices(void) const
152 : {
153 2 : static CORBA::String_var data[8] ;
154 :
155 1 : data[0] = SERVICE_ROOT_POA ;
156 1 : data[1] = SERVICE_POA_CURRENT ;
157 1 : data[2] = SERVICE_INTERFACE_REPOSITORY ;
158 1 : data[3] = SERVICE_NAME_SERVICE ;
159 1 : data[4] = SERVICE_TRADING_SERVICE ;
160 1 : data[5] = SERVICE_SECURITY_CURRENT ;
161 1 : data[6] = SERVICE_TRANSACTION_CURRENT ;
162 1 : data[7] = SERVICE_DYN_ANY_FACTORY ;
163 :
164 3 : static CORBA::ORB::ObjectIdList services(8, 8, data, false) ;
165 :
166 : return services ;
167 : }
168 :
169 : CORBA::Object_ptr
170 : YAServerOrb::resolveInitialReferences(
171 3 : const char * id)
172 : {
173 : CORBA::Object_ptr ref = NULL ;
174 3 : String tmp(id) ;
175 :
176 3 : if (tmp == SERVICE_ROOT_POA)
177 : {
178 2 : NON_DEV("awful cast") ;
179 : PortableServer::POA *root = _rootPOA ;
180 2 : ref = (CORBA::Object_ptr) root ;
181 : }
182 1 : else if (tmp == SERVICE_POA_CURRENT)
183 : {
184 0 : NON_DEV("SERVICE_POA_CURRENT") ;
185 : }
186 : else
187 : {
188 1 : NON_DEV("SERVICE") ;
189 : }
190 :
191 3 : return ref ;
192 : }
193 :
194 : CORBA::Boolean
195 0 : YAServerOrb::IsLocalIOR(IOP::IOR & ior)
196 : {
197 0 : NON_DEV("IsLocalIOR") ;
198 : return FALSE ;
199 : }
200 :
201 : CORBA::Object_ptr
202 0 : YAServerOrb::ResolveLocalIOR(IOP::IOR & ior)
203 : {
204 0 : NON_DEV("ResolveLocalIOR") ;
205 0 : return CORBA::Object::_nil() ;
206 : }
207 :
|