1 /*!\file 2 \brief Declaration of the structures and functions. 3 */ 4 5 #ifdef __MINGW32__ 6 #define __attribute__(a) 7 #endif 8 9 #include "include/fileobject.h" 10 11 //! \brief Constants to compare the log level to display messages 12 enum DebugLogLevel 13 { 14 //! Process informational messages. 15 LogLevel_Process=1, 16 //! Debug level messages. 17 LogLevel_Debug, 18 //! Display the source file name and line number along with the message. 19 LogLevel_Source, 20 //! Display data about what is processed 21 LogLevel_Data 22 }; 23 24 struct ReadLogStruct;//forward declaration 25 26 struct getwordstruct 27 { 28 const char *current; 29 const char *beginning; 30 int modified; 31 }; 32 33 typedef struct longlinestruct *longline; 34 35 struct generalitemstruct 36 { 37 //! \c True if the entry is for the total of the file or \c false if it is a single line. 38 int total; 39 //! The user to which the entry apply. The length is limited to ::MAX_USER_LEN. 40 char *user; 41 //! The number of accesses performed by the user. 42 long long nacc; 43 //! The number of bytes transfered. 44 long long nbytes; 45 //! The URL accessed by the user. The length is not limited. 46 char *url; 47 //! The source IP address of the user. The length is limited to ::MAX_IP_LEN. 48 char *ip; 49 //! The time of the access. The length is limited to ::MAX_DATETIME_LEN. 50 char *time; 51 //! The date of the access. The length is limited to ::MAX_DATETIME_LEN. 52 char *date; 53 //! The number of milliseconds spend processing the request. 54 long long nelap; 55 //! The number of bytes fetched from the cache of the proxy (cache hit). 56 long long incache; 57 //! The number of bytes fetched from the site (cache miss). 58 long long oucache; 59 }; 60 61 /*! 62 * \brief Error codes returned by process_user. 63 */ 64 enum UserProcessError 65 { 66 USERERR_NoError, 67 USERERR_NameTooLong, 68 USERERR_Excluded, 69 USERERR_InvalidChar, 70 USERERR_EmptyUser, 71 USERERR_SysUser, 72 USERERR_Ignored, 73 USERERR_Untracked, 74 }; 75 76 /*! \brief What is known about a user. 77 */ 78 struct userinfostruct 79 { 80 //! The ID of the user as found in the input file. 81 const char *id; 82 //! The user's IP address. 83 const char *ip; 84 //! \c True if the ID is in fact the IP address from which the user connected. 85 bool id_is_ip; 86 //! \c True if the user doesn't have a report file. 87 bool no_report; 88 //! The name of the user to display in the report. 89 const char *label; 90 //! The mangled name to use in file names of that user. 91 const char *filename; 92 //! \c True if this user is in the topuser list. 93 int topuser; 94 //! A general purpose flag that can be set when scanning the user's list. 95 int flag; 96 #ifdef ENABLE_DOUBLE_CHECK_DATA 97 //! Total number of bytes. 98 long long int nbytes; 99 //! Total time spent processing the requests. 100 long long int elap; 101 #endif 102 }; 103 104 //! Scan through the known users. 105 typedef struct userscanstruct *userscan; 106 107 /*! \brief Global statistics 108 */ 109 struct globalstatstruct 110 { 111 //! Total number of accesses. 112 long long int nacc; 113 //! Total number of bytes. 114 long long int nbytes; 115 //! Total time spent processing the requests. 116 long long int elap; 117 //! Amount of data fetched from the cache. 118 long long int incache; 119 //! Amount of data not fetched from the cache. 120 long long int oucache; 121 //! The number of users in the topuser list. 122 int totuser; 123 }; 124 125 //! The object to store the daily statistics. 126 typedef struct DayStruct *DayObject; 127 128 /*! 129 \brief Log filtering criterion. 130 */ 131 struct ReadLogDataStruct 132 { 133 //! The filtering date range. 134 char DateRange[255]; 135 //! First date to include in the report. The format is year*10000+month+100+day. 136 int StartDate; 137 //! Last date to include in the report. The format is year*10000+month+100+day. 138 int EndDate; 139 //! \c True to filter on hosts. 140 bool HostFilter; 141 //! \c True to filter on users. 142 bool UserFilter; 143 //! Maximum elpased time allowed. Any time greater than this value is set to zero. 144 long int max_elapsed; 145 //! \c True to restrict the log to the system users. 146 bool SysUsers; 147 //! The start time to include in the report(H*100+M). Set to -1 to disable. 148 int StartTime; 149 //! The end time to include in the report(H*100+M). Set to -1 to disable. 150 int EndTime; 151 }; 152 153 /*! 154 \brief How to handle the per_user_limit file creation. 155 */ 156 enum PerUserFileCreationEnum 157 { 158 //! Purge the file if it exists or create an empty file. 159 PUFC_Always, 160 //! Delete old files and don't create a new file unless necessary. 161 PUFC_AsRequired 162 }; 163 164 /*! 165 \brief What to write into the per_user_limit file. 166 */ 167 enum PerUserOutputEnum 168 { 169 PUOE_UserId, 170 PUOE_UserIp 171 }; 172 173 /*! 174 \brief How to log every user crossing the download limit. 175 */ 176 struct PerUserLimitStruct 177 { 178 //! File to save the user's IP or ID to. 179 char File[255]; 180 //! Limit above which the user is reported. 181 int Limit; 182 //! What to write into the file. 183 enum PerUserOutputEnum Output; 184 }; 185 186 // auth.c 187 void htaccess(const struct userinfostruct *uinfo); 188 189 // authfail.c 190 void authfail_open(void); 191 void authfail_write(const struct ReadLogStruct *log_entry); 192 void authfail_close(void); 193 bool is_authfail(void); 194 void authfail_report(void); 195 void authfail_cleanup(void); 196 197 // convlog.c 198 void convlog(const char* arq, char df, const struct ReadLogDataStruct *ReadFilter); 199 200 // css.c 201 void css_content(FILE *fp_css); 202 void css(FILE *fp_css); 203 204 // dansguardian_log.c 205 void dansguardian_log(const struct ReadLogDataStruct *ReadFilter); 206 207 // dansguardian_report.c 208 void dansguardian_report(void); 209 210 // datafile.c 211 void data_file(char *tmp); 212 213 // decomp.c 214 FileObject *decomp(const char *arq); 215 216 // denied.c 217 void denied_open(void); 218 void denied_write(const struct ReadLogStruct *log_entry); 219 void denied_close(void); 220 bool is_denied(void); 221 void gen_denied_report(void); 222 void denied_cleanup(void); 223 224 // download.c 225 void download_open(void); 226 void download_write(const struct ReadLogStruct *log_entry,const char *url); 227 void download_close(void); 228 bool is_download(void); 229 void download_report(void); 230 void free_download(void); 231 void set_download_suffix(const char *list); 232 bool is_download_suffix(const char *url); 233 void download_cleanup(void); 234 235 // email.c 236 FILE *Email_OutputFile(const char *Module); 237 void Email_Send(FILE *fp,const char *Subject); 238 239 // exclude.c 240 void gethexclude(const char *hexfile, int debug); 241 void getuexclude(const char *uexfile, int debug); 242 int vhexclude(const char *url); 243 int vuexclude(const char *user); 244 bool is_indexonly(void); 245 void free_exclude(void); 246 247 #ifndef HAVE_FNMATCH 248 // fnmtach.c 249 int fnmatch(const char *pattern,const char *string,int flags); 250 #endif 251 252 // getconf.c 253 void getconf(const char *File); 254 255 // grepday.c 256 void greport_prepare(void); 257 void greport_day(const struct userinfostruct *user); 258 void greport_cleanup(void); 259 260 // html.c 261 void htmlrel(void); 262 263 // indexonly.c 264 void index_only(const char *dirname,int debug); 265 266 // ip2name.c 267 int ip2name_config(const char *param); 268 void ip2name_forcedns(void); 269 void ip2name(char *ip,int ip_len); 270 void ip2name_cleanup(void); 271 void name2ip(char *name,int name_size); 272 273 // lastlog.c 274 void mklastlog(const char *outdir); 275 276 // longline.c 277 __attribute__((warn_unused_result)) /*@null@*//*@only@*/longline longline_create(void); 278 void longline_reset(longline line); 279 /*@null@*/char *longline_read(FileObject *fp_in,/*@null@*/longline line); 280 void longline_destroy(/*@out@*//*@only@*//*@null@*/longline *line_ptr); 281 282 // index.c 283 void make_index(void); 284 285 // readlog.c 286 int ReadLogFile(struct ReadLogDataStruct *Filter); 287 bool GetLogPeriod(struct tm *Start,struct tm *End); 288 289 // realtime.c 290 void realtime(void); 291 292 // redirector.c 293 void redirector_log(const struct ReadLogDataStruct *ReadFilter); 294 void redirector_report(void); 295 296 // repday.c 297 void report_day(const struct userinfostruct *user); 298 299 // report.c 300 void gerarel(const struct ReadLogDataStruct *ReadFilter); 301 int ger_read(char *buffer,struct generalitemstruct *item,const char *filename); 302 void totalger(FILE *fp_gen,const char *filename); 303 304 // siteuser.c 305 void siteuser(void); 306 307 // smartfilter.c 308 void smartfilter_report(void); 309 310 // sort.c 311 void sort_users_log(const char *tmp, int debug,struct userinfostruct *uinfo); 312 void tmpsort(const struct userinfostruct *uinfo); 313 void sort_labels(const char **label,const char **order); 314 315 // splitlog.c 316 void splitlog(const char *arq, char df, const struct ReadLogDataStruct *ReadFilter, int convert, const char *splitprefix); 317 318 // topsites.c 319 void topsites(void); 320 321 // topuser.c 322 void topuser(void); 323 324 // totday.c 325 DayObject day_prepare(void); 326 void day_cleanup(DayObject ddata); 327 void day_newuser(DayObject ddata); 328 void day_addpoint(DayObject ddata,const char *date, const char *time, long long int elap, long long int bytes); 329 void day_totalize(DayObject ddata,const char *tmp, const struct userinfostruct *uinfo); 330 void day_deletefile(const struct userinfostruct *uinfo); 331 332 // url.c 333 void read_hostalias(const char *Filename); 334 void free_hostalias(void); 335 const char *skip_scheme(const char *url); 336 const char *process_url(const char *url,bool full_url); 337 void url_hostname(const char *url,char *hostname,int hostsize); 338 339 // usage.c 340 void usage(const char *prog); 341 342 // useragent.c 343 FILE *UserAgent_Open(void); 344 void UserAgent_Write(FILE *fp,const struct tm *Time,const char *Ip,const char *User,const char *Agent); 345 void UserAgent_Readlog(const struct ReadLogDataStruct *ReadFilter); 346 void UserAgent(void); 347 348 // userinfo.c 349 /*@shared@*/struct userinfostruct *userinfo_create(const char *userid, const char *ip); 350 void userinfo_free(void); 351 void userinfo_label(struct userinfostruct *uinfo,const char *label); 352 /*@shared@*/struct userinfostruct *userinfo_find_from_file(const char *filename); 353 /*@shared@*/struct userinfostruct *userinfo_find_from_id(const char *id); 354 /*@shared@*/struct userinfostruct *userinfo_find_from_ip(const char *ip); 355 userscan userinfo_startscan(void); 356 void userinfo_stopscan(userscan uscan); 357 struct userinfostruct *userinfo_advancescan(userscan uscan); 358 void userinfo_clearflag(void); 359 void read_useralias(const char *Filename); 360 void free_useralias(void); 361 enum UserProcessError process_user(const char **UserPtr,const char *IpAddress,bool *IsIp); 362 363 // usertab.c 364 void init_usertab(const char *UserTabFile); 365 void user_find(char *mappedname, int namelen, const char *userlogin); 366 void close_usertab(void); 367 368 // util.c 369 void getword_start(/*@out@*/struct getwordstruct *gwarea, const char *line); 370 void getword_restart(struct getwordstruct *gwarea); 371 __attribute__((warn_unused_result)) int getword(/*@out@*/char *word, int limit, struct getwordstruct *gwarea, char stop); 372 __attribute__((warn_unused_result)) int getword_limit(/*@out@*/char *word, int limit, struct getwordstruct *gwarea, char stop); 373 __attribute__((warn_unused_result)) int getword_multisep(/*@out@*/char *word, int limit, struct getwordstruct *gwarea, char stop); 374 __attribute__((warn_unused_result)) int getword_skip(int limit, struct getwordstruct *gwarea, char stop); 375 __attribute__((warn_unused_result)) int getword_atoll(/*@out@*/long long int *number, struct getwordstruct *gwarea, char stop); 376 __attribute__((warn_unused_result)) int getword_atoi(/*@out@*/int *number, struct getwordstruct *gwarea, char stop); 377 __attribute__((warn_unused_result)) int getword_atol(long int *number, struct getwordstruct *gwarea, char stop); 378 __attribute__((warn_unused_result)) int getword_atolu(unsigned long int *number, struct getwordstruct *gwarea, char stop); 379 __attribute__((warn_unused_result)) int getword_ptr(char *orig_line,/*@out@*/char **word, struct getwordstruct *gwarea, char stop); 380 long long int my_atoll (const char *nptr); 381 int is_absolute(const char *path); 382 void getnumlist(const char *paramname, const char *buffer, int *list, int maxvalue); 383 bool numlistcontains(const int *list, int maxvalue, int value); 384 int conv_month(const char *month); 385 const char *conv_month_name(int month); 386 void buildymd(const char *dia, const char *mes, const char *ano, char *wdata,int wdata_size); 387 void date_from(struct ReadLogDataStruct *ReadFilter); 388 char *fixnum(long long int value, int n); 389 char *fixnum2(long long int value, int n); 390 void fixnone(char *str); 391 char *fixtime(long long int elap); 392 void fixendofline(char *str); 393 void show_info(FILE *fp_ou); 394 void show_sarg(FILE *fp_ou, int depth); 395 void write_logo_image(FILE *fp_ou); 396 void write_html_head(FILE *fp_ou, int depth, const char *page_title,int javascript); 397 void write_html_header(FILE *fp_ou, int depth, const char *title,int javascript); 398 void close_html_header(FILE *fp_ou); 399 void write_html_trailer(FILE *fp_ou); 400 void output_html_string(FILE *fp_ou,const char *str,int maxlen); 401 void output_html_url(FILE *fp_ou,const char *url); 402 void output_html_link(FILE *fp_ou,const char *url,int maxlen); 403 void debuga(const char *File, int Line, const char *msg,...) __attribute__((format(printf,3,4))); 404 void debuga_more(const char *msg,...) __attribute__((format(printf,1,2))); 405 void debugaz(const char *File,int Line,const char *msg,...) __attribute__((format(printf,3,4))); 406 void my_lltoa(unsigned long long int n, char *s, int ssize, int len); 407 void url_module(const char *url, char *w2); 408 void url_to_anchor(const char *url,char *anchor,int size); 409 void safe_strcpy(char *dest,const char *src,int length); 410 void strip_latin(char *line); 411 char *buildtime(long long int elap); 412 int obtdate(const char *dirname, const char *name, char *data); 413 void formatdate(char *date,int date_size,int year,int month,int day,int hour,int minute,int second,int dst); 414 void computedate(int year,int month,int day,struct tm *t); 415 int obtuser(const char *dirname, const char *name); 416 void obttotal(const char *dirname, const char *name, int nuser, long long int *tbytes, long long int *media); 417 void version(void); 418 int vercode(const char *code); 419 void load_excludecodes(const char *ExcludeCodes); 420 void free_excludecodes(void); 421 int PortableMkDir(const char *path,int mode); 422 bool my_mkdir(const char *name); 423 void makeTmpDir(const char *tmp); 424 int testvaliduserchar(const char *user); 425 char *strlow(char *string); 426 char *strup(char *string); 427 int month2num(const char *month); 428 int builddia(int day, int month, int year); 429 int compare_date(const struct tm *date1,const struct tm *date2); 430 bool IsTreeFileDirName(const char *Name); 431 bool IsTreeYearFileName(const char *Name); 432 bool IsTreeMonthFileName(const char *Name); 433 bool IsTreeDayFileName(const char *Name); 434 int vrfydir(const struct periodstruct *per1, const char *addr, const char *site, const char *us); 435 int getperiod_fromsarglog(const char *arqtt,struct periodstruct *period); 436 void getperiod_fromrange(struct periodstruct *period,const struct ReadLogDataStruct *ReadFilter); 437 void getperiod_torange(const struct periodstruct *period,int *dfrom,int *duntil); 438 void getperiod_merge(struct periodstruct *main,struct periodstruct *candidate); 439 int getperiod_buildtext(struct periodstruct *period); 440 void removetmp(const char *outdir); 441 void zdate(char *ftime,int ftimesize, char DateFormat); 442 char *get_param_value(const char *param,char *line); 443 int compar( const void *, const void * ); 444 void unlinkdir(const char *dir,bool contentonly); 445 void emptytmpdir(const char *dir); 446 int extract_address_mask(const char *buf,const char **text,unsigned char *ipv4,unsigned short int *ipv6,int *nbits,const char **next); 447 int format_path(const char *file, int line, char *output_buffer, int buffer_size, const char *format,...); 448 void append_to_path(char *base_path, int base_path_size, const char *append); 449