xrootd
XrdProtocol.hh
Go to the documentation of this file.
1#ifndef __XrdProtocol_H__
2#define __XrdProtocol_H__
3/******************************************************************************/
4/* */
5/* X r d P r o t o c o l . h h */
6/* */
7/* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University */
8/* Produced by Andrew Hanushevsky for Stanford University under contract */
9/* DE-AC02-76-SFO0515 with the Department of Energy */
10/* */
11/* This file is part of the XRootD software suite. */
12/* */
13/* XRootD is free software: you can redistribute it and/or modify it under */
14/* the terms of the GNU Lesser General Public License as published by the */
15/* Free Software Foundation, either version 3 of the License, or (at your */
16/* option) any later version. */
17/* */
18/* XRootD is distributed in the hope that it will be useful, but WITHOUT */
19/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
20/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
21/* License for more details. */
22/* */
23/* You should have received a copy of the GNU Lesser General Public License */
24/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
25/* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
26/* */
27/* The copyright holder's institutional names and contributor's names may not */
28/* be used to endorse or promote products derived from this software without */
29/* specific prior written permission of the institution or contributor. */
30/******************************************************************************/
31
32#include "Xrd/XrdJob.hh"
33
34/******************************************************************************/
35/* X r d P r o t o c o l _ C o n f i g */
36/******************************************************************************/
37
38// The following class is passed to the XrdgetProtocol() and XrdgetProtocolPort()
39// functions to properly configure the protocol. This object is not stable and
40// the protocol must copy out any values it desires to keep. It may copy the
41// whole object using the supplied copy constructor.
42
43class XrdSysError;
44union XrdNetSockAddr;
45class XrdOucEnv;
46class XrdOucTrace;
47class XrdBuffManager;
48class XrdInet;
49class XrdScheduler;
50class XrdStats;
51
52struct sockaddr;
53
55{
56public:
57
58// The following pointers may be copied; they are stable.
59//
60XrdSysError *eDest; // Stable -> Error Message/Logging Handler
61XrdInet *NetTCP; // Stable -> Network Object (@ XrdgetProtocol)
62XrdBuffManager *BPool; // Stable -> Buffer Pool Manager
63XrdScheduler *Sched; // Stable -> System Scheduler
64XrdStats *Stats; // Stable -> System Statistics (@ XrdgetProtocol)
65XrdOucEnv *theEnv; // Stable -> Additional environmental information
66XrdOucTrace *Trace; // Stable -> Trace Information
67
68// The following information must be duplicated; it is unstable.
69//
70char *ConfigFN; // -> Configuration file
71int Format; // Binary format of this server
72int Port; // Port number
73int WSize; // Window size for Port
74const char *AdmPath; // Admin path
75int AdmMode; // Admin path mode
76const char *myInst; // Instance name
77const char *myName; // Host name
78const char *myProg; // Program name
79union {
80const
81XrdNetSockAddr *urAddr; // Host Address (the actual structure/union)
82const
83struct sockaddr *myAddr; // Host address
84 };
85int ConnMax; // Max connections
86int readWait; // Max milliseconds to wait for data
87int idleWait; // Max milliseconds connection may be idle
88int argc; // Number of arguments
89char **argv; // Argument array (prescreened)
90char DebugON; // True if started with -d option
91int WANPort; // Port prefered for WAN connections (0 if none)
92int WANWSize; // Window size for the WANPort
93int hailWait; // Max milliseconds to wait for data after accept
94
98};
99
100/******************************************************************************/
101/* X r d P r o t o c o l */
102/******************************************************************************/
103
104// This class is used by the Link object to process the input stream on a link.
105// At least one protocol object exists per Link object. Specific protocols are
106// derived from this pure abstract class since a link can use one of several
107// protocols. Indeed, startup and shutdown are handled by specialized protocols.
108
109// System configuration obtains an instance of a protocol by calling
110// XrdgetProtocol(), which must exist in the shared library.
111// This instance is used as the base pointer for Alloc(), Configure(), and
112// Match(). Unfortuantely, they cannot be static given the silly C++ rules.
113
114class XrdLink;
115
116class XrdProtocol : public XrdJob
117{
118public:
119
120// Match() is invoked when a new link is created and we are trying
121// to determine if this protocol can handle the link. It must
122// return a protocol object if it can and NULL (0), otherwise.
123//
124virtual XrdProtocol *Match(XrdLink *lp) = 0;
125
126// Process() is invoked when a link has data waiting to be read
127//
128virtual int Process(XrdLink *lp) = 0;
129
130// Recycle() is invoked when this object is no longer needed. The method is
131// passed the number of seconds the protocol was connected to the
132// link and the reason for the disconnection, if any.
133//
134virtual void Recycle(XrdLink *lp=0,int consec=0,const char *reason=0)=0;
135
136// Stats() is invoked when we need statistics about all instances of the
137// protocol. If a buffer is supplied, it must return a null
138// terminated string in the supplied buffer and the return value
139// is the number of bytes placed in the buffer defined by C99 for
140// snprintf(). If no buffer is supplied, the method should return
141// the maximum number of characters that could have been returned.
142// Regardless of the buffer value, if do_sync is true, the method
143// should include any local statistics in the global data (if any)
144// prior to performing any action.
145//
146virtual int Stats(char *buff, int blen, int do_sync=0) = 0;
147
148 XrdProtocol(const char *jname): XrdJob(jname) {}
149virtual ~XrdProtocol() {}
150};
151
152/******************************************************************************/
153/* X r d g e t P r o t o c o l */
154/******************************************************************************/
155
156/* This extern "C" function must be defined in the shared library plug-in
157 implementing your protocol. It is called to obtain an instance of your
158 protocol. This allows protocols to live outside of the protocol driver
159 (i.e., to be loaded at run-time). The call is made after the call to
160 XrdgetProtocolPort() to determine the port to be used (see below) which
161 allows e network object (NetTCP) to be proerly defined and it's pointer
162 is passed in the XrdProtocol_Config object for your use.
163
164 Required return values:
165 Success: Pointer to XrdProtocol object.
166 Failure: Null pointer (i.e. 0) which causes the program to exit.
167
168extern "C" // This is in a comment!
169{
170 XrdProtocol *XrdgetProtocol(const char *protocol_name, char *parms,
171 XrdProtocol_Config *pi) {....}
172}
173*/
174
175/******************************************************************************/
176/* X r d g e t P r o t o c o l P o r t */
177/******************************************************************************/
178
179/* This extern "C" function must be defined for statically linked protocols
180 but is optional for protocols defined as a shared library plug-in if the
181 rules determining which port number to use is sufficient for your protocol.
182 The function is called to obtain the actual port number to be used by the
183 the protocol. The default port number is noted in XrdProtocol_Config Port.
184 Initially, it has one of the fllowing values:
185 <0 -> No port was specified.
186 =0 -> An erbitrary port will be assigned.
187 >0 -> This port number was specified.
188
189 XrdgetProtoclPort() must return:
190 <0 -> Failure is indicated and we terminate
191 =0 -> Use an arbitrary port (even if this equals Port)
192 >0 -> The returned port number must be used (even if it equals Port)
193
194 When we finally call XrdgetProtocol(), the actual port number is indicated
195 in Port and the network object is defined in NetTCP and bound to the port.
196
197 Final Caveats: 1. The network object (NetTCP) is not defined until
198 XrdgetProtocol() is called.
199
200 2. The statistics object (Stats) is not defined until
201 XrdgetProtocol() is called.
202
203 3. When the protocol is loaded from a shared library, you need
204 need not define XrdgetProtocolPort() if the standard port
205 determination scheme is sufficient.
206
207extern "C" // This is in a comment!
208{
209 int XrdgetProtocolPort(const char *protocol_name, char *parms,
210 XrdProtocol_Config *pi) {....}
211}
212*/
213#endif
Definition: XrdBuffer.hh:75
Definition: XrdInet.hh:49
Definition: XrdJob.hh:43
Definition: XrdOucEnv.hh:42
Definition: XrdOucTrace.hh:36
Definition: XrdProtocol.hh:55
XrdProtocol_Config()
Definition: XrdProtocol.hh:96
const char * myName
Definition: XrdProtocol.hh:77
XrdBuffManager * BPool
Definition: XrdProtocol.hh:62
XrdScheduler * Sched
Definition: XrdProtocol.hh:63
XrdInet * NetTCP
Definition: XrdProtocol.hh:61
const struct sockaddr * myAddr
Definition: XrdProtocol.hh:82
int WSize
Definition: XrdProtocol.hh:73
int Format
Definition: XrdProtocol.hh:71
int Port
Definition: XrdProtocol.hh:72
const XrdNetSockAddr * urAddr
Definition: XrdProtocol.hh:81
int AdmMode
Definition: XrdProtocol.hh:75
~XrdProtocol_Config()
Definition: XrdProtocol.hh:97
int idleWait
Definition: XrdProtocol.hh:87
const char * AdmPath
Definition: XrdProtocol.hh:74
int ConnMax
Definition: XrdProtocol.hh:85
XrdSysError * eDest
Definition: XrdProtocol.hh:60
XrdProtocol_Config(XrdProtocol_Config &rhs)
XrdOucEnv * theEnv
Definition: XrdProtocol.hh:65
const char * myProg
Definition: XrdProtocol.hh:78
XrdOucTrace * Trace
Definition: XrdProtocol.hh:66
const char * myInst
Definition: XrdProtocol.hh:76
char * ConfigFN
Definition: XrdProtocol.hh:70
int WANPort
Definition: XrdProtocol.hh:91
int WANWSize
Definition: XrdProtocol.hh:92
int argc
Definition: XrdProtocol.hh:88
int readWait
Definition: XrdProtocol.hh:86
int hailWait
Definition: XrdProtocol.hh:93
XrdStats * Stats
Definition: XrdProtocol.hh:64
char ** argv
Definition: XrdProtocol.hh:89
char DebugON
Definition: XrdProtocol.hh:90
Definition: XrdProtocol.hh:117
virtual ~XrdProtocol()
Definition: XrdProtocol.hh:149
XrdProtocol(const char *jname)
Definition: XrdProtocol.hh:148
virtual void Recycle(XrdLink *lp=0, int consec=0, const char *reason=0)=0
virtual int Stats(char *buff, int blen, int do_sync=0)=0
virtual int Process(XrdLink *lp)=0
virtual XrdProtocol * Match(XrdLink *lp)=0
Definition: XrdScheduler.hh:45
Definition: XrdStats.hh:52
Definition: XrdSysError.hh:90
Definition: XrdNetSockAddr.hh:43