Merge branch 'v5-stable-elasticsearch' into v5-devel-tmp
[rsyslog.git] / tcpsrv.h
1 /* Definitions for tcpsrv class.
2  *
3  * Copyright 2008-2012 Adiscon GmbH.
4  *
5  * This file is part of rsyslog.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *       http://www.apache.org/licenses/LICENSE-2.0
12  *       -or-
13  *       see COPYING.ASL20 in the source distribution
14  * 
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21 #ifndef INCLUDED_TCPSRV_H
22 #define INCLUDED_TCPSRV_H
23
24 #include "obj.h"
25 #include "prop.h"
26 #include "tcps_sess.h"
27 #include "statsobj.h"
28
29 /* support for framing anomalies */
30 typedef enum ETCPsyslogFramingAnomaly {
31         frame_normal = 0,
32         frame_NetScreen = 1,
33         frame_CiscoIOS = 2
34 } eTCPsyslogFramingAnomaly;
35
36
37 /* list of tcp listen ports */
38 struct tcpLstnPortList_s {
39         uchar *pszPort;                 /**< the ports the listener shall listen on */
40         prop_t *pInputName;
41         tcpsrv_t *pSrv;                 /**< pointer to higher-level server instance */
42         ruleset_t *pRuleset;            /**< associated ruleset */
43         statsobj_t *stats;              /**< associated stats object */
44         STATSCOUNTER_DEF(ctrSubmit, mutCtrSubmit)
45         tcpLstnPortList_t *pNext;       /**< next port or NULL */
46 };
47
48 #define TCPSRV_NO_ADDTL_DELIMITER -1 /* specifies that no additional delimiter is to be used in TCP framing */
49
50 /* the tcpsrv object */
51 struct tcpsrv_s {
52         BEGINobjInstance;       /**< Data to implement generic object - MUST be the first data element! */
53         int bUseKeepAlive;      /**< use socket layer KEEPALIVE handling? */
54         netstrms_t *pNS;        /**< pointer to network stream subsystem */
55         int iDrvrMode;          /**< mode of the stream driver to use */
56         uchar *pszDrvrAuthMode; /**< auth mode of the stream driver to use */
57         uchar *pszInputName;    /**< value to be used as input name */
58         ruleset_t *pRuleset;    /**< ruleset to bind to */
59         permittedPeers_t *pPermPeers;/**< driver's permitted peers */
60         sbool bEmitMsgOnClose;  /**< emit an informational message when the remote peer closes connection */
61         sbool bUsingEPoll;      /**< are we in epoll mode (means we do not need to keep track of sessions!) */
62         sbool bUseFlowControl;  /**< use flow control (make light delayable) */
63         int iLstnCurr;          /**< max nbr of listeners currently supported */
64         netstrm_t **ppLstn;     /**< our netstream listners */
65         tcpLstnPortList_t **ppLstnPort; /**< pointer to relevant listen port description */
66         int iLstnMax;           /**< max number of listners supported */
67         int iSessMax;           /**< max number of sessions supported */
68         tcpLstnPortList_t *pLstnPorts;  /**< head pointer for listen ports */
69
70         int addtlFrameDelim;    /**< additional frame delimiter for plain TCP syslog framing (e.g. to handle NetScreen) */
71         int bDisableLFDelim;    /**< if 1, standard LF frame delimiter is disabled (*very dangerous*) */
72         tcps_sess_t **pSessions;/**< array of all of our sessions */
73         void *pUsr;             /**< a user-settable pointer (provides extensibility for "derived classes")*/
74         /* callbacks */
75         int      (*pIsPermittedHost)(struct sockaddr *addr, char *fromHostFQDN, void*pUsrSrv, void*pUsrSess);
76         rsRetVal (*pRcvData)(tcps_sess_t*, char*, size_t, ssize_t *);
77         rsRetVal (*OpenLstnSocks)(struct tcpsrv_s*);
78         rsRetVal (*pOnListenDeinit)(void*);
79         rsRetVal (*OnDestruct)(void*);
80         rsRetVal (*pOnRegularClose)(tcps_sess_t *pSess);
81         rsRetVal (*pOnErrClose)(tcps_sess_t *pSess);
82         /* session specific callbacks */
83         rsRetVal (*pOnSessAccept)(tcpsrv_t *, tcps_sess_t*);
84         rsRetVal (*OnSessConstructFinalize)(void*);
85         rsRetVal (*pOnSessDestruct)(void*);
86         rsRetVal (*OnMsgReceive)(tcps_sess_t *, uchar *pszMsg, int iLenMsg); /* submit message callback */
87 };
88
89
90 /* interfaces */
91 BEGINinterface(tcpsrv) /* name must also be changed in ENDinterface macro! */
92         INTERFACEObjDebugPrint(tcpsrv);
93         rsRetVal (*Construct)(tcpsrv_t **ppThis);
94         rsRetVal (*ConstructFinalize)(tcpsrv_t __attribute__((unused)) *pThis);
95         rsRetVal (*Destruct)(tcpsrv_t **ppThis);
96         rsRetVal (*configureTCPListen)(tcpsrv_t*, uchar *pszPort);
97         //rsRetVal (*SessAccept)(tcpsrv_t *pThis, tcpLstnPortList_t*, tcps_sess_t **ppSess, netstrm_t *pStrm);
98         rsRetVal (*create_tcp_socket)(tcpsrv_t *pThis);
99         rsRetVal (*Run)(tcpsrv_t *pThis);
100         /* set methods */
101         rsRetVal (*SetAddtlFrameDelim)(tcpsrv_t*, int);
102         rsRetVal (*SetInputName)(tcpsrv_t*, uchar*);
103         rsRetVal (*SetUsrP)(tcpsrv_t*, void*);
104         rsRetVal (*SetCBIsPermittedHost)(tcpsrv_t*, int (*) (struct sockaddr *addr, char*, void*, void*));
105         rsRetVal (*SetCBOpenLstnSocks)(tcpsrv_t *, rsRetVal (*)(tcpsrv_t*));
106         rsRetVal (*SetCBRcvData)(tcpsrv_t *pThis, rsRetVal (*pRcvData)(tcps_sess_t*, char*, size_t, ssize_t*));
107         rsRetVal (*SetCBOnListenDeinit)(tcpsrv_t*, rsRetVal (*)(void*));
108         rsRetVal (*SetCBOnDestruct)(tcpsrv_t*, rsRetVal (*) (void*));
109         rsRetVal (*SetCBOnRegularClose)(tcpsrv_t*, rsRetVal (*) (tcps_sess_t*));
110         rsRetVal (*SetCBOnErrClose)(tcpsrv_t*, rsRetVal (*) (tcps_sess_t*));
111         rsRetVal (*SetDrvrMode)(tcpsrv_t *pThis, int iMode);
112         rsRetVal (*SetDrvrAuthMode)(tcpsrv_t *pThis, uchar *pszMode);
113         rsRetVal (*SetDrvrPermPeers)(tcpsrv_t *pThis, permittedPeers_t*);
114         /* session specifics */
115         rsRetVal (*SetCBOnSessAccept)(tcpsrv_t*, rsRetVal (*) (tcpsrv_t*, tcps_sess_t*));
116         rsRetVal (*SetCBOnSessDestruct)(tcpsrv_t*, rsRetVal (*) (void*));
117         rsRetVal (*SetCBOnSessConstructFinalize)(tcpsrv_t*, rsRetVal (*) (void*));
118         /* added v5 */
119         rsRetVal (*SetSessMax)(tcpsrv_t *pThis, int iMaxSess);  /* 2009-04-09 */
120         /* added v6 */
121         rsRetVal (*SetOnMsgReceive)(tcpsrv_t *pThis, rsRetVal (*OnMsgReceive)(tcps_sess_t*, uchar*, int)); /* 2009-05-24 */
122         rsRetVal (*SetRuleset)(tcpsrv_t *pThis, ruleset_t*); /* 2009-06-12 */
123         /* added v7 (accidently named v8!) */
124         rsRetVal (*SetLstnMax)(tcpsrv_t *pThis, int iMaxLstn);  /* 2009-08-17 */
125         rsRetVal (*SetNotificationOnRemoteClose)(tcpsrv_t *pThis, int bNewVal); /* 2009-10-01 */
126         /* added v9 -- rgerhards, 2010-03-01 */
127         rsRetVal (*SetbDisableLFDelim)(tcpsrv_t*, int);
128         /* added v10 -- rgerhards, 2011-04-01 */
129         rsRetVal (*SetUseFlowControl)(tcpsrv_t*, int);
130         /* added v11 -- rgerhards, 2011-05-09 */
131         rsRetVal (*SetKeepAlive)(tcpsrv_t*, int);
132 ENDinterface(tcpsrv)
133 #define tcpsrvCURR_IF_VERSION 11 /* increment whenever you change the interface structure! */
134 /* change for v4:
135  * - SetAddtlFrameDelim() added -- rgerhards, 2008-12-10
136  * - SetInputName() added -- rgerhards, 2008-12-10
137  * change for v5 and up: see above
138  */
139
140
141 /* prototypes */
142 PROTOTYPEObj(tcpsrv);
143
144 /* the name of our library binary */
145 #define LM_TCPSRV_FILENAME "lmtcpsrv"
146
147 #endif /* #ifndef INCLUDED_TCPSRV_H */