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\file TServerSocket.cxx
14\class TServerSocket
15\brief This class implements server sockets.
16\note This class deals with sockets: the user is entirely responsible for the security of their usage, for example, but
17not limited to, the management of the connections to said sockets.
18
19This class implements server sockets. A server socket waits for
20requests to come in over the network. It performs some operation
21based on that request and then possibly returns a full duplex socket
22to the requester. The actual work is done via the TSystem class
23(either TUnixSystem or TWinNTSystem).
24
25**/
26
27
28#include "TServerSocket.h"
29#include "TSocket.h"
30#include "TSystem.h"
31#include "TROOT.h"
32#include "TError.h"
33#include <string>
34#include "TVirtualMutex.h"
35
36// Hook to server authentication wrapper
39
40// Defaul options for accept
42
44
45
46////////////////////////////////////////////////////////////////////////////////
47/// Kind of macro to parse input options
48/// Modify opt according to modifier mod.
49
50static void SetAuthOpt(UChar_t &opt, UChar_t mod)
51{
53
54 if (!mod) return;
55
56 if ((mod & kSrvAuth)) opt |= kSrvAuth;
57 if ((mod & kSrvNoAuth)) opt &= ~kSrvAuth;
58}
59
60////////////////////////////////////////////////////////////////////////////////
61/// Create a server socket object for a named service. Set reuse to true
62/// to force reuse of the server socket (i.e. do not wait for the time
63/// out to pass). Using backlog one can set the desirable queue length
64/// for pending connections.
65/// Use tcpwindowsize to specify the size of the receive buffer, it has
66/// to be specified here to make sure the window scale option is set (for
67/// tcpwindowsize > 65KB and for platforms supporting window scaling).
68/// The socketBindOption parameter allows to specify how the socket will be
69/// bound. See the documentation of ESocketBindOption for the details.
70/// Use IsValid() to check the validity of the
71/// server socket. In case server socket is not valid use GetErrorCode()
72/// to obtain the specific error value. These values are:
73/// 0 = no error (socket is valid)
74/// -1 = low level socket() call failed
75/// -2 = low level bind() call failed
76/// -3 = low level listen() call failed
77/// Every valid server socket is added to the TROOT sockets list which
78/// will make sure that any open sockets are properly closed on
79/// program termination.
80
83{
86
87 SetName("ServerSocket");
88
89 fSecContext = 0;
90 fSecContexts = new TList;
91
92 // If this is a local path, try announcing a UNIX socket service
96 service[0] == '/')) {
97#else
98 service[0] == '/' || (service[1] == ':' && service[2] == '/'))) {
99#endif
101 fService = "unix:";
102 fService += service;
104 if (fSocket >= 0) {
106 gROOT->GetListOfSockets()->Add(this);
107 }
108 } else {
109 // TCP / UDP socket
111 int port = gSystem->GetServiceByName(service);
112 if (port != -1) {
114 if (fSocket >= 0) {
116 gROOT->GetListOfSockets()->Add(this);
117 }
118 } else {
119 fSocket = -1;
120 }
121 }
122}
123
124////////////////////////////////////////////////////////////////////////////////
125/// Create a server socket object on a specified port. Set reuse to true
126/// to force reuse of the server socket (i.e. do not wait for the time
127/// out to pass). Using backlog one can set the desirable queue length
128/// for pending connections. If port is 0 a port scan will be done to
129/// find a free port. This option is mutual exlusive with the reuse option.
130/// Use tcpwindowsize to specify the size of the receive buffer, it has
131/// to be specified here to make sure the window scale option is set (for
132/// tcpwindowsize > 65KB and for platforms supporting window scaling).
133/// The socketBindOption parameter allows to specify how the socket will be
134/// bound. See the documentation of ESocketBindOption for the details.
135/// Use IsValid() to check the validity of the
136/// server socket. In case server socket is not valid use GetErrorCode()
137/// to obtain the specific error value. These values are:
138/// 0 = no error (socket is valid)
139/// -1 = low level socket() call failed
140/// -2 = low level bind() call failed
141/// -3 = low level listen() call failed
142/// Every valid server socket is added to the TROOT sockets list which
143/// will make sure that any open sockets are properly closed on
144/// program termination.
145
148{
151
152 SetName("ServerSocket");
153
154 fSecContext = 0;
155 fSecContexts = new TList;
158
160 if (fSocket >= 0) {
162 gROOT->GetListOfSockets()->Add(this);
163 }
164}
165
166////////////////////////////////////////////////////////////////////////////////
167/// Destructor: cleanup authentication stuff (if any) and close
168
170{
172 if (fSecContexts) {
173 if (fgSrvAuthClupHook) {
174 // Cleanup the security contexts
175 (*fgSrvAuthClupHook)(fSecContexts);
176 }
177 // Remove the list
180 fSecContexts = 0;
181 }
182
183 Close();
184}
185
186////////////////////////////////////////////////////////////////////////////////
187/// Accept a connection on a server socket. Returns a full-duplex
188/// communication TSocket object. If no pending connections are
189/// present on the queue and nonblocking mode has not been enabled
190/// with SetOption(kNoBlock,1) the call blocks until a connection is
191/// present. The returned socket must be deleted by the user. The socket
192/// is also added to the TROOT sockets list which will make sure that
193/// any open sockets are properly closed on program termination.
194/// In case of error 0 is returned and in case non-blocking I/O is
195/// enabled and no connections are available -1 is returned.
196///
197/// The opt can be used to require client authentication; valid options are
198///
199/// kSrvAuth = require client authentication
200/// kSrvNoAuth = force no client authentication
201///
202/// Example: use Opt = kSrvAuth to require client authentication.
203///
204/// Default options are taken from fgAcceptOpt and are initially
205/// equivalent to kSrvNoAuth; they can be changed with the static
206/// method TServerSocket::SetAcceptOptions(Opt).
207/// The active defaults can be visualized using the static method
208/// TServerSocket::ShowAcceptOptions().
209///
210
212{
213 if (fSocket == -1) { return 0; }
214
215 TSocket *socket = new TSocket;
216
218 if (soc == -1) { delete socket; return 0; }
219 if (soc == -2) { delete socket; return (TSocket*) -1; }
220
221 // Parse Opt
223 SetAuthOpt(acceptOpt, opt);
225
226 socket->fSocket = soc;
227 socket->fSecContext = 0;
228 socket->fService = fService;
230 socket->fAddress = gSystem->GetPeerName(socket->fSocket);
231 if (socket->fSocket >= 0) {
233 gROOT->GetListOfSockets()->Add(socket);
234 }
235
236 // Perform authentication, if required
237 if (auth) {
238 if (!Authenticate(socket)) {
239 delete socket;
240 socket = 0;
241 }
242 }
243
244 return socket;
245}
246
247////////////////////////////////////////////////////////////////////////////////
248/// Return internet address of host to which the server socket is bound,
249/// i.e. the local host. In case of error TInetAddress::IsValid() returns
250/// kFALSE.
251
253{
254 if (fSocket != -1) {
255 if (fAddress.GetPort() == -1)
257 return fAddress;
258 }
259 return TInetAddress();
260}
261
262////////////////////////////////////////////////////////////////////////////////
263/// Get port # to which server socket is bound. In case of error returns -1.
264
266{
267 if (fSocket != -1) {
268 if (fAddress.GetPort() == -1)
270 return fAddress.GetPort();
271 }
272 return -1;
273}
274
275
276////////////////////////////////////////////////////////////////////////////////
277/// Return default options for Accept
278
283
284////////////////////////////////////////////////////////////////////////////////
285/// Set default options for Accept according to modifier 'mod'.
286/// Use:
287/// kSrvAuth require client authentication
288/// kSrvNoAuth do not require client authentication
289
294
295////////////////////////////////////////////////////////////////////////////////
296/// Print default options for Accept.
297
299{
300 ::Info("ShowAcceptOptions", "Use authentication: %s", (fgAcceptOpt & kSrvAuth) ? "yes" : "no");
301}
302
303////////////////////////////////////////////////////////////////////////////////
304/// Check authentication request from the client on new
305/// open connection
306
308{
309 if (!fgSrvAuthHook) {
311
312 // Load libraries needed for (server) authentication ...
313 TString srvlib = "libSrvAuth";
314 char *p = 0;
315 // The generic one
316 if ((p = gSystem->DynamicPathName(srvlib, kTRUE))) {
317 delete[] p;
318 if (gSystem->Load(srvlib) == -1) {
319 Error("Authenticate", "can't load %s",srvlib.Data());
320 return kFALSE;
321 }
322 } else {
323 Error("Authenticate", "can't locate %s",srvlib.Data());
324 return kFALSE;
325 }
326 //
327 // Locate SrvAuthenticate
328 Func_t f = gSystem->DynFindSymbol(srvlib,"SrvAuthenticate");
329 if (f)
331 else {
332 Error("Authenticate", "can't find SrvAuthenticate");
333 return kFALSE;
334 }
335 //
336 // Locate SrvAuthCleanup
337 f = gSystem->DynFindSymbol(srvlib,"SrvAuthCleanup");
338 if (f)
340 else {
341 Warning("Authenticate", "can't find SrvAuthCleanup");
342 }
343 }
344
346 if (!confdir.Length()) {
347 Error("Authenticate", "config dir undefined");
348 return kFALSE;
349 }
350
351 // dir for temporary files
354 tmpdir = TString("/tmp");
355
356 // Get Host name
358 if (gDebug > 2)
359 Info("Authenticate","OpenHost = %s", openhost.Data());
360
361 // Run Authentication now
362 std::string user;
363 Int_t meth = -1;
364 Int_t auth = 0;
365 Int_t type = 0;
366 std::string ctkn = "";
367 if (fgSrvAuthHook)
368 auth = (*fgSrvAuthHook)(sock, confdir, tmpdir, user,
370
371 if (gDebug > 2)
372 Info("Authenticate","auth = %d, type= %d, ctkn= %s",
373 auth, type, ctkn.c_str());
374
375 return auth;
376}
#define SafeDelete(p)
Definition RConfig.hxx:531
#define f(i)
Definition RSha256.hxx:104
bool Bool_t
Boolean (0=false, 1=true) (bool)
Definition RtypesCore.h:77
unsigned char UChar_t
Unsigned Character 1 byte (unsigned char)
Definition RtypesCore.h:52
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
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
Global variable setting the debug level. Set to 0 to disable, increase it in steps of 1 to increase t...
Definition TROOT.cxx:627
R__EXTERN TVirtualMutex * gROOTMutex
Definition TROOT.h:63
#define gROOT
Definition TROOT.h:414
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:582
#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:173
virtual void SetName(const char *name)
Set the name of the TNamed.
Definition TNamed.cxx:149
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition TObject.h:204
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:1081
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:885
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:1095
void ResetBit(UInt_t f)
Definition TObject.h:203
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Definition TObject.cxx:1069
static const TString & GetRootSys()
Get the rootsys directory in the installation. Static utility function.
Definition TROOT.cxx:2993
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
This class implements client sockets.
Definition TSocket.h:41
TInetAddress fAddress
Definition TSocket.h:65
Int_t fSocket
Definition TSocket.h:75
TSocket()
Definition TSocket.h:89
TString fService
Definition TSocket.h:73
@ kIsUnix
Definition TSocket.h:46
virtual void Close(Option_t *opt="")
Close the socket.
Definition TSocket.cxx:382
TInetAddress GetInetAddress() const
Definition TSocket.h:119
TSecContext * fSecContext
Definition TSocket.h:71
Basic string class.
Definition TString.h:138
virtual int GetServiceByName(const char *service)
Get port # of internet service.
Definition TSystem.cxx:2329
virtual TInetAddress GetSockName(int sock)
Get Internet Protocol (IP) address of host and port #.
Definition TSystem.cxx:2320
virtual Func_t DynFindSymbol(const char *module, const char *entry)
Find specific entry point in specified library.
Definition TSystem.cxx:2055
virtual char * GetServiceByPort(int port)
Get name of internet service.
Definition TSystem.cxx:2338
virtual int AcceptConnection(int sock)
Accept a connection.
Definition TSystem.cxx:2392
virtual TInetAddress GetPeerName(int sock)
Get Internet Protocol (IP) address of remote host and port #.
Definition TSystem.cxx:2311
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
Definition TSystem.cxx:1868
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:1307
virtual int AnnounceUnixService(int port, int backlog)
Announce unix domain service.
Definition TSystem.cxx:2374
virtual int AnnounceTcpService(int port, Bool_t reuse, int backlog, int tcpwindowsize=-1, ESocketBindOption socketBindOption=ESocketBindOption::kInaddrAny)
Announce TCP/IP service.
Definition TSystem.cxx:2356
virtual const char * TempDirectory() const
Return a user configured or systemwide directory to create temporary files in.
Definition TSystem.cxx:1493
char * DynamicPathName(const char *lib, Bool_t quiet=kFALSE)
Find a dynamic library called lib using the system search paths.
Definition TSystem.cxx:2031
This class implements a mutex interface.