1 /*
2  * Argus Software
3  * Copyright (c) 2000-2016 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/clients/include/argus_output.h#6 $
24  * $DateTime: 2016/06/01 15:17:28 $
25  * $Change: 3148 $
26  */
27 
28 
29 #ifndef ArgusRadium_h
30 #define ArgusRadium_h
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 #define ARGUS_MONITORPORT	561
37 #define ARGUS_MAXLISTEN		32
38 
39 #include <unistd.h>
40 #include <stdlib.h>
41 #include <limits.h>
42 
43 #include <stdio.h>
44 #include <errno.h>
45 #include <string.h>
46 #include <strings.h>
47 
48 #include <sys/types.h>
49 #include <sys/stat.h>
50 #include <sys/socket.h>
51 
52 #include <sys/wait.h>
53 
54 #if defined(__NetBSD__)
55 #include <sys/sched.h>
56 #else
57 #include <sched.h>
58 #endif
59 
60 #include <fcntl.h>
61 #include <signal.h>
62 #include <ctype.h>
63 
64 #include <argus_util.h>
65 #include <argus_client.h>
66 #include <argus_main.h>
67 
68 #include <argus_filter.h>
69 
70 #ifdef ARGUS_SASL
71 #include <sasl/sasl.h>
72 #endif
73 
74 #define ARGUS_READINGPREHDR     1
75 #define ARGUS_READINGHDR        2
76 #define ARGUS_READINGBLOCK      4
77 
78 #define ARGUS_WAS_FUNCTIONAL            0x10
79 #define ARGUS_SOCKET_COMPLETE           0x20
80 #define ARGUS_MAXRECORD                 0x10000
81 
82 #define ARGUS_CLIENT_STARTUP_TIMEOUT	5
83 
84 struct ArgusSocketStruct {
85    struct ArgusListStruct *ArgusOutputList;
86    int fd, status, cnt, expectedSize, errornum;
87    int ArgusLastRecord, ArgusReadState;
88    struct timeval lastwrite;
89    unsigned char buf[ARGUS_MAXRECORD], *ptr;
90    struct ArgusRecordStruct *rec;
91    int length, writen;
92    struct sockaddr sock;
93    struct stat statbuf;
94    char *filename;
95    void *obj;
96 };
97 
98 
99 struct ArgusClientData {
100    struct ArgusQueueHeader qhdr;
101    int fd, pid, ArgusClientStart;
102    int ArgusFilterInitialized;
103    struct timeval startime, lasttime;
104    struct ArgusSocketStruct *sock;
105    struct nff_program ArgusNFFcode;
106    char *filename, *hostname, *filter;
107    int format;
108 
109 #if defined(HAVE_GETADDRINFO)
110    struct addrinfo *host;
111 #endif
112 
113 #ifdef ARGUS_SASL
114    sasl_conn_t *sasl_conn;
115    struct {
116       char *ipremoteport;
117       char *iplocalport;
118       sasl_ssf_t ssf;
119       char *authid;
120    } saslprops;
121 #endif
122 };
123 
124 struct ArgusOutputStruct {
125    int status, format;
126 
127 #if defined(ARGUS_THREADS)
128    pthread_t thread;
129    pthread_mutex_t lock;
130 #endif
131 
132    struct ArgusSourceStruct *ArgusSrc;
133    struct ArgusParserStruct *ArgusParser;
134    struct ArgusListStruct *ArgusWfileList;
135    struct ArgusListStruct *ArgusInputList;
136    struct ArgusListStruct *ArgusOutputList;
137    struct ArgusQueueStruct *ArgusClients;
138    struct ArgusRecord *ArgusInitMar;
139 
140    long long ArgusTotalRecords, ArgusLastRecords;
141    int ArgusWriteStdOut, ArgusOutputSequence;
142    int ArgusPortNum, nflag;
143    int ArgusLfd[ARGUS_MAXLISTEN];
144    int ArgusListens;
145 
146    char *ArgusBindAddr;
147 
148    struct timeval ArgusGlobalTime;
149    struct timeval ArgusStartTime;
150    struct timeval ArgusReportTime;
151    struct timeval ArgusNextUpdate;
152    struct timeval ArgusLastMarUpdateTime;
153    struct timeval ArgusMarReportInterval;
154    unsigned int ArgusLocalNet, ArgusNetMask;
155 };
156 
157 
158 
159 #if defined(ArgusOutput)
160 
161 struct ArgusOutputStruct *ArgusOutputTask = NULL;
162 
163 void *ArgusOutputProcess(void *);
164 
165 void ArgusUsr1Sig (int);
166 void ArgusUsr2Sig (int);
167 void ArgusChildExit (int);
168 
169 void ArgusClientError(void);
170 void ArgusInitClientProcess(struct ArgusClientData *, struct ArgusWfileStruct *);
171 
172 #else
173 
174 
175 
176 #define ARGUS_MAXPROCESS		0x10000
177 
178 extern void clearArgusWfile(struct ArgusParserStruct *);
179 
180 int  ArgusTcpWrapper (int, struct sockaddr *, char *);
181 
182 int RadiumParseResourceFile (struct ArgusParserStruct *, char *);
183 int ArgusEstablishListen (struct ArgusParserStruct *, int, char *);
184 
185 struct ArgusRecord *ArgusGenerateInitialMar (struct ArgusOutputStruct *);
186 struct ArgusRecordStruct *ArgusGenerateInitialMarRecord (struct ArgusOutputStruct *);
187 struct ArgusRecordStruct *ArgusGenerateStatusMarRecord (struct ArgusOutputStruct *, unsigned char);
188 
189 void setArgusMarReportInterval (struct ArgusParserStruct *, char *);
190 struct timeval *getArgusMarReportInterval(struct ArgusParserStruct *);
191 void setArgusPortNum (struct ArgusParserStruct *, int, char *);
192 int getArgusPortNum(struct ArgusParserStruct *);
193 void setArgusOflag(struct ArgusParserStruct *, unsigned int);
194 unsigned int getArgusIDType(struct ArgusParserStruct *);
195 void setArgusBindAddr (struct ArgusParserStruct *, char *);
196 void setArgusID(struct ArgusParserStruct *, void *, unsigned int);
197 unsigned int getArgusID(struct ArgusParserStruct *);
198 void clearRadiumConfiguration (void);
199 
200 struct ArgusRecordStruct *ArgusCopyRecordStruct (struct ArgusRecordStruct *);
201 
202 void *ArgusOutputProcess(void *);
203 void ArgusInitOutput (struct ArgusOutputStruct *);
204 struct ArgusOutputStruct *ArgusNewOutput (struct ArgusParserStruct *);
205 void ArgusDeleteOutput (struct ArgusParserStruct *, struct ArgusOutputStruct *);
206 struct ArgusSocketStruct *ArgusNewSocket (int);
207 void ArgusDeleteSocket (struct ArgusOutputStruct *, struct ArgusClientData *);
208 void ArgusCloseOutput(struct ArgusOutputStruct *);
209 
210 int ArgusWriteSocket (struct ArgusOutputStruct *, struct ArgusClientData *, struct ArgusRecordStruct *);
211 int ArgusWriteOutSocket (struct ArgusOutputStruct *, struct ArgusClientData *);
212 
213 extern void ArgusLoadList(struct ArgusListStruct *, struct ArgusListStruct *);
214 extern void ArgusCloseInput(struct ArgusParserStruct *parser, struct ArgusInput *);
215 
216 extern struct ArgusOutputStruct *ArgusOutputTask;
217 
218 extern void ArgusCloseSocket (int);
219 extern void ArgusCloseClients (void);
220 
221 extern void ArgusUsr1Sig (int);
222 extern void ArgusUsr2Sig (int);
223 
224 extern void ArgusClientError(void);
225 extern void ArgusInitClientProcess(struct ArgusClientData *, struct ArgusWfileStruct *);
226 
227 #endif
228 #ifdef __cplusplus
229 }
230 #endif
231 #endif /* #ifndef ArgusRadium_h */
232 
233