1 /*
2  * Argus Software.  Argus files - Output include file
3  * Copyright (c) 2000-2015 QoSient, LLC
4  * All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10 
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15 
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  *
20  */
21 
22 /*
23  * $Id: //depot/argus/argus/argus/ArgusOutput.h#23 $
24  * $DateTime: 2015/04/06 10:38:44 $
25  * $Change: 2973 $
26  */
27 
28 
29 
30 #ifndef ArgusOutput_h
31 #define ArgusOutput_h
32 
33 #define ARGUS_MONITORPORT		561
34 #define ARGUS_MAXLISTEN			10
35 
36 #define ARGUS_CLIENT_STARTUP_TIMEOUT    5
37 
38 #include <unistd.h>
39 #if defined(HAVE_STDLIB_H)
40 #include <stdlib.h>
41 #endif
42 #include <limits.h>
43 
44 #include <sys/socket.h>
45 #include <netdb.h>
46 
47 #include <stdio.h>
48 #include <errno.h>
49 #include <string.h>
50 #include <strings.h>
51 
52 #include <sys/types.h>
53 #include <sys/stat.h>
54 #include <sys/socket.h>
55 
56 #if defined(__NetBSD__)
57 #include <sys/sched.h>
58 #else
59 #include <sched.h>
60 #endif
61 
62 #include <fcntl.h>
63 #include <signal.h>
64 
65 #if !defined(ARGUS_TILERA)
66 #include <pcap.h>
67 #endif
68 
69 #include <argus_filter.h>
70 
71 #ifdef ARGUS_SASL
72 #include <sasl/sasl.h>
73 #endif
74 
75 struct ArgusClientData {
76    struct ArgusQueueHeader qhdr;
77    int fd, type, ArgusClientStart;
78    int ArgusFilterInitialized;
79    struct timeval startime, lasttime;
80    struct ArgusSocketStruct *sock;
81    struct nff_program ArgusNFFcode;
82    char *filename, *hostname, *filter;
83 
84 #if defined(HAVE_GETADDRINFO)
85    struct addrinfo *host;
86 #endif
87 
88 #ifdef ARGUS_SASL
89    sasl_conn_t *sasl_conn;
90    struct {
91       char *ipremoteport;
92       char *iplocalport;
93       sasl_ssf_t ssf;
94       char *authid;
95    } saslprops;
96 #endif
97 };
98 
99 struct ArgusBindAddrStruct {
100    struct ArgusListObjectStruct *nxt;
101    char *addr;
102 };
103 
104 
105 
106 struct ArgusOutputStruct {
107    struct ArgusSourceStruct *ArgusSrc;
108    struct ArgusModelerStruct *ArgusModel;
109    struct ArgusListStruct *ArgusWfileList;
110 
111    struct ArgusListStruct *ArgusOutputList;
112    struct ArgusListStruct *ArgusInputList;
113 
114    struct ArgusQueueStruct *ArgusClients;
115    struct ArgusListStruct *ArgusBindAddrs;
116    struct ArgusRecord *ArgusInitMar;
117 
118    long long ArgusTotalRecords, ArgusLastRecords;
119 
120    int status;
121 
122 #if defined(ARGUS_THREADS)
123    pthread_t thread;
124    pthread_mutex_t lock;
125 #endif
126 
127    int ArgusWriteStdOut;
128    int ArgusOutputSequence;
129 
130 #if defined(HAVE_GETADDRINFO)
131    struct addrinfo ArgusAddrInfo;
132 #endif
133 
134    int ArgusPortNum;
135    int ArgusLfd[ARGUS_MAXLISTEN];
136    int ArgusListens, nflag;
137 
138    char *ArgusBindPort;
139 
140    struct timeval ArgusGlobalTime;
141    struct timeval ArgusStartTime;
142    struct timeval ArgusReportTime;
143    struct timeval ArgusLastMarUpdateTime;
144    struct timeval ArgusMarReportInterval;
145 };
146 
147 struct ArgusWfileStruct {
148    struct ArgusListObjectStruct *nxt;
149    char *filename;
150    char *filter;
151 };
152 
153 
154 #if defined(ArgusOutput)
155 
156 struct ArgusOutputStruct *ArgusOutputTask = NULL;
157 
158 struct ArgusOutputStruct *ArgusNewOutput (struct ArgusSourceStruct *, struct ArgusModelerStruct *);
159 
160 void ArgusCloseOutput (struct ArgusOutputStruct *);
161 
162 void ArgusInitOutput (struct ArgusOutputStruct *);
163 void ArgusInitOutputProcess(void);
164 
165 void *ArgusOutputProcess(void *);
166 
167 int ArgusEstablishListen (struct ArgusOutputStruct *, char *);
168 int  ArgusTcpWrapper (int, struct sockaddr *);
169 
170 void ArgusUsr1Sig (int);
171 void ArgusUsr2Sig (int);
172 void ArgusChildExit (int);
173 
174 void ArgusClientError(void);
175 void ArgusInitClientProcess(struct ArgusClientData *, struct ArgusWfileStruct *);
176 
177 #if defined(ARGUS_TILERA)
178 #else
179 extern char *ArgusFilterCompile(struct nff_program *, char *, int);
180 extern unsigned int argus_filter (struct bpf_insn *, unsigned char *);
181 #endif
182 extern int getArgusPortNum(void);
183 
184 #else
185 
186 #if defined(Argus)
187 int getArgusPortNum(struct ArgusOutputStruct *);
188 int getArgusPortType(struct ArgusOutputStruct *);
189 void setArgusPortNum(struct ArgusOutputStruct *, int);
190 
191 void setArgusBindAddr (struct ArgusOutputStruct *, char *);
192 void setArgusBindPort (struct ArgusOutputStruct *, char *);
193 char *getArgusBindAddr (struct ArgusOutputStruct *);
194 char *getArgusBindPort (struct ArgusOutputStruct *);
195 #endif
196 
197 extern struct timeval ArgusReportTime;
198 extern int ArgusPortNum;
199 extern char *ArgusBindAddr;
200 extern int ArgusOutfd;
201 
202 extern struct ArgusOutputStruct *ArgusOutputTask;
203 extern struct ArgusOutputStruct *ArgusNewOutput (struct ArgusSourceStruct *, struct ArgusModelerStruct *);
204 extern void ArgusCloseOutput (struct ArgusOutputStruct *);
205 
206 extern void ArgusInitOutput (struct ArgusOutputStruct *);
207 extern void ArgusInitOutputProcess(void);
208 
209 extern void ArgusSendOutputData(int, struct ArgusRecord *);
210 extern int ArgusHandleData(struct ArgusSocketStruct *, unsigned char *, int, void *);
211 extern int ArgusHandleClientData(struct ArgusSocketStruct *, unsigned char *, int, void *);
212 
213 extern void ArgusOutputProcess(void *);
214 extern void *ArgusClientProcess(struct ArgusClientData *, struct ArgusWfileStruct *);
215 
216 extern char *getArgusWfile(void);
217 extern void setArgusWfile(char *, char *);
218 
219 extern struct timeval *getArgusMarReportInterval(struct ArgusOutputStruct *);
220 extern void setArgusMarReportInterval(struct ArgusOutputStruct *, char *);
221 
222 extern void ArgusCheckClientStatus (struct ArgusOutputStruct *, int);
223 extern int ArgusEstablishListen (struct ArgusOutputStruct *, char *);
224 extern int  ArgusTcpWrapper (int, struct sockaddr *);
225 
226 extern void ArgusCloseSocket (int);
227 extern void ArgusCloseClients (void);
228 
229 extern void ArgusUsr1Sig (int);
230 extern void ArgusUsr2Sig (int);
231 
232 extern void ArgusClientError(void);
233 extern void ArgusInitClientProcess(struct ArgusClientData *, struct ArgusWfileStruct *);
234 
235 #endif
236 #endif /* #ifndef ArgusOutput_h */
237 
238