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 
43 class XrdSysError;
44 class XrdOucTrace;
45 class XrdBuffManager;
46 class XrdInet;
47 class XrdScheduler;
48 class XrdStats;
49 
50 struct sockaddr;
51 
53 {
54 public:
55 
56 // The following pointers may be copied; they are stable.
57 //
58 XrdSysError *eDest; // Stable -> Error Message/Logging Handler
59 XrdInet *NetTCP; // Stable -> Network Object (@ XrdgetProtocol)
60 XrdBuffManager *BPool; // Stable -> Buffer Pool Manager
61 XrdScheduler *Sched; // Stable -> System Scheduler
62 XrdStats *Stats; // Stable -> System Statistics (@ XrdgetProtocol)
63 void *Reserved; // Stable -> Previously, the thread manager
64 XrdOucTrace *Trace; // Stable -> Trace Information
65 
66 // The following information must be duplicated; it is unstable.
67 //
68 char *ConfigFN; // -> Configuration file
69 int Format; // Binary format of this server
70 int Port; // Port number
71 int WSize; // Window size for Port
72 const char *AdmPath; // Admin path
73 int AdmMode; // Admin path mode
74 const char *myInst; // Instance name
75 const char *myName; // Host name
76 const char *myProg; // Program name
77 struct sockaddr *myAddr; // Host address
78 int ConnMax; // Max connections
79 int readWait; // Max milliseconds to wait for data
80 int idleWait; // Max milliseconds connection may be idle
81 int argc; // Number of arguments
82 char **argv; // Argument array (prescreened)
83 char DebugON; // True if started with -d option
84 int WANPort; // Port prefered for WAN connections (0 if none)
85 int WANWSize; // Window size for the WANPort
86 int hailWait; // Max milliseconds to wait for data after accept
87 
91 };
92 
93 /******************************************************************************/
94 /* X r d P r o t o c o l */
95 /******************************************************************************/
96 
97 // This class is used by the Link object to process the input stream on a link.
98 // At least one protocol object exists per Link object. Specific protocols are
99 // derived from this pure abstract class since a link can use one of several
100 // protocols. Indeed, startup and shutdown are handled by specialized protocols.
101 
102 // System configuration obtains an instance of a protocol by calling
103 // XrdgetProtocol(), which must exist in the shared library.
104 // This instance is used as the base pointer for Alloc(), Configure(), and
105 // Match(). Unfortuantely, they cannot be static given the silly C++ rules.
106 
107 class XrdLink;
108 
109 class XrdProtocol : public XrdJob
110 {
111 public:
112 
113 // Match() is invoked when a new link is created and we are trying
114 // to determine if this protocol can handle the link. It must
115 // return a protocol object if it can and NULL (0), otherwise.
116 //
117 virtual XrdProtocol *Match(XrdLink *lp) = 0;
118 
119 // Process() is invoked when a link has data waiting to be read
120 //
121 virtual int Process(XrdLink *lp) = 0;
122 
123 // Recycle() is invoked when this object is no longer needed. The method is
124 // passed the number of seconds the protocol was connected to the
125 // link and the reason for the disconnection, if any.
126 //
127 virtual void Recycle(XrdLink *lp=0,int consec=0,const char *reason=0)=0;
128 
129 // Stats() is invoked when we need statistics about all instances of the
130 // protocol. If a buffer is supplied, it must return a null
131 // terminated string in the supplied buffer and the return value
132 // is the number of bytes placed in the buffer defined by C99 for
133 // snprintf(). If no buffer is supplied, the method should return
134 // the maximum number of characters that could have been returned.
135 // Regardless of the buffer value, if do_sync is true, the method
136 // should include any local statistics in the global data (if any)
137 // prior to performing any action.
138 //
139 virtual int Stats(char *buff, int blen, int do_sync=0) = 0;
140 
141  XrdProtocol(const char *jname): XrdJob(jname) {}
142 virtual ~XrdProtocol() {}
143 };
144 
145 /******************************************************************************/
146 /* X r d g e t P r o t o c o l */
147 /******************************************************************************/
148 
149 /* This extern "C" function must be defined in the shared library plug-in
150  implementing your protocol. It is called to obtain an instance of your
151  protocol. This allows protocols to live outside of the protocol driver
152  (i.e., to be loaded at run-time). The call is made after the call to
153  XrdgetProtocolPort() to determine the port to be used (see below) which
154  allows e network object (NetTCP) to be proerly defined and it's pointer
155  is passed in the XrdProtocol_Config object for your use.
156 
157  Required return values:
158  Success: Pointer to XrdProtocol object.
159  Failure: Null pointer (i.e. 0) which causes the program to exit.
160 
161 extern "C" // This is in a comment!
162 {
163  XrdProtocol *XrdgetProtocol(const char *protocol_name, char *parms,
164  XrdProtocol_Config *pi) {....}
165 }
166 */
167 
168 /******************************************************************************/
169 /* X r d g e t P r o t o c o l P o r t */
170 /******************************************************************************/
171 
172 /* This extern "C" function must be defined for statically linked protocols
173  but is optional for protocols defined as a shared library plug-in if the
174  rules determining which port number to use is sufficient for your protocol.
175  The function is called to obtain the actual port number to be used by the
176  the protocol. The default port number is noted in XrdProtocol_Config Port.
177  Initially, it has one of the fllowing values:
178  <0 -> No port was specified.
179  =0 -> An erbitrary port will be assigned.
180  >0 -> This port number was specified.
181 
182  XrdgetProtoclPort() must return:
183  <0 -> Failure is indicated and we terminate
184  =0 -> Use an arbitrary port (even if this equals Port)
185  >0 -> The returned port number must be used (even if it equals Port)
186 
187  When we finally call XrdgetProtocol(), the actual port number is indicated
188  in Port and the network object is defined in NetTCP and bound to the port.
189 
190  Final Caveats: 1. The network object (NetTCP) is not defined until
191  XrdgetProtocol() is called.
192 
193  2. The statistics object (Stats) is not defined until
194  XrdgetProtocol() is called.
195 
196  3. When the protocol is loaded from a shared library, you need
197  need not define XrdgetProtocolPort() if the standard port
198  determination scheme is sufficient.
199 
200 extern "C" // This is in a comment!
201 {
202  int XrdgetProtocolPort(const char *protocol_name, char *parms,
203  XrdProtocol_Config *pi) {....}
204 }
205 */
206 #endif
int idleWait
Definition: XrdProtocol.hh:80
virtual int Process(XrdLink *lp)=0
const char * myProg
Definition: XrdProtocol.hh:76
const char * myInst
Definition: XrdProtocol.hh:74
char ** argv
Definition: XrdProtocol.hh:82
int ConnMax
Definition: XrdProtocol.hh:78
const char * myName
Definition: XrdProtocol.hh:75
XrdProtocol(const char *jname)
Definition: XrdProtocol.hh:141
int WANPort
Definition: XrdProtocol.hh:84
Definition: XrdProtocol.hh:109
Definition: XrdBuffer.hh:73
Definition: XrdOucTrace.hh:35
Definition: XrdSysError.hh:87
virtual int Stats(char *buff, int blen, int do_sync=0)=0
int readWait
Definition: XrdProtocol.hh:79
Definition: XrdScheduler.hh:42
void * Reserved
Definition: XrdProtocol.hh:63
char * ConfigFN
Definition: XrdProtocol.hh:68
int AdmMode
Definition: XrdProtocol.hh:73
int Format
Definition: XrdProtocol.hh:69
XrdBuffManager * BPool
Definition: XrdProtocol.hh:60
XrdScheduler * Sched
Definition: XrdProtocol.hh:61
Definition: XrdProtocol.hh:52
int argc
Definition: XrdProtocol.hh:81
virtual void Recycle(XrdLink *lp=0, int consec=0, const char *reason=0)=0
int hailWait
Definition: XrdProtocol.hh:86
XrdSysError * eDest
Definition: XrdProtocol.hh:58
XrdStats * Stats
Definition: XrdProtocol.hh:62
~XrdProtocol_Config()
Definition: XrdProtocol.hh:90
virtual ~XrdProtocol()
Definition: XrdProtocol.hh:142
int WANWSize
Definition: XrdProtocol.hh:85
XrdProtocol_Config()
Definition: XrdProtocol.hh:89
virtual XrdProtocol * Match(XrdLink *lp)=0
XrdInet * NetTCP
Definition: XrdProtocol.hh:59
int Port
Definition: XrdProtocol.hh:70
struct sockaddr * myAddr
Definition: XrdProtocol.hh:77
char DebugON
Definition: XrdProtocol.hh:83
XrdOucTrace * Trace
Definition: XrdProtocol.hh:64
Definition: XrdJob.hh:42
int WSize
Definition: XrdProtocol.hh:71
const char * AdmPath
Definition: XrdProtocol.hh:72