XRootD
XrdMain.cc
Go to the documentation of this file.
1
/**************************************************************************************/
2
/* */
3
/* X r d M a i n . c c */
4
/* */
5
/* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */
6
/* Produced by Andrew Hanushevsky for Stanford University under contract */
7
/* DE-AC02-76-SFO0515 with the Department of Energy */
8
/* */
9
/* This file is part of the XRootD software suite. */
10
/* */
11
/* XRootD is free software: you can redistribute it and/or modify it under */
12
/* the terms of the GNU Lesser General Public License as published by the */
13
/* Free Software Foundation, either version 3 of the License, or (at your */
14
/* option) any later version. */
15
/* */
16
/* XRootD is distributed in the hope that it will be useful, but WITHOUT */
17
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
18
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
19
/* License for more details. */
20
/* */
21
/* You should have received a copy of the GNU Lesser General Public License */
22
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
23
/* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
24
/* */
25
/* The copyright holder's institutional names and contributor's names may not */
26
/* be used to endorse or promote products derived from this software without */
27
/* specific prior written permission of the institution or contributor. */
28
/******************************************************************************/
29
30
/* This is the XRootd server. The syntax is:
31
32
xrootd [options]
33
34
options: [-b] [-c <fname>] [-d] [-h] [-l <fname>] [-p <port>] [<oth>]
35
36
Where:
37
-b forces background execution.
38
39
-c specifies the configuration file. This may also come from the
40
XrdCONFIGFN environmental variable.
41
42
-d Turns on debugging mode (equivalent to xrd.trace all)
43
44
-h Displays usage line and exits.
45
46
-l Specifies location of the log file. This may also come from the
47
XrdOucLOGFILE environmental variable or from the oofs layer. By
48
By default, error messages go to standard error.
49
50
-p Is the port to use either as a service name or an actual port number.
51
The default port is 1094.
52
53
<oth> Are other protocol specific options.
54
55
*/
56
57
/******************************************************************************/
58
/* i n c l u d e f i l e s */
59
/******************************************************************************/
60
61
#include <unistd.h>
62
#include <cctype>
63
#include <cerrno>
64
#include <cstdint>
65
#include <signal.h>
66
#include <cstdlib>
67
#include <cstring>
68
#include <strings.h>
69
#include <cstdio>
70
#include <sys/param.h>
71
72
#include "
Xrd/XrdConfig.hh
"
73
#include "
Xrd/XrdInet.hh
"
74
#include "
Xrd/XrdLink.hh
"
75
#include "
Xrd/XrdProtLoad.hh
"
76
#include "
Xrd/XrdScheduler.hh
"
77
78
#include "
XrdSys/XrdSysError.hh
"
79
#include "
XrdSys/XrdSysHeaders.hh
"
80
#include "
XrdSys/XrdSysPthread.hh
"
81
#include "
XrdSys/XrdSysUtils.hh
"
82
83
/******************************************************************************/
84
/* L o c a l C l a s s e s */
85
/******************************************************************************/
86
87
class
XrdMain
:
XrdJob
88
{
89
public
:
90
91
XrdSysSemaphore
*
theSem
;
92
XrdProtocol
*
theProt
;
93
XrdInet
*
theNet
;
94
int
thePort
;
95
static
XrdConfig
Config
;
96
97
void
DoIt
() {
XrdLink
*newlink;
98
if
((newlink =
theNet
->
Accept
(0, -1,
theSem
)))
99
newlink->
setProtocol
(
theProt
,
true
);
100
}
101
102
XrdMain
() :
XrdJob
(
"main accept"
),
theSem
(0),
theProt
(0),
103
theNet
(0),
thePort
(0) {}
104
XrdMain
(
XrdInet
*nP) :
XrdJob
(
"main accept"
),
theSem
(0),
105
theProt
(0),
theNet
(nP),
thePort
(nP->Port()) {}
106
~XrdMain
() {}
107
};
108
109
XrdConfig
XrdMain::Config
;
110
111
/******************************************************************************/
112
/* E x t e r n a l T h r e a d I n t e r f a c e s */
113
/******************************************************************************/
114
115
void
*
mainAccept
(
void
*parg)
116
{
XrdMain
*Parms = (
XrdMain
*)parg;
117
XrdScheduler
*mySched = Parms->
Config
.
ProtInfo
.
Sched
;
118
XrdProtLoad
ProtSelect(Parms->
thePort
);
119
XrdSysSemaphore
accepted(0);
120
121
// Complete the parms
122
//
123
Parms->
theSem
= &accepted;
124
Parms->
theProt
= (
XrdProtocol
*)&ProtSelect;
125
126
// Simply schedule new accepts
127
//
128
while
(1) {mySched->
Schedule
((
XrdJob
*)Parms);
129
accepted.
Wait
();
130
}
131
132
return
(
void
*)0;
133
}
134
135
/******************************************************************************/
136
/* m a i n A d m i n */
137
/******************************************************************************/
138
139
void
*
mainAdmin
(
void
*parg)
140
{
XrdMain
*Parms = (
XrdMain
*)parg;
141
XrdInet
*NetADM = Parms->
theNet
;
142
XrdLink
*newlink;
143
// static XrdProtocol_Admin ProtAdmin;
144
int
ProtAdmin;
145
146
// At this point we should be able to accept new connections. Noe that we don't
147
// support admin connections as of yet so the following code is superflous.
148
//
149
while
(1)
if
((newlink = NetADM->
Accept
()))
150
{newlink->
setProtocol
((
XrdProtocol
*)&ProtAdmin);
151
newlink->
setProtName
(
"xrdadmin"
);
152
Parms->
Config
.
ProtInfo
.
Sched
->
Schedule
((
XrdJob
*)newlink);
153
}
154
return
(
void
*)0;
155
}
156
157
/******************************************************************************/
158
/* m a i n */
159
/******************************************************************************/
160
161
int
main
(
int
argc,
char
*argv[])
162
{
163
XrdMain
Main;
164
pthread_t tid;
165
char
buff[128];
166
int
i, retc;
167
168
// Set TZ environment variable to read the system timezone from /etc/localtime
169
// if it is not already set, to avoid race conditions between localtime_r() and
170
// mktime() during the multi-threaded phase of the initialization.
171
172
if
(
access
(
"/etc/localtime"
, R_OK) == 0)
173
setenv(
"TZ"
,
":/etc/localtime"
,
/* overwrite */
false
);
174
175
// Call tzset() early to ensure thread-safety of localtime_r() and mktime().
176
tzset();
177
178
// Turn off sigpipe and host a variety of others before we start any threads
179
//
180
XrdSysUtils::SigBlock
();
181
182
// Set the default stack size here. Note that on modern Linux the default
183
// stack size is set at about 8MB. We force a lower limit to not have a huge
184
// virtual address space mostly for core file debugging purposes.
185
//
186
if
(
sizeof
(
long
) > 4)
XrdSysThread::setStackSize
((
size_t
)2097152,
true
);
187
else
XrdSysThread::setStackSize
((
size_t
)1048576,
true
);
188
189
// Process configuration file
190
//
191
if
(Main.
Config
.
Configure
(argc, argv)) _exit(1);
192
193
// Start the admin thread if an admin network is defined
194
//
195
if
(Main.
Config
.
NetADM
&& (retc =
XrdSysThread::Run
(&tid,
mainAdmin
,
196
(
void
*)
new
XrdMain
(Main.
Config
.
NetADM
),
197
XRDSYSTHREAD_BIND
,
"Admin handler"
)))
198
{Main.
Config
.
ProtInfo
.
eDest
->
Emsg
(
"main"
, retc,
"create admin thread"
);
199
_exit(3);
200
}
201
202
// At this point we should be able to accept new connections. Spawn a
203
// thread for each network except the first. The main thread will handle
204
// that network as some implementations require a main active thread.
205
//
206
for
(i = 1; i < (int)Main.
Config
.
NetTCP
.size(); i++)
207
if
(Main.
Config
.
NetTCP
[i])
208
{
XrdMain
*Parms =
new
XrdMain
(Main.
Config
.
NetTCP
[i]);
209
sprintf(buff,
"Port %d handler"
, Parms->
thePort
);
210
//??? if (Parms->theNet == Main.Config.NetTCP[XrdProtLoad::ProtoMax])
211
// Parms->thePort = -(Parms->thePort);
212
if
((retc =
XrdSysThread::Run
(&tid,
mainAccept
, (
void
*)Parms,
213
XRDSYSTHREAD_BIND
, strdup(buff))))
214
{Main.
Config
.
ProtInfo
.
eDest
->
Emsg
(
"main"
, retc,
"create"
, buff);
215
_exit(3);
216
}
217
}
218
219
// Finally, start accepting connections on the main port
220
//
221
Main.
theNet
= Main.
Config
.
NetTCP
[0];
222
Main.
thePort
= Main.
Config
.
NetTCP
[0]->Port();
223
mainAccept
((
void
*)&Main);
224
225
// We should never get here
226
//
227
pthread_exit(0);
228
}
XrdConfig.hh
XrdInet.hh
XrdLink.hh
main
int main(int argc, char *argv[])
Definition:
XrdMain.cc:161
mainAdmin
void * mainAdmin(void *parg)
Definition:
XrdMain.cc:139
mainAccept
void * mainAccept(void *parg)
Definition:
XrdMain.cc:115
access
int access(const char *path, int amode)
Definition:
XrdPosixPreload.cc:79
XrdProtLoad.hh
XrdScheduler.hh
XrdSysError.hh
XrdSysHeaders.hh
XrdSysPthread.hh
XRDSYSTHREAD_BIND
#define XRDSYSTHREAD_BIND
Definition:
XrdSysPthread.hh:543
XrdSysUtils.hh
XrdConfig
Definition:
XrdConfig.hh:48
XrdConfig::ProtInfo
XrdProtocol_Config ProtInfo
Definition:
XrdConfig.hh:58
XrdConfig::NetADM
XrdInet * NetADM
Definition:
XrdConfig.hh:59
XrdConfig::NetTCP
std::vector< XrdInet * > NetTCP
Definition:
XrdConfig.hh:60
XrdConfig::Configure
int Configure(int argc, char **argv)
Definition:
XrdConfig.cc:318
XrdInet
Definition:
XrdInet.hh:48
XrdInet::Accept
XrdLink * Accept(int opts=0, int timeout=-1, XrdSysSemaphore *theSem=0)
Definition:
XrdInet.cc:72
XrdJob
Definition:
XrdJob.hh:43
XrdLink
Definition:
XrdLink.hh:52
XrdLink::setProtocol
XrdProtocol * setProtocol(XrdProtocol *pp, bool runit=false, bool push=false)
Definition:
XrdLink.cc:426
XrdLink::setProtName
void setProtName(const char *name)
Definition:
XrdLink.cc:443
XrdMain
Definition:
XrdMain.cc:88
XrdMain::theNet
XrdInet * theNet
Definition:
XrdMain.cc:93
XrdMain::thePort
int thePort
Definition:
XrdMain.cc:94
XrdMain::~XrdMain
~XrdMain()
Definition:
XrdMain.cc:106
XrdMain::DoIt
void DoIt()
Definition:
XrdMain.cc:97
XrdMain::Config
static XrdConfig Config
Definition:
XrdMain.cc:95
XrdMain::theSem
XrdSysSemaphore * theSem
Definition:
XrdMain.cc:91
XrdMain::theProt
XrdProtocol * theProt
Definition:
XrdMain.cc:92
XrdMain::XrdMain
XrdMain(XrdInet *nP)
Definition:
XrdMain.cc:104
XrdMain::XrdMain
XrdMain()
Definition:
XrdMain.cc:102
XrdProtLoad
Definition:
XrdProtLoad.hh:37
XrdProtocol_Config::Sched
XrdScheduler * Sched
Definition:
XrdProtocol.hh:64
XrdProtocol_Config::eDest
XrdSysError * eDest
Definition:
XrdProtocol.hh:61
XrdProtocol
Definition:
XrdProtocol.hh:125
XrdScheduler
Definition:
XrdScheduler.hh:46
XrdScheduler::Schedule
void Schedule(XrdJob *jp)
Definition:
XrdScheduler.cc:414
XrdSysError::Emsg
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
Definition:
XrdSysError.cc:95
XrdSysSemaphore
Definition:
XrdSysPthread.hh:494
XrdSysSemaphore::Wait
void Wait()
Definition:
XrdSysPthread.hh:509
XrdSysThread::Run
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)
Definition:
XrdSysPthread.cc:307
XrdSysThread::setStackSize
static void setStackSize(size_t stsz, bool force=false)
Definition:
XrdSysPthread.cc:330
XrdSysUtils::SigBlock
static bool SigBlock()
Definition:
XrdSysUtils.cc:188
Xrd
XrdMain.cc
Generated by
1.9.1