Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TServerSocket.cxx
Go to the documentation of this file.
1// @(#)root/net:$Id$
2// Author: Fons Rademakers 18/12/96
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12//////////////////////////////////////////////////////////////////////////
13// //
14// TServerSocket //
15// //
16// This class implements server sockets. A server socket waits for //
17// requests to come in over the network. It performs some operation //
18// based on that request and then possibly returns a full duplex socket //
19// to the requester. The actual work is done via the TSystem class //
20// (either TUnixSystem or TWinNTSystem). //
21// //
22//////////////////////////////////////////////////////////////////////////
23
24#include "TServerSocket.h"
25#include "TSocket.h"
26#include "TSystem.h"
27#include "TROOT.h"
28#include "TError.h"
29#include <string>
30#include "TVirtualMutex.h"
31
32// Hook to server authentication wrapper
35
36// Defaul options for accept
38
40
42
43////////////////////////////////////////////////////////////////////////////////
44/// Kind of macro to parse input options
45/// Modify opt according to modifier mod.
46
47static void SetAuthOpt(UChar_t &opt, UChar_t mod)
48{
50
51 if (!mod) return;
52
53 if ((mod & kSrvAuth)) opt |= kSrvAuth;
54 if ((mod & kSrvNoAuth)) opt &= ~kSrvAuth;
55}
56
57////////////////////////////////////////////////////////////////////////////////
58/// Create a server socket object for a named service. Set reuse to true
59/// to force reuse of the server socket (i.e. do not wait for the time
60/// out to pass). Using backlog one can set the desirable queue length
61/// for pending connections.
62/// Use tcpwindowsize to specify the size of the receive buffer, it has
63/// to be specified here to make sure the window scale option is set (for
64/// tcpwindowsize > 65KB and for platforms supporting window scaling).
65/// The socketBindOption parameter allows to specify how the socket will be
66/// bound. See the documentation of ESocketBindOption for the details.
67/// Use IsValid() to check the validity of the
68/// server socket. In case server socket is not valid use GetErrorCode()
69/// to obtain the specific error value. These values are:
70/// 0 = no error (socket is valid)
71/// -1 = low level socket() call failed
72/// -2 = low level bind() call failed
73/// -3 = low level listen() call failed
74/// Every valid server socket is added to the TROOT sockets list which
75/// will make sure that any open sockets are properly closed on
76/// program termination.
77
80{
83
84 SetName("ServerSocket");
85
86 fSecContext = 0;
87 fSecContexts = new TList;
88
89 // If this is a local path, try announcing a UNIX socket service
93 service[0] == '/')) {
94#else
95 service[0] == '/' || (service[1] == ':' && service[2] == '/'))) {
96#endif
98 fService = "unix:";
101 if (fSocket >= 0) {
103 gROOT->GetListOfSockets()->Add(this);
104 }
105 } else {
106 // TCP / UDP socket
108 int port = gSystem->GetServiceByName(service);
109 if (port != -1) {
111 if (fSocket >= 0) {
113 gROOT->GetListOfSockets()->Add(this);
114 }
115 } else {
116 fSocket = -1;
117 }
118 }
119}
120
121////////////////////////////////////////////////////////////////////////////////
122/// Create a server socket object on a specified port. Set reuse to true
123/// to force reuse of the server socket (i.e. do not wait for the time
124/// out to pass). Using backlog one can set the desirable queue length
125/// for pending connections. If port is 0 a port scan will be done to
126/// find a free port. This option is mutual exlusive with the reuse option.
127/// Use tcpwindowsize to specify the size of the receive buffer, it has
128/// to be specified here to make sure the window scale option is set (for
129/// tcpwindowsize > 65KB and for platforms supporting window scaling).
130/// The socketBindOption parameter allows to specify how the socket will be
131/// bound. See the documentation of ESocketBindOption for the details.
132/// Use IsValid() to check the validity of the
133/// server socket. In case server socket is not valid use GetErrorCode()
134/// to obtain the specific error value. These values are:
135/// 0 = no error (socket is valid)
136/// -1 = low level socket() call failed
137/// -2 = low level bind() call failed
138/// -3 = low level listen() call failed
139/// Every valid server socket is added to the TROOT sockets list which
140/// will make sure that any open sockets are properly closed on
141/// program termination.
142
145{
148
149 SetName("ServerSocket");
150
151 fSecContext = 0;
152 fSecContexts = new TList;
155
157 if (fSocket >= 0) {
159 gROOT->GetListOfSockets()->Add(this);
160 }
161}
162
163////////////////////////////////////////////////////////////////////////////////
164/// Destructor: cleanup authentication stuff (if any) and close
165
167{
169 if (fSecContexts) {
170 if (fgSrvAuthClupHook) {
171 // Cleanup the security contexts
172 (*fgSrvAuthClupHook)(fSecContexts);
173 }
174 // Remove the list
177 fSecContexts = 0;
178 }
179
180 Close();
181}
182
183////////////////////////////////////////////////////////////////////////////////
184/// Accept a connection on a server socket. Returns a full-duplex
185/// communication TSocket object. If no pending connections are
186/// present on the queue and nonblocking mode has not been enabled
187/// with SetOption(kNoBlock,1) the call blocks until a connection is
188/// present. The returned socket must be deleted by the user. The socket
189/// is also added to the TROOT sockets list which will make sure that
190/// any open sockets are properly closed on program termination.
191/// In case of error 0 is returned and in case non-blocking I/O is
192/// enabled and no connections are available -1 is returned.
193///
194/// The opt can be used to require client authentication; valid options are
195///
196/// kSrvAuth = require client authentication
197/// kSrvNoAuth = force no client authentication
198///
199/// Example: use Opt = kSrvAuth to require client authentication.
200///
201/// Default options are taken from fgAcceptOpt and are initially
202/// equivalent to kSrvNoAuth; they can be changed with the static
203/// method TServerSocket::SetAcceptOptions(Opt).
204/// The active defaults can be visualized using the static method
205/// TServerSocket::ShowAcceptOptions().
206///
207
209{
210 if (fSocket == -1) { return 0; }
211
212 TSocket *socket = new TSocket;
213
215 if (soc == -1) { delete socket; return 0; }
216 if (soc == -2) { delete socket; return (TSocket*) -1; }
217
218 // Parse Opt
220 SetAuthOpt(acceptOpt, opt);
222
223 socket->fSocket = soc;
224 socket->fSecContext = 0;
225 socket->fService = fService;
227 socket->fAddress = gSystem->GetPeerName(socket->fSocket);
228 if (socket->fSocket >= 0) {
230 gROOT->GetListOfSockets()->Add(socket);
231 }
232
233 // Perform authentication, if required
234 if (auth) {
235 if (!Authenticate(socket)) {
236 delete socket;
237 socket = 0;
238 }
239 }
240
241 return socket;
242}
243
244////////////////////////////////////////////////////////////////////////////////
245/// Return internet address of host to which the server socket is bound,
246/// i.e. the local host. In case of error TInetAddress::IsValid() returns
247/// kFALSE.
248
250{
251 if (fSocket != -1) {
252 if (fAddress.GetPort() == -1)
254 return fAddress;
255 }
256 return TInetAddress();
257}
258
259////////////////////////////////////////////////////////////////////////////////
260/// Get port # to which server socket is bound. In case of error returns -1.
261
263{
264 if (fSocket != -1) {
265 if (fAddress.GetPort() == -1)
267 return fAddress.GetPort();
268 }
269 return -1;
270}
271
272
273////////////////////////////////////////////////////////////////////////////////
274/// Return default options for Accept
275
280
281////////////////////////////////////////////////////////////////////////////////
282/// Set default options for Accept according to modifier 'mod'.
283/// Use:
284/// kSrvAuth require client authentication
285/// kSrvNoAuth do not require client authentication
286
291
292////////////////////////////////////////////////////////////////////////////////
293/// Print default options for Accept.
294
296{
297 ::Info("ShowAcceptOptions", "Use authentication: %s", (fgAcceptOpt & kSrvAuth) ? "yes" : "no");
298}
299
300////////////////////////////////////////////////////////////////////////////////
301/// Check authentication request from the client on new
302/// open connection
303
305{
306 if (!fgSrvAuthHook) {
308
309 // Load libraries needed for (server) authentication ...
310 TString srvlib = "libSrvAuth";
311 char *p = 0;
312 // The generic one
313 if ((p = gSystem->DynamicPathName(srvlib, kTRUE))) {
314 delete[] p;
315 if (gSystem->Load(srvlib) == -1) {
316 Error("Authenticate", "can't load %s",srvlib.Data());
317 return kFALSE;
318 }
319 } else {
320 Error("Authenticate", "can't locate %s",srvlib.Data());
321 return kFALSE;
322 }
323 //
324 // Locate SrvAuthenticate
325 Func_t f = gSystem->DynFindSymbol(srvlib,"SrvAuthenticate");
326 if (f)
328 else {
329 Error("Authenticate", "can't find SrvAuthenticate");
330 return kFALSE;
331 }
332 //
333 // Locate SrvAuthCleanup
334 f = gSystem->DynFindSymbol(srvlib,"SrvAuthCleanup");
335 if (f)
337 else {
338 Warning("Authenticate", "can't find SrvAuthCleanup");
339 }
340 }
341
343 if (!confdir.Length()) {
344 Error("Authenticate", "config dir undefined");
345 return kFALSE;
346 }
347
348 // dir for temporary files
351 tmpdir = TString("/tmp");
352
353 // Get Host name
355 if (gDebug > 2)
356 Info("Authenticate","OpenHost = %s", openhost.Data());
357
358 // Run Authentication now
359 std::string user;
360 Int_t meth = -1;
361 Int_t auth = 0;
362 Int_t type = 0;
363 std::string ctkn = "";
364 if (fgSrvAuthHook)
365 auth = (*fgSrvAuthHook)(sock, confdir, tmpdir, user,
367
368 if (gDebug > 2)
369 Info("Authenticate","auth = %d, type= %d, ctkn= %s",
370 auth, type, ctkn.c_str());
371
372 return auth;
373}
#define SafeDelete(p)
Definition RConfig.hxx:541
#define f(i)
Definition RSha256.hxx:104
bool Bool_t
Definition RtypesCore.h:63
unsigned char UChar_t
Definition RtypesCore.h:38
constexpr Bool_t kFALSE
Definition RtypesCore.h:94
constexpr Bool_t kTRUE
Definition RtypesCore.h:93
#define ClassImp(name)
Definition Rtypes.h:374
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Definition TError.h:125
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Int_t gDebug
Definition TROOT.cxx:597
R__EXTERN TVirtualMutex * gROOTMutex
Definition TROOT.h:63
#define gROOT
Definition TROOT.h:406
static void SetAuthOpt(UChar_t &opt, UChar_t mod)
Kind of macro to parse input options Modify opt according to modifier mod.
TVirtualMutex * gSrvAuthenticateMutex
Int_t(* SrvClup_t)(TSeqCollection *)
const UChar_t kSrvNoAuth
const UChar_t kSrvAuth
Int_t(* SrvAuth_t)(TSocket *sock, const char *, const char *, std::string &, Int_t &, Int_t &, std::string &, TSeqCollection *)
void(* Func_t)()
Definition TSystem.h:249
@ kWritePermission
Definition TSystem.h:54
ESocketBindOption
Options for binging the sockets created.
Definition TSystem.h:46
@ kInaddrLoopback
Refers to the local host via the loopback device.
Definition TSystem.h:48
R__EXTERN TSystem * gSystem
Definition TSystem.h:572
#define R__LOCKGUARD2(mutex)
#define R__LOCKGUARD(mutex)
void Delete(Option_t *option="") override=0
Delete this object.
This class represents an Internet Protocol (IP) address.
Int_t GetPort() const
const char * GetHostName() const
A doubly linked list.
Definition TList.h:38
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition TNamed.cxx:174
virtual void SetName(const char *name)
Set the name of the TNamed.
Definition TNamed.cxx:150
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition TObject.h:201
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:1006
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:813
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:1020
void ResetBit(UInt_t f)
Definition TObject.h:200
static const TString & GetRootSys()
Get the rootsys directory in the installation. Static utility function.
Definition TROOT.cxx:2983
static SrvAuth_t fgSrvAuthHook
static UChar_t fgAcceptOpt
static void SetAcceptOptions(UChar_t Opt)
Set default options for Accept according to modifier 'mod'.
Bool_t Authenticate(TSocket *)
Check authentication request from the client on new open connection.
Int_t GetLocalPort() override
Get port # to which server socket is bound. In case of error returns -1.
static SrvClup_t fgSrvAuthClupHook
virtual ~TServerSocket()
Destructor: cleanup authentication stuff (if any) and close.
static void ShowAcceptOptions()
Print default options for Accept.
static UChar_t GetAcceptOptions()
Return default options for Accept.
virtual TSocket * Accept(UChar_t Opt=0)
Accept a connection on a server socket.
TInetAddress GetLocalInetAddress() override
Return internet address of host to which the server socket is bound, i.e.
TSeqCollection * fSecContexts
TInetAddress fAddress
Definition TSocket.h:59
Int_t fSocket
Definition TSocket.h:69
TSocket()
Definition TSocket.h:83
TString fService
Definition TSocket.h:67
@ kIsUnix
Definition TSocket.h:48
virtual void Close(Option_t *opt="")
Close the socket.
Definition TSocket.cxx:389
TInetAddress GetInetAddress() const
Definition TSocket.h:113
TSecContext * fSecContext
Definition TSocket.h:65
Basic string class.
Definition TString.h:139
virtual int GetServiceByName(const char *service)
Get port # of internet service.
Definition TSystem.cxx:2318
virtual TInetAddress GetSockName(int sock)
Get Internet Protocol (IP) address of host and port #.
Definition TSystem.cxx:2309
virtual Func_t DynFindSymbol(const char *module, const char *entry)
Find specific entry point in specified library.
Definition TSystem.cxx:2044
virtual char * GetServiceByPort(int port)
Get name of internet service.
Definition TSystem.cxx:2327
virtual int AcceptConnection(int sock)
Accept a connection.
Definition TSystem.cxx:2381
virtual TInetAddress GetPeerName(int sock)
Get Internet Protocol (IP) address of remote host and port #.
Definition TSystem.cxx:2300
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
Definition TSystem.cxx:1857
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
Definition TSystem.cxx:1296
virtual int AnnounceUnixService(int port, int backlog)
Announce unix domain service.
Definition TSystem.cxx:2363
virtual int AnnounceTcpService(int port, Bool_t reuse, int backlog, int tcpwindowsize=-1, ESocketBindOption socketBindOption=ESocketBindOption::kInaddrAny)
Announce TCP/IP service.
Definition TSystem.cxx:2345
virtual const char * TempDirectory() const
Return a user configured or systemwide directory to create temporary files in.
Definition TSystem.cxx:1482
char * DynamicPathName(const char *lib, Bool_t quiet=kFALSE)
Find a dynamic library called lib using the system search paths.
Definition TSystem.cxx:2020
This class implements a mutex interface.
std::ostream & Info()
Definition hadd.cxx:171