Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
THostAuth.cxx
Go to the documentation of this file.
1// @(#)root/auth:$Id$
2// Author: G. Ganis 19/03/2003
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// THostAuth //
15// //
16// Contains details about host-specific authentication methods and the //
17// result of their application. //
18// Used by TAuthenticate. //
19// //
20//////////////////////////////////////////////////////////////////////////
21
22#include "RConfigure.h"
23#include "TSystem.h"
24#include "THostAuth.h"
25#include "TRootSecContext.h"
26#include "TAuthenticate.h"
27#include "TSocket.h"
28#include "TUrl.h"
29#include <stdlib.h>
30
31
33
34////////////////////////////////////////////////////////////////////////////////
35/// Default constructor.
36
38{
39 Create(0, 0);
40}
41
42////////////////////////////////////////////////////////////////////////////////
43/// Create hostauth object.
44/// 'host' may contain also the server for whicb these directives
45/// are valid in the form 'host:server' or 'server://host'
46/// with server either "sock[d]", "root[d]" or
47/// 0, 1, respectively.
48
49THostAuth::THostAuth(const char *host, const char *user, Int_t nmeth,
50 Int_t *authmeth, char **details) : TObject()
51{
52 Create(host, user, nmeth, authmeth, details);
53}
54
55////////////////////////////////////////////////////////////////////////////////
56/// Create hostauth object.
57/// 'host' may contain also the server for whicb these directives
58/// are valid in the form 'host:server' or 'server://host'
59/// with server either "sock[d]", "root[d]" or
60/// 0, 1, respectively.
61
62THostAuth::THostAuth(const char *host, Int_t server, const char *user,
64{
65 Create(host, user, nmeth, authmeth, details);
66
68}
69
70////////////////////////////////////////////////////////////////////////////////
71/// Create hostauth object with one method only.
72/// 'host' may contain also the server for whicb these directives
73/// are valid in the form 'host:server' or 'server://host'
74
75THostAuth::THostAuth(const char *host, const char *user, Int_t authmeth,
76 const char *details) : TObject()
77{
78 Create(host, user, 1, &authmeth, (char **)&details);
79}
80
81////////////////////////////////////////////////////////////////////////////////
82/// Create hostauth object with one method only.
83/// 'host' may contain also the server for whicb these directives
84/// are valid in the form 'host:server' or 'server://host'
85
86THostAuth::THostAuth(const char *host, Int_t server, const char *user,
87 Int_t authmeth, const char *details) : TObject()
88{
89 Create(host, user, 1, &authmeth, (char **)&details);
91}
92
93////////////////////////////////////////////////////////////////////////////////
94/// Create hostauth object.
95/// 'host' may contain also the server for whicb these directives
96/// are valid in the form 'host:server' or 'server://host'
97/// with server either "sock[d]", "root[d]" or
98/// 0, 1, respectively.
99
100void THostAuth::Create(const char *host, const char *user, Int_t nmeth,
101 Int_t *authmeth, char **details)
102{
103 int i;
104
105 // Host
106 fHost = host;
107
108 fServer = -1;
109 // Extract server, if given
110 TString srv("");
111 if (fHost.Contains(":")) {
112 // .rootauthrc form: host:server
113 srv = fHost;
114 fHost.Remove(fHost.Index(":"));
115 srv.Remove(0,srv.Index(":")+1);
116 } else if (fHost.Contains("://")) {
117 // Url form: server://host
119 fHost.Remove(0,fHost.Index("://")+3);
120 }
121 if (srv.Length()) {
122 if (srv == "0" || srv.BeginsWith("sock"))
124 else if (srv == "1" || srv.BeginsWith("root"))
126 }
127
128 // Check and save the host FQDN ...
129 if (fHost != "default" && !fHost.Contains("*")) {
131 if (addr.IsValid())
132 fHost = addr.GetHostName();
133 }
134
135 // User
136 fUser = user;
137 if (fUser == "")
138 fUser = gSystem->Getenv("USER");
139 if (fUser == "") {
141 if (u)
142 fUser = u->fUser;
143 delete u;
144 }
145
146 // Methods indexes
148 if (fNumMethods > 0) {
149 if (!authmeth)
150 fNumMethods = 0;
151 for (i = 0; i < kMAXSEC; i++) {
152 if (i < fNumMethods) {
153 fMethods[i] = authmeth[i];
154 fSuccess[i] = 0;
155 fFailure[i] = 0;
156 } else {
157 fMethods[i] = -1;
158 fSuccess[i] = -1;
159 fFailure[i] = -1;
160 }
161 }
162 }
163
164 // Method details
165 if (fNumMethods > 0) {
166 for (i = 0; i < fNumMethods; i++) {
167 if (details && details[i] && strlen(details[i]) > 0) {
168 fDetails[i] = details[i];
169 } else {
170 // Use default instead
172 fDetails[i] = (const char *)tmp;
173 delete[] tmp;
174 }
175 }
176 }
177
178 // List of TSecContext
179 fSecContexts = new TList;
180
181 // Active when created
182 fActive = kTRUE;
183}
184
185////////////////////////////////////////////////////////////////////////////////
186/// Copy ctor ...
187
189{
190 fHost = ha.fHost;
191 fServer = ha.fServer;
192 fUser = ha.fUser;
193 fNumMethods = ha.fNumMethods;
194 Int_t i = 0;
195 for (; i < kMAXSEC; i++) {
196 fMethods[i] = ha.fMethods[i];
197 fSuccess[i] = ha.fSuccess[i];
198 fFailure[i] = ha.fFailure[i];
199 fDetails[i] = ha.fDetails[i];
200 }
201 fSecContexts = ha.Established();
202 fActive = ha.fActive;
203}
204
205////////////////////////////////////////////////////////////////////////////////
206/// Add method to the list. If already there, change its
207/// details to 'details'
208
210{
211 // Check 'meth'
212 if (meth < 0 || meth >= kMAXSEC) return;
213
214 // If already there, set details and return
215 if (HasMethod(meth)) {
217 return;
218 }
219
220 // This is a new method
224 if (details && strlen(details) > 0) {
226 } else {
227 // Use default instead
229 fDetails[fNumMethods] = (const char *)tmp;
230 delete[] tmp;
231 }
232
233 // Increment total number
234 fNumMethods++;
235
236 if (gDebug > 3) Print();
237}
238
239////////////////////////////////////////////////////////////////////////////////
240/// Remove method 'meth' from the list, if there ...
241
243{
244 // If we don't have it, nothing to do
245 Int_t pos = -1;
246 if (!HasMethod(meth,&pos)) return;
247
248 // Now rescale info
249 Int_t i = 0, k = 0;
250 for (; i < fNumMethods; i++) {
251 if (i != pos) {
252 fMethods[k] = fMethods[i];
253 fSuccess[k] = fSuccess[i];
254 fFailure[k] = fFailure[i];
255 fDetails[k] = fDetails[i];
256 k++;
257 }
258 }
259
260 // Decrement total number
261 fNumMethods--;
262
263 // Free last position
264 fMethods[fNumMethods] = -1;
265 fSuccess[fNumMethods] = -1;
266 fFailure[fNumMethods] = -1;
268
269 if (gDebug > 3) Print();
270}
271
272////////////////////////////////////////////////////////////////////////////////
273/// Remove all methods, leaving Active status and
274/// list of associted TSceContexts unchanged
275
277{
278 // Free all filled positions
279 Int_t i = 0;
280 for (; i < fNumMethods; i++) {
281 fMethods[i] = -1;
282 fSuccess[i] = -1;
283 fFailure[i] = -1;
284 fDetails[i].Resize(0);
285 }
286
287 // Set total number to 0
288 fNumMethods = 0;
289}
290
291////////////////////////////////////////////////////////////////////////////////
292/// The dtor.
293
295{
296 delete fSecContexts;
297}
298
299////////////////////////////////////////////////////////////////////////////////
300/// Return authentication details for specified level
301/// or "" if the specified level does not exist for this host.
302
303const char *THostAuth::GetDetails(Int_t level)
304{
305 Int_t i = -1;
306 if (HasMethod(level,&i)) {
307 if (gDebug > 3)
308 Info("GetDetails"," %d: returning fDetails[%d]: %s",
309 level,i,fDetails[i].Data());
310 return fDetails[i];
311 }
312 static const char *empty = " ";
313 return empty;
314}
315
316////////////////////////////////////////////////////////////////////////////////
317/// Return kTRUE if method 'level' is in the list
318
320{
321 int i;
322 for (i = 0; i < fNumMethods; i++) {
323 if (fMethods[i] == level) {
324 if (pos) *pos = i;
325 return kTRUE;
326 }
327 }
328 if (pos) *pos = -1;
329 return kFALSE;
330}
331
332////////////////////////////////////////////////////////////////////////////////
333/// Set authentication details for specified level.
334
335void THostAuth::SetDetails(Int_t level, const char *details)
336{
337 Int_t i = -1;
338 if (HasMethod(level,&i)) {
339 if (details && strlen(details) > 0) {
340 fDetails[i] = details;
341 } else {
342 // Use default instead
343 char *tmp = TAuthenticate::GetDefaultDetails(level,0,fUser);
344 fDetails[i] = (const char *)tmp;
345 delete[] tmp;
346 }
347 } else {
348 // Add new method ...
349 AddMethod(level, details);
350 }
351}
352
353////////////////////////////////////////////////////////////////////////////////
354/// Print object content.
355
357{
358 char srvnam[4][8] = { "any", "sockd", "rootd", "???" };
359
360 Int_t isrv = (fServer >= -1 && fServer <= TSocket::kROOTD) ?
362
363 Info("Print",
364 "%s +------------------------------------------------------------------+",proc);
365 Info("Print","%s + Host:%s - srv:%s - User:%s - # of available methods:%d",
367 int i = 0;
368 for (i = 0; i < fNumMethods; i++){
369 Info("Print","%s + Method: %d (%s) Ok:%d Ko:%d Dets:%s", proc,
371 fSuccess[i], fFailure[i], fDetails[i].Data());
372 }
373 Info("Print",
374 "%s +------------------------------------------------------------------+",proc);
375}
376
377////////////////////////////////////////////////////////////////////////////////
378/// Print info about established authentication vis-a-vis of this Host.
379
381{
382 Info("PrintEstablished",
383 "+------------------------------------------------------------------------------+");
384 Info("PrintEstablished","+ Host:%s - Number of active sec contexts: %d",
386
387 // Check list
388 if (fSecContexts->GetSize()>0) {
389 TIter next(fSecContexts);
390 TSecContext *ctx = 0;
391 Int_t k = 1;
392 while ((ctx = (TSecContext *) next())) {
393 TString opt;
394 opt += k++;
395 ctx->Print(opt);
396 }
397 }
398 Info("PrintEstablished",
399 "+------------------------------------------------------------------------------+");
400}
401
402////////////////////////////////////////////////////////////////////////////////
403/// Reorder nmet methods according fmet[nmet]
404
406{
407 // Temporary arrays
408 Int_t tMethods[kMAXSEC] = {0};
409 Int_t tSuccess[kMAXSEC] = {0};
410 Int_t tFailure[kMAXSEC] = {0};
412 Int_t flag[kMAXSEC] = {0};
413
414 // Copy info in the new order
415 Int_t j = 0;
416 for ( ; j < nmet; j++) {
417 Int_t i = -1;
418 if (HasMethod(fmet[j],&i)) {
419 tMethods[j] = fMethods[i];
420 tSuccess[j] = fSuccess[i];
421 tFailure[j] = fFailure[i];
422 tDetails[j] = fDetails[i];
423 flag[i]++;
424 } else if (fmet[j] >= 0 && fmet[j] < kMAXSEC) {
425 tMethods[j] = fmet[j];
426 tSuccess[j] = 0;
427 tFailure[j] = 0;
429 tDetails[j] = (const char *)tmp;
430 delete[] tmp;
431 } else {
432 Warning("ReOrder","Method id out of range (%d) - skipping",fmet[j]);
433 }
434 }
435
436 // Add existing methods not listed ... if any
437 Int_t k = nmet, i = 0;
438 for(; i < fNumMethods; i++){
439 if (flag[i] == 0) {
440 tMethods[k] = fMethods[i];
441 tSuccess[k] = fSuccess[i];
442 tFailure[k] = fFailure[i];
443 tDetails[k] = fDetails[i];
444 k++;
445 flag[i] = 1;
446 }
447 }
448
449 // Restore from temporary
450 fNumMethods = k;
451 for (i = 0; i < fNumMethods; i++) {
452 fMethods[i] = tMethods[i];
453 fSuccess[i] = tSuccess[i];
454 fFailure[i] = tFailure[i];
455 fDetails[i] = tDetails[i];
456 }
457
458 if (gDebug > 3) Print();
459}
460
461////////////////////////////////////////////////////////////////////////////////
462/// Update info with the one in ha
463/// Remaining methods, if any, get lower priority
464
466{
467 // Temporary arrays
473
474 // Save existing info in temporary arrays
475 Int_t i = 0;
476 for ( ; i < fNumMethods; i++) {
477 tMethods[i] = fMethods[i];
478 tSuccess[i] = fSuccess[i];
479 tFailure[i] = fFailure[i];
480 tDetails[i] = fDetails[i];
481 }
482
483 // Reset
484 Reset();
485
486 // Get ha content in
487 for(i = 0; i < ha->NumMethods(); i++){
488 fMethods[i] = ha->GetMethod(i);
489 fSuccess[i] = ha->GetSuccess(i);
490 fFailure[i] = ha->GetFailure(i);
491 fDetails[i] = ha->GetDetailsByIdx(i);
492 }
493
494 // Set new tmp size
495 fNumMethods = ha->NumMethods();
496
497 // Add remaining methods with low priority
498 if (fNumMethods < kMAXSEC) {
499 for (i = 0; i < tNumMethods; i++) {
500 if (!HasMethod(tMethods[i]) && fNumMethods < kMAXSEC) {
505 fNumMethods++;
506 }
507 }
508 }
509 if (gDebug > 3) Print();
510}
511
512////////////////////////////////////////////////////////////////////////////////
513/// Set 'method' to be the first used (if in the list ...).
514
516{
517 Int_t i = -1;
518 if (HasMethod(method,&i)) {
519
520 Int_t tMe = fMethods[i];
521 Int_t tSu = fSuccess[i];
522 Int_t tFa = fFailure[i];
523 TString tDe = fDetails[i];
524
525 // Rescale methods
526 Int_t j = i;
527 for (; j > 0; j--) {
528 fMethods[j] = fMethods[j-1];
529 fSuccess[j] = fSuccess[j-1];
530 fFailure[j] = fFailure[j-1];
531 fDetails[j] = fDetails[j-1];
532 }
533
534 // The saved method first
535 fMethods[0] = tMe;
536 fSuccess[0] = tSu;
537 fFailure[0] = tFa;
538 fDetails[0] = tDe;
539 }
540
541 if (gDebug > 3) Print();
542}
543
544////////////////////////////////////////////////////////////////////////////////
545/// Set 'method' to be the last used (if in the list ...).
546
548{
549 Int_t i = -1;
550 if (HasMethod(method,&i)) {
551
552 Int_t tMe = fMethods[i];
553 Int_t tSu = fSuccess[i];
554 Int_t tFa = fFailure[i];
555 TString tDe = fDetails[i];
556
557 // Rescale methods
558 Int_t j = i;
559 for (; j < (fNumMethods - 1); j++) {
560 fMethods[j] = fMethods[j+1];
561 fSuccess[j] = fSuccess[j+1];
562 fFailure[j] = fFailure[j+1];
563 fDetails[j] = fDetails[j+1];
564 }
565
566 // The saved method first
567 Int_t lp = fNumMethods - 1;
568 fMethods[lp] = tMe;
569 fSuccess[lp] = tSu;
570 fFailure[lp] = tFa;
571 fDetails[lp] = tDe;
572 }
573
574 if (gDebug > 3) Print();
575}
576
577////////////////////////////////////////////////////////////////////////////////
578/// Add new method in first position
579/// If already in the list, set as first method 'level' with
580/// authentication 'details'.
581/// Faster then AddMethod(method,details)+SetFirst(method).
582
583void THostAuth::AddFirst(Int_t level, const char *details)
584{
585 Int_t i = -1;
586 if (HasMethod(level,&i)) {
587 if (i > 0) {
588 SetDetails(level, details);
589 SetFirst(level);
590 }
591 if (gDebug > 3) Print();
592 return;
593 }
594
595 // Rescale methods
596 for (i = fNumMethods; i > 0; i--) {
597 fMethods[i] = fMethods[i-1];
598 fSuccess[i] = fSuccess[i-1];
599 fFailure[i] = fFailure[i-1];
600 fDetails[i] = fDetails[i-1];
601 }
602
603 // This method first
604 fMethods[0] = level;
605 fSuccess[0] = 0;
606 fFailure[0] = 0;
607 if (details && strlen(details) > 0) {
608 fDetails[0] = details;
609 } else {
610 // Use default instead
611 char *tmp = TAuthenticate::GetDefaultDetails(level,0,fUser);
612 fDetails[0] = (const char *)tmp;
613 delete[] tmp;
614 }
615
616 // Increment total number
617 fNumMethods++;
618
619 if (gDebug > 3) Print();
620}
621
622
623////////////////////////////////////////////////////////////////////////////////
624/// Count successes for 'method'
625
627{
628 int i;
629 for (i = 0; i < fNumMethods; i++) {
630 if (fMethods[i] == method) {
631 fSuccess[i]++;
632 break;
633 }
634 }
635}
636
637////////////////////////////////////////////////////////////////////////////////
638/// Count failures for 'method'
639
641{
642 int i;
643 for (i = 0; i < fNumMethods; i++) {
644 if (fMethods[i] == method) {
645 fFailure[i]++;
646 break;
647 }
648 }
649}
650
651////////////////////////////////////////////////////////////////////////////////
652/// Create a Security context and add it to local list
653/// Return pointer to it to be stored in TAuthenticate
654
655TRootSecContext *THostAuth::CreateSecContext(const char *user, const char *host,
657 const char *details, const char *token,
658 TDatime expdate, void *sctx, Int_t key)
659{
660 TRootSecContext *ctx = new TRootSecContext(user, host, meth, offset, details,
661 token, expdate, sctx, key);
662 // Add it also to the local list if active
663 if (ctx->IsActive())
664 fSecContexts->Add(ctx);
665
666 return ctx;
667
668}
669
670////////////////////////////////////////////////////////////////////////////////
671/// Return a static string with all info in a serialized form
672
674{
675 Out = Form("h:%s u:%s n:%d",GetHost(),GetUser(),fNumMethods);
676
677 Int_t i = 0;
678 for (; i < fNumMethods; i++) {
679 Out += TString(Form(" '%d %s'",fMethods[i],fDetails[i].Data()));
680 }
681
682}
const Int_t kMAXSEC
Definition AuthConst.h:26
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
const char Option_t
Option string (const char)
Definition RtypesCore.h:80
#define ClassImp(name)
Definition Rtypes.h:376
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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 offset
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
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition TString.cxx:2496
R__EXTERN TSystem * gSystem
Definition TSystem.h:572
static char * GetDefaultDetails(Int_t method, Int_t opt, const char *user)
Determine default authentication details for method 'sec' and user 'usr'.
static const char * GetAuthMethod(Int_t idx)
Static method returning the method corresponding to idx.
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
This class stores the date and time with a precision of one second in an unsigned 32 bit word (950130...
Definition TDatime.h:37
Bool_t fActive
Definition THostAuth.h:45
Int_t fSuccess[kMAXSEC]
Definition THostAuth.h:43
const char * GetUser() const
Definition THostAuth.h:93
void Create(const char *host, const char *user, Int_t nmeth=0, Int_t *authmeth=nullptr, char **details=nullptr)
Create hostauth object.
TList * fSecContexts
Definition THostAuth.h:47
void Reset()
Remove all methods, leaving Active status and list of associted TSceContexts unchanged.
Char_t fServer
Definition THostAuth.h:38
TRootSecContext * CreateSecContext(const char *user, const char *host, Int_t meth, Int_t offset, const char *details, const char *token, TDatime expdate=kROOTTZERO, void *ctx=nullptr, Int_t key=-1)
Create a Security context and add it to local list Return pointer to it to be stored in TAuthenticate...
const char * GetHost() const
Definition THostAuth.h:91
void AddMethod(Int_t level, const char *details=nullptr)
Add method to the list.
void SetDetails(Int_t level, const char *details)
Set authentication details for specified level.
virtual ~THostAuth()
The dtor.
Int_t fMethods[kMAXSEC]
Definition THostAuth.h:41
void SetFirst(Int_t level)
Set 'method' to be the first used (if in the list ...).
Int_t fFailure[kMAXSEC]
Definition THostAuth.h:44
TString fDetails[kMAXSEC]
Definition THostAuth.h:42
void Print(Option_t *option="") const override
Print object content.
void ReOrder(Int_t nmet, Int_t *fmet)
Reorder nmet methods according fmet[nmet].
THostAuth()
Default constructor.
Definition THostAuth.cxx:37
void RemoveMethod(Int_t level)
Remove method 'meth' from the list, if there ...
Int_t fNumMethods
Definition THostAuth.h:40
TString fHost
Definition THostAuth.h:37
TString fUser
Definition THostAuth.h:39
void CountFailure(Int_t level)
Count failures for 'method'.
void AddFirst(Int_t level, const char *details=nullptr)
Add new method in first position If already in the list, set as first method 'level' with authenticat...
Bool_t HasMethod(Int_t level, Int_t *pos=nullptr)
Return kTRUE if method 'level' is in the list.
void AsString(TString &out) const
Return a static string with all info in a serialized form.
void Update(THostAuth *ha)
Update info with the one in ha Remaining methods, if any, get lower priority.
const char * GetDetails(Int_t level)
Return authentication details for specified level or "" if the specified level does not exist for thi...
void SetLast(Int_t level)
Set 'method' to be the last used (if in the list ...).
void PrintEstablished() const
Print info about established authentication vis-a-vis of this Host.
void CountSuccess(Int_t level)
Count successes for 'method'.
This class represents an Internet Protocol (IP) address.
A doubly linked list.
Definition TList.h:38
void Add(TObject *obj) override
Definition TList.h:81
Mother of all ROOT objects.
Definition TObject.h:41
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:1058
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Definition TObject.cxx:1046
Bool_t IsActive() const
Check remote OffSet and expiring Date.
void Print(Option_t *option="F") const override
If opt is "F" (default) print object content.
@ kSOCKD
Definition TSocket.h:50
@ kROOTD
Definition TSocket.h:50
Basic string class.
Definition TString.h:138
const char * Data() const
Definition TString.h:384
void Resize(Ssiz_t n)
Resize the string. Truncate or add blanks as necessary.
Definition TString.cxx:1160
TString & Remove(Ssiz_t pos)
Definition TString.h:693
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Definition TString.h:640
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Definition TString.h:659
virtual const char * Getenv(const char *env)
Get environment variable.
Definition TSystem.cxx:1678
virtual TInetAddress GetHostByName(const char *server)
Get Internet Protocol (IP) address of host.
Definition TSystem.cxx:2304
virtual UserGroup_t * GetUserInfo(Int_t uid)
Returns all user info in the UserGroup_t structure.
Definition TSystem.cxx:1614
This class represents a WWW compatible URL.
Definition TUrl.h:33
const char * GetProtocol() const
Definition TUrl.h:64