/* webalizer - a web server log analysis program Copyright (C) 1997-2001 Bradford L. Barrett (brad@mrunix.net) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version, and provided that the above copyright and permission notice is included with all distributed copies of this or derived software. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA This software uses the gd graphics library, which is copyright by Quest Protein Database Center, Cold Spring Harbor Labs. Please see the documentation supplied with the library for additional information and license terms, or visit www.boutell.com/gd/ for the most recent version of the library and supporting documentation. */ /*********************************************/ /* STANDARD INCLUDES */ /*********************************************/ #include #include #include #include #include /* normal stuff */ #include #include #include #include #include /* ensure getopt */ #ifdef HAVE_GETOPT_H #include #endif /* ensure sys/types */ #ifndef _SYS_TYPES_H #include #endif /* some systems need this */ #ifdef HAVE_MATH_H #include #endif /* SunOS 4.x Fix */ #ifndef CLK_TCK #define CLK_TCK _SC_CLK_TCK #endif #include "webalizer.h" /* main header */ #include "lang.h" #include "hashtab.h" #include "preserve.h" #include "linklist.h" #include "graphs.h" #include "output.h" /* internal function prototypes */ void write_html_head(char *, FILE *); /* head of html page */ void write_html_tail(FILE *); /* tail of html page */ void month_links(); /* Page links */ void month_total_table(); /* monthly total table */ void daily_total_table(); /* daily total table */ void hourly_total_table(); /* hourly total table */ void top_sites_table(int); /* top n sites table */ void top_urls_table(int); /* top n URL's table */ void top_entry_table(int); /* top n entry/exits */ void top_refs_table(); /* top n referrers "" */ void top_agents_table(); /* top n u-agents "" */ void top_ctry_table(); /* top n countries "" */ void top_search_table(); /* top n search strs */ void top_users_table(); /* top n ident table */ u_long load_url_array( UNODEPTR *); /* load URL array */ u_long load_site_array( HNODEPTR *); /* load Site array */ u_long load_ref_array( RNODEPTR *); /* load Refs array */ u_long load_agent_array(ANODEPTR *); /* load Agents array */ u_long load_srch_array( SNODEPTR *); /* load srch str array */ u_long load_ident_array(INODEPTR *); /* load ident array */ int qs_url_cmph( const void*, const void*); /* compare by hits */ int qs_url_cmpk( const void*, const void*); /* compare by kbytes */ int qs_url_cmpn( const void*, const void*); /* compare by entrys */ int qs_url_cmpx( const void*, const void*); /* compare by exits */ int qs_site_cmph(const void*, const void*); /* compare by hits */ int qs_site_cmpk(const void*, const void*); /* compare by kbytes */ int qs_ref_cmph( const void*, const void*); /* compare by hits */ int qs_agnt_cmph(const void*, const void*); /* compare by hits */ int qs_srch_cmph(const void*, const void*); /* compare by hits */ int qs_ident_cmph(const void*, const void*); /* compare by hits */ int qs_ident_cmpk(const void*, const void*); /* compare by kbytes */ int all_sites_page(u_long, u_long); /* output site page */ int all_urls_page(u_long, u_long); /* output urls page */ int all_refs_page(u_long, u_long); /* output refs page */ int all_agents_page(u_long, u_long); /* output agents page */ int all_search_page(u_long, u_long); /* output search page */ int all_users_page(u_long, u_long); /* output ident page */ void dump_all_sites(); /* dump sites tab file */ void dump_all_urls(); /* dump urls tab file */ void dump_all_refs(); /* dump refs tab file */ void dump_all_agents(); /* dump agents file */ void dump_all_users(); /* dump usernames file */ void dump_all_search(); /* dump search file */ /* define some colors for HTML */ #define WHITE "#FFFFFF" #define BLACK "#000000" #define RED "#FF0000" #define ORANGE "#FF8000" #define LTBLUE "#0080FF" #define BLUE "#0000FF" #define GREEN "#00FF00" #define DKGREEN "#008040" #define GREY "#C0C0C0" #define LTGREY "#E8E8E8" #define YELLOW "#FFFF00" #define PURPLE "#FF00FF" #define CYAN "#00E0FF" #define GRPCOLOR "#D0D0E0" /* sort arrays */ UNODEPTR *u_array = NULL; /* Sort array for URL's */ HNODEPTR *h_array = NULL; /* hostnames (sites) */ RNODEPTR *r_array = NULL; /* referrers */ ANODEPTR *a_array = NULL; /* user agents */ SNODEPTR *s_array = NULL; /* search strings */ INODEPTR *i_array = NULL; /* ident strings (username) */ u_long a_ctr = 0; /* counter for sort array */ FILE *out_fp; /*********************************************/ /* WRITE_HTML_HEAD - output top of HTML page */ /*********************************************/ void write_html_head(char *period, FILE *out_fp) { NLISTPTR lptr; /* used for HTMLhead processing */ /* HTMLPre code goes before all else */ lptr = html_pre; if (lptr==NULL) { /* Default 'DOCTYPE' header record if none specified */ fprintf(out_fp, "\n\n"); } else { while (lptr!=NULL) { fprintf(out_fp,"%s\n",lptr->string); lptr=lptr->next; } } /* Standard header comments */ fprintf(out_fp,"\n", version,editlvl); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n\n",cur_time()); fprintf(out_fp,"\n\n"); fprintf(out_fp," %s %s - %s\n", _("Usage Statistics for"), hname, period); lptr=html_head; while (lptr!=NULL) { fprintf(out_fp,"%s\n",lptr->string); lptr=lptr->next; } fprintf(out_fp,"\n\n"); lptr = html_body; if (lptr==NULL) fprintf(out_fp,"\n", LTGREY, BLACK, BLUE, RED); else { while (lptr!=NULL) { fprintf(out_fp,"%s\n",lptr->string); lptr=lptr->next; } } fprintf(out_fp,"

%s %s

\n",_("Usage Statistics for"), hname); fprintf(out_fp,"\n%s: %s
\n",_("Summary Period"),period); fprintf(out_fp,"%s %s
\n
\n",_("Generated"),cur_time()); lptr=html_post; while (lptr!=NULL) { fprintf(out_fp,"%s\n",lptr->string); lptr=lptr->next; } fprintf(out_fp,"
\n
\n

\n"); } /*********************************************/ /* WRITE_HTML_TAIL - output HTML page tail */ /*********************************************/ void write_html_tail(FILE *out_fp) { NLISTPTR lptr; fprintf(out_fp,"

\n"); fprintf(out_fp,"

\n


\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); lptr=html_tail; if (lptr) { fprintf(out_fp,"\n"); } fprintf(out_fp,"\n
\n"); fprintf(out_fp,"Generated by\n"); fprintf(out_fp,""); fprintf(out_fp,"Webalizer Version %s\n",version); fprintf(out_fp,"\n\n"); while (lptr!=NULL) { fprintf(out_fp,"%s\n",lptr->string); lptr=lptr->next; } fprintf(out_fp,"
\n"); /* wind up, this is the end of the file */ fprintf(out_fp,"\n\n", version,editlvl,moddate); lptr = html_end; if (lptr) { while (lptr!=NULL) { fprintf(out_fp,"%s\n",lptr->string); lptr=lptr->next; } } else fprintf(out_fp,"\n\n\n"); } /*********************************************/ /* WRITE_MONTH_HTML - does what it says... */ /*********************************************/ int write_month_html() { int i; char html_fname[256]; /* filename storage areas... */ char png1_fname[32]; char png2_fname[32]; char buffer[BUFSIZE]; /* scratch buffer */ char dtitle[256]; char htitle[256]; if (verbose>1) printf("%s %s %d\n",_("Generating report for"), _(l_month[cur_month-1]), cur_year); /* update history */ i=cur_month-1; hist_month[i] = cur_month; hist_year[i] = cur_year; hist_hit[i] = t_hit; hist_files[i] = t_file; hist_page[i] = t_page; hist_visit[i] = t_visit; hist_site[i] = t_site; hist_xfer[i] = t_xfer/1024; hist_fday[i] = f_day; hist_lday[i] = l_day; /* fill in filenames */ snprintf(html_fname,sizeof(html_fname),"usage_%04d%02d.%s", cur_year,cur_month,html_ext); sprintf(png1_fname,"daily_usage_%04d%02d.png",cur_year,cur_month); sprintf(png2_fname,"hourly_usage_%04d%02d.png",cur_year,cur_month); /* create PNG images for web page */ if (daily_graph) { snprintf(dtitle,sizeof(dtitle),"%s %s %d", _("Daily usage for"),_(l_month[cur_month-1]),cur_year); month_graph6 ( png1_fname, /* filename */ dtitle, /* graph title */ cur_month, /* graph month */ cur_year, /* graph year */ tm_hit, /* data 1 (hits) */ tm_file, /* data 2 (files) */ tm_site, /* data 3 (sites) */ tm_xfer, /* data 4 (kbytes) */ tm_page, /* data 5 (pages) */ tm_visit); /* data 6 (visits) */ } if (hourly_graph) { snprintf(htitle,sizeof(htitle),"%s %s %d", _("Hourly usage for"),_(l_month[cur_month-1]),cur_year); day_graph3( png2_fname, htitle, th_hit, th_file, th_page ); } /* now do html stuff... */ /* first, open the file */ if ( (out_fp=open_out_file(html_fname))==NULL ) return 1; snprintf(buffer,sizeof(buffer),"%s %d",_(l_month[cur_month-1]),cur_year); write_html_head(buffer, out_fp); month_links(); month_total_table(); if (daily_graph || daily_stats) /* Daily stuff */ { fprintf(out_fp,"\n"); if (daily_graph) fprintf(out_fp,"\"%s\"

\n",png1_fname,dtitle); if (daily_stats) daily_total_table(); } if (hourly_graph || hourly_stats) /* Hourly stuff */ { fprintf(out_fp,"\n"); if (hourly_graph) fprintf(out_fp,"\"%s\"

\n",png2_fname,htitle); if (hourly_stats) hourly_total_table(); } /* Do URL related stuff here, sorting appropriately */ if ( (a_ctr=load_url_array(NULL)) ) { if ( (u_array=malloc(sizeof(UNODEPTR)*(a_ctr))) !=NULL ) { a_ctr=load_url_array(u_array); /* load up our sort array */ if (ntop_urls || dump_urls) { qsort(u_array,a_ctr,sizeof(UNODEPTR),qs_url_cmph); if (ntop_urls) top_urls_table(0); /* Top URL's (by hits) */ if (dump_urls) dump_all_urls(); /* Dump URLS tab file */ } if (ntop_urlsK) /* Top URL's (by kbytes) */ {qsort(u_array,a_ctr,sizeof(UNODEPTR),qs_url_cmpk); top_urls_table(1); } if (ntop_entry) /* Top Entry Pages */ {qsort(u_array,a_ctr,sizeof(UNODEPTR),qs_url_cmpn); top_entry_table(0);} if (ntop_exit) /* Top Exit Pages */ {qsort(u_array,a_ctr,sizeof(UNODEPTR),qs_url_cmpx); top_entry_table(1);} free(u_array); } else if (verbose) fprintf(stderr,"%s [u_array]\n",_("Can't allocate enough memory, Top URLs disabled!")); /* err */ } /* do hostname (sites) related stuff here, sorting appropriately... */ if ( (a_ctr=load_site_array(NULL)) ) { if ( (h_array=malloc(sizeof(HNODEPTR)*(a_ctr))) !=NULL ) { a_ctr=load_site_array(h_array); /* load up our sort array */ if (ntop_sites || dump_sites) { qsort(h_array,a_ctr,sizeof(HNODEPTR),qs_site_cmph); if (ntop_sites) top_sites_table(0); /* Top sites table (by hits) */ if (dump_sites) dump_all_sites(); /* Dump sites tab file */ } if (ntop_sitesK) /* Top Sites table (by kbytes) */ { qsort(h_array,a_ctr,sizeof(HNODEPTR),qs_site_cmpk); top_sites_table(1); } free(h_array); } else if (verbose) fprintf(stderr,"%s [h_array]\n",_("Can't allocate enough memory, Top Sites disabled!")); /* err */ } /* do referrer related stuff here, sorting appropriately... */ if ( (a_ctr=load_ref_array(NULL)) ) { if ( (r_array=malloc(sizeof(RNODEPTR)*(a_ctr))) != NULL) { a_ctr=load_ref_array(r_array); if (ntop_refs || dump_refs) { qsort(r_array,a_ctr,sizeof(RNODEPTR),qs_ref_cmph); if (ntop_refs) top_refs_table(); /* Top referrers table */ if (dump_refs) dump_all_refs(); /* Dump referrers tab file */ } free(r_array); } else if (verbose) fprintf(stderr,"%s [r_array]\n",_("Can't allocate enough memory, Top Referrers disabled!")); /* err */ } /* do search string related stuff, sorting appropriately... */ if ( (a_ctr=load_srch_array(NULL)) ) { if ( (s_array=malloc(sizeof(SNODEPTR)*(a_ctr))) != NULL) { a_ctr=load_srch_array(s_array); if (ntop_search || dump_search) { qsort(s_array,a_ctr,sizeof(SNODEPTR),qs_srch_cmph); if (ntop_search) top_search_table(); /* top search strings table */ if (dump_search) dump_all_search(); /* dump search string tab file */ } free(s_array); } else if (verbose) fprintf(stderr,"%s [s_array]\n",_("Can't allocate enough memory, Top Search Strings disabled!"));/* err */ } /* do ident (username) related stuff here, sorting appropriately... */ if ( (a_ctr=load_ident_array(NULL)) ) { if ( (i_array=malloc(sizeof(INODEPTR)*(a_ctr))) != NULL) { a_ctr=load_ident_array(i_array); if (ntop_users || dump_users) { qsort(i_array,a_ctr,sizeof(INODEPTR),qs_ident_cmph); if (ntop_users) top_users_table(); /* top usernames table */ if (dump_users) dump_all_users(); /* dump usernames tab file */ } free(i_array); } else if (verbose) fprintf(stderr,"%s [i_array]\n",_("Can't allocate enough memory, Top Usernames disabled!")); /* err */ } /* do user agent related stuff here, sorting appropriately... */ if ( (a_ctr=load_agent_array(NULL)) ) { if ( (a_array=malloc(sizeof(ANODEPTR)*(a_ctr))) != NULL) { a_ctr=load_agent_array(a_array); if (ntop_agents || dump_agents) { qsort(a_array,a_ctr,sizeof(ANODEPTR),qs_agnt_cmph); if (ntop_agents) top_agents_table(); /* top user agents table */ if (dump_agents) dump_all_agents(); /* dump user agents tab file */ } free(a_array); } else if (verbose) fprintf(stderr,"%s [a_array]\n",_("Can't allocate enough memory, Top User Agents disabled!")); /* err */ } if (ntop_ctrys ) top_ctry_table(); /* top countries table */ write_html_tail(out_fp); /* finish up the HTML document */ fclose(out_fp); /* close the file */ return (0); /* done... */ } /*********************************************/ /* MONTH_LINKS - links to other page parts */ /*********************************************/ void month_links() { fprintf(out_fp,"\n"); if (daily_stats || daily_graph) fprintf(out_fp,"[%s]\n",_("Daily Statistics")); if (hourly_stats || hourly_graph) fprintf(out_fp,"[%s]\n",_("Hourly Statistics")); if (ntop_urls || ntop_urlsK) fprintf(out_fp,"[%s]\n",_("URLs")); if (ntop_entry) fprintf(out_fp,"[%s]\n",_("Entry")); if (ntop_exit) fprintf(out_fp,"[%s]\n",_("Exit")); if (ntop_sites || ntop_sitesK) fprintf(out_fp,"[%s]\n",_("Sites")); if (ntop_refs && t_ref) fprintf(out_fp,"[%s]\n",_("Referrers")); if (ntop_search && t_ref) fprintf(out_fp,"[%s]\n",_("Search")); if (ntop_users && t_user) fprintf(out_fp,"[%s]\n",_("Users")); if (ntop_agents && t_agent) fprintf(out_fp,"[%s]\n",_("Agents")); if (ntop_ctrys) fprintf(out_fp,"[%s]\n",_("Countries")); fprintf(out_fp,"\n

\n"); } /*********************************************/ /* MONTH_TOTAL_TABLE - monthly totals table */ /*********************************************/ void month_total_table() { int i,days_in_month; u_long max_files=0,max_hits=0,max_visits=0,max_pages=0; double max_xfer=0.0; days_in_month=(l_day-f_day)+1; for (i=0;i<31;i++) { /* Get max/day values */ if (tm_hit[i]>max_hits) max_hits = tm_hit[i]; if (tm_file[i]>max_files) max_files = tm_file[i]; if (tm_page[i]>max_pages) max_pages = tm_page[i]; if (tm_visit[i]>max_visits) max_visits= tm_visit[i]; if (tm_xfer[i]>max_xfer) max_xfer = tm_xfer[i]; } fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n",GREY,_("Monthly Statistics for"), _(l_month[cur_month-1]), cur_year); fprintf(out_fp,"\n"); /* Total Hits */ fprintf(out_fp,"\n" \ "\n",_("Total Hits"),t_hit); /* Total Files */ fprintf(out_fp,"\n" \ "\n",_("Total Files"),t_file); /* Total Pages */ fprintf(out_fp,"\n" \ "\n",_("Total"), _("Pages"), t_page); /* Total Visits */ fprintf(out_fp,"\n" \ "\n",_("Total"), _("Visits"), t_visit); /* Total XFer */ fprintf(out_fp,"\n" \ "\n",_("Total KBytes"),t_xfer/1024); fprintf(out_fp,"\n"); /**********************************************/ /* Unique Sites */ fprintf(out_fp,"" \ "\n" \ "\n",_("Total Unique Sites"),t_site); /* Unique URL's */ fprintf(out_fp,"" \ "\n" \ "\n",_("Total Unique URLs"),t_url); /* Unique Referrers */ if (t_ref != 0) fprintf(out_fp,"" \ "\n" \ "\n",_("Total Unique Referrers"),t_ref); /* Unique Usernames */ if (t_user != 0) fprintf(out_fp,"" \ "\n" \ "\n",_("Total Unique Usernames"),t_user); /* Unique Agents */ if (t_agent != 0) fprintf(out_fp,"" \ "\n" \ "\n",_("Total Unique User Agents"),t_agent); fprintf(out_fp,"\n"); /**********************************************/ /* Hourly/Daily avg/max totals */ fprintf(out_fp,"" \ "\n"\ "\n" \ "\n", GREY,GREY,GREY,_("Avg"),GREY,_("Max")); fprintf(out_fp,"\n"); /* Max/Avg Hits per Hour */ fprintf(out_fp,"" \ "\n" \ "\n" \ "\n",_("Hits per Hour"), t_hit/(24*days_in_month),mh_hit); /* Max/Avg Hits per Day */ fprintf(out_fp,"" \ "\n" \ "\n" \ "\n",_("Hits per Day"), t_hit/days_in_month, max_hits); /* Max/Avg Files per Day */ fprintf(out_fp,"" \ "\n" \ "\n" \ "\n",_("Files per Day"), t_file/days_in_month,max_files); /* Max/Avg Pages per Day */ fprintf(out_fp,"" \ "\n" \ "\n" \ "\n",_("Pages per Day"), t_page/days_in_month,max_pages); /* Max/Avg Visits per Day */ fprintf(out_fp,"" \ "\n" \ "\n" \ "\n",_("Visits per Day"), t_visit/days_in_month,max_visits); /* Max/Avg KBytes per Day */ fprintf(out_fp,"" \ "\n" \ "\n" \ "\n",_("KBytes per Day"), (t_xfer/1024)/days_in_month,max_xfer/1024); fprintf(out_fp,"\n"); /**********************************************/ /* response code totals */ fprintf(out_fp,"\n",GREY,_("Hits by Response Code")); fprintf(out_fp,"\n"); for (i=0;i\n" \ "\n", _(response[i].desc), response[i].count); } fprintf(out_fp,"\n"); /**********************************************/ fprintf(out_fp,"
%s %s %d
%s%lu" \ "
%s%lu" \ "
%s %s%lu" \ "
%s %s%lu" \ "
%s%.0f" \ "
%s%lu" \ "
%s%lu" \ "
%s%lu" \ "
%s%lu" \ "
%s%lu" \ "
." \ "%s " \ "%s
%s%lu%lu" \ "
%s%lu%lu" \ "
%s%lu%lu" \ "
%s%lu%lu" \ "
%s%lu%lu" \ "
%s%.0f%.0f" \ "
\n" \ "%s
%s%lu" \ "
\n"); fprintf(out_fp,"

\n"); } /*********************************************/ /* DAILY_TOTAL_TABLE - daily totals */ /*********************************************/ void daily_total_table() { int i; /* Daily stats */ fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); /* Daily statistics for ... */ fprintf(out_fp,"\n",GREY,_("Daily Statistics for"),_(l_month[cur_month-1]),cur_year); fprintf(out_fp,"\n"); fprintf(out_fp,"\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n", GREY, _("Day"), DKGREEN, _("Hits"), LTBLUE, _("Files"), CYAN, _("Pages"), YELLOW, _("Visits"), ORANGE, _("Sites"), RED, _("KBytes")); fprintf(out_fp,"\n"); /* skip beginning blank days in a month */ for (i=0;i\n", i+1); fprintf(out_fp,"\n" \ "\n", tm_hit[i],PCENT(tm_hit[i],t_hit)); fprintf(out_fp,"\n" \ "\n", tm_file[i],PCENT(tm_file[i],t_file)); fprintf(out_fp,"\n" \ "\n", tm_page[i],PCENT(tm_page[i],t_page)); fprintf(out_fp,"\n" \ "\n", tm_visit[i],PCENT(tm_visit[i],t_visit)); fprintf(out_fp,"\n" \ "\n", tm_site[i],PCENT(tm_site[i],t_site)); fprintf(out_fp,"\n" \ "\n", tm_xfer[i]/1024,PCENT(tm_xfer[i],t_xfer)); } fprintf(out_fp,"\n"); fprintf(out_fp,"
%s %s %d
" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s
" \ "%d" \ "%lu%3.02f%%" \ "%lu%3.02f%%" \ "%lu%3.02f%%" \ "%lu%3.02f%%" \ "%lu%3.02f%%" \ "%.0f%3.02f%%
\n"); fprintf(out_fp,"

\n"); } /*********************************************/ /* HOURLY_TOTAL_TABLE - hourly table */ /*********************************************/ void hourly_total_table() { int i,days_in_month; u_long avg_file=0; double avg_xfer=0.0; days_in_month=(l_day-f_day)+1; /* Hourly stats */ fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n",GREY,_("Hourly Statistics for"),_(l_month[cur_month-1]),cur_year); fprintf(out_fp,"\n"); fprintf(out_fp,"\n" \ "\n" \ "\n" \ "\n" \ "\n", GREY, _("Hour"), DKGREEN, _("Hits"), LTBLUE, _("Files"), CYAN, _("Pages"), RED, _("KBytes")); fprintf(out_fp,"\n" \ "\n", DKGREEN, _("Avg"), DKGREEN, _("Total")); fprintf(out_fp,"\n" \ "\n", LTBLUE, _("Avg"), LTBLUE, _("Total")); fprintf(out_fp,"\n" \ "\n", CYAN, _("Avg"), CYAN, _("Total")); fprintf(out_fp,"\n" \ "\n", RED, _("Avg"), RED, _("Total")); fprintf(out_fp,"\n"); for (i=0;i<24;i++) { fprintf(out_fp,"\n",i); fprintf(out_fp, "\n" \ "\n" \ "\n", th_hit[i]/days_in_month,th_hit[i], PCENT(th_hit[i],t_hit)); fprintf(out_fp, "\n" \ "\n" \ "\n", th_file[i]/days_in_month,th_file[i], PCENT(th_file[i],t_file)); fprintf(out_fp, "\n" \ "\n" \ "\n", th_page[i]/days_in_month,th_page[i], PCENT(th_page[i],t_page)); fprintf(out_fp, "\n" \ "\n" \ "\n", (th_xfer[i]/days_in_month)/1024,th_xfer[i]/1024, PCENT(th_xfer[i],t_xfer)); avg_file += th_file[i]/days_in_month; avg_xfer+= (th_xfer[i]/days_in_month)/1024; } fprintf(out_fp,"\n"); fprintf(out_fp,"
%s %s %d
" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s
" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s
" \ "%d%lu%lu%3.02f%%%lu%lu%3.02f%%%lu%lu%3.02f%%%.0f%.0f%3.02f%%
\n

\n"); } /*********************************************/ /* TOP_SITES_TABLE - generate top n table */ /*********************************************/ void top_sites_table(int flag) { u_long cnt=0, h_reg=0, h_grp=0, h_hid=0, tot_num; int i; HNODEPTR hptr, *pointer; cnt=a_ctr; pointer=h_array; while(cnt--) { /* calculate totals */ switch ( (int)((HNODEPTR)(*pointer)->flag) ) { case OBJ_REG: h_reg++; break; case OBJ_GRP: h_grp++; break; case OBJ_HIDE: h_hid++; break; } pointer++; } if ( (tot_num=h_reg+h_grp)==0 ) return; /* split if none */ i=(flag)?ntop_sitesK:ntop_sites; /* Hits or KBytes?? */ if (tot_num > i) tot_num = i; /* get max to do... */ if ((!flag) || (flag&&!ntop_sites)) /* now do tag */ fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); if (flag) fprintf(out_fp,"\n", GREY, _("Top"),tot_num,_("of"), t_site,_("Total Sites"),_("By"),_("KBytes")); else fprintf(out_fp,"\n", GREY,_("Top"), tot_num, _("of"), t_site, _("Total Sites")); fprintf(out_fp,"\n"); fprintf(out_fp,"\n",GREY); fprintf(out_fp,"\n",DKGREEN,_("Hits")); fprintf(out_fp,"\n",LTBLUE,_("Files")); fprintf(out_fp,"\n",RED,_("KBytes")); fprintf(out_fp,"\n",YELLOW,_("Visits")); fprintf(out_fp,"\n",CYAN,_("Hostname")); fprintf(out_fp,"\n"); pointer=h_array; i=0; while(tot_num) { hptr=*pointer++; if (hptr->flag != OBJ_HIDE) { /* shade grouping? */ if (shade_groups && (hptr->flag==OBJ_GRP)) fprintf(out_fp,"\n", GRPCOLOR); else fprintf(out_fp,"\n"); fprintf(out_fp, "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n", hptr->string); else fprintf(out_fp,"%s\n", hptr->string); tot_num--; i++; } } fprintf(out_fp,"\n"); if ((!flag) || (flag&&!ntop_sites)) { if ( (all_sites) && ((h_reg+h_grp)>ntop_sites) ) { if (all_sites_page(h_reg, h_grp)) { fprintf(out_fp,"",GRPCOLOR); fprintf(out_fp,"\n",_("View All Sites")); if (flag) /* do we need to sort? */ qsort(h_array,a_ctr,sizeof(HNODEPTR),qs_site_cmph); } } } fprintf(out_fp,"
" \ "%s %lu %s %lu %s %s %s
" \ "%s %lu %s %lu %s
" \ "#" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s
%d%lu%3.02f%%%lu%3.02f%%%.0f%3.02f%%%lu%3.02f%%", i+1,hptr->count, (t_hit==0)?0:((float)hptr->count/t_hit)*100.0,hptr->files, (t_file==0)?0:((float)hptr->files/t_file)*100.0,hptr->xfer/1024, (t_xfer==0)?0:((float)hptr->xfer/t_xfer)*100.0,hptr->visit, (t_visit==0)?0:((float)hptr->visit/t_visit)*100.0); if ((hptr->flag==OBJ_GRP)&&hlite_groups) fprintf(out_fp,"%s
\n"); fprintf(out_fp,""); fprintf(out_fp,"", cur_year,cur_month,html_ext); fprintf(out_fp,"%s
\n

\n"); } /*********************************************/ /* ALL_SITES_PAGE - HTML page of all sites */ /*********************************************/ int all_sites_page(u_long h_reg, u_long h_grp) { HNODEPTR hptr, *pointer; char site_fname[256], buffer[256]; FILE *out_fp; int i=(h_grp)?1:0; /* generate file name */ snprintf(site_fname,sizeof(site_fname),"site_%04d%02d.%s", cur_year,cur_month,html_ext); /* open file */ if ( (out_fp=open_out_file(site_fname))==NULL ) return 0; snprintf(buffer,sizeof(buffer),"%s %d - %s", _(l_month[cur_month-1]),cur_year,_("Sites")); write_html_head(buffer, out_fp); fprintf(out_fp,"

\n");

   fprintf(out_fp," %12s      %12s      %12s      %12s      %s\n",
           _("Hits"), _("Files"), _("KBytes"), _("Visits"), _("Hostname"));
   fprintf(out_fp,"----------------  ----------------  ----------------  " \
                  "----------------  --------------------\n\n");

   /* Do groups first (if any) */
   pointer=h_array;
   while(h_grp)
   {
      hptr=*pointer++;
      if (hptr->flag == OBJ_GRP)
      {
         fprintf(out_fp,
         "%-8lu %6.02f%%  %8lu %6.02f%%  %8.0f %6.02f%%  %8lu %6.02f%%  %s\n",
            hptr->count,
            (t_hit==0)?0:((float)hptr->count/t_hit)*100.0,hptr->files,
            (t_file==0)?0:((float)hptr->files/t_file)*100.0,hptr->xfer/1024,
            (t_xfer==0)?0:((float)hptr->xfer/t_xfer)*100.0,hptr->visit,
            (t_visit==0)?0:((float)hptr->visit/t_visit)*100.0,
            hptr->string);
         h_grp--;
      }
   }

   if (i) fprintf(out_fp,"\n");

   /* Now do individual sites (if any) */
   pointer=h_array;
   if (!hide_sites) while(h_reg)
   {
      hptr=*pointer++;
      if (hptr->flag == OBJ_REG)
      {
         fprintf(out_fp,
         "%-8lu %6.02f%%  %8lu %6.02f%%  %8.0f %6.02f%%  %8lu %6.02f%%  %s\n",
            hptr->count,
            (t_hit==0)?0:((float)hptr->count/t_hit)*100.0,hptr->files,
            (t_file==0)?0:((float)hptr->files/t_file)*100.0,hptr->xfer/1024,
            (t_xfer==0)?0:((float)hptr->xfer/t_xfer)*100.0,hptr->visit,
            (t_visit==0)?0:((float)hptr->visit/t_visit)*100.0,
            hptr->string);
         h_reg--;
      }
   }

   fprintf(out_fp,"
\n"); write_html_tail(out_fp); fclose(out_fp); return 1; } /*********************************************/ /* TOP_URLS_TABLE - generate top n table */ /*********************************************/ void top_urls_table(int flag) { u_long cnt=0,u_reg=0,u_grp=0,u_hid=0, tot_num; int i; UNODEPTR uptr, *pointer; cnt=a_ctr; pointer=u_array; while (cnt--) { /* calculate totals */ switch ( (int)((UNODEPTR)(*pointer)->flag) ) { case OBJ_REG: u_reg++; break; case OBJ_GRP: u_grp++; break; case OBJ_HIDE: u_hid++; break; } pointer++; } if ( (tot_num=u_reg+u_grp)==0 ) return; /* split if none */ i=(flag)?ntop_urlsK:ntop_urls; /* Hits or KBytes?? */ if (tot_num > i) tot_num = i; /* get max to do... */ if ((!flag) || (flag&&!ntop_urls)) /* now do tag */ fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); if (flag) fprintf(out_fp,"\n", GREY,_("Top"),tot_num,_("of"), t_url,_("Total URLs"),_("By"),_("KBytes")); else fprintf(out_fp,"\n", GREY,_("Top"),tot_num,_("of"),t_url,_("Total URLs")); fprintf(out_fp,"\n"); fprintf(out_fp,"\n",GREY); fprintf(out_fp,"\n", DKGREEN,_("Hits")); fprintf(out_fp,"\n", RED,_("KBytes")); fprintf(out_fp,"\n", CYAN,_("URL")); fprintf(out_fp,"\n"); pointer=u_array; i=0; while (tot_num) { uptr=*pointer++; /* point to the URL node */ if (uptr->flag != OBJ_HIDE) { /* shade grouping? */ if (shade_groups && (uptr->flag==OBJ_GRP)) fprintf(out_fp,"\n", GRPCOLOR); else fprintf(out_fp,"\n"); fprintf(out_fp, "\n" \ "\n" \ "\n" \ "\n"\ "\n" \ "\n", uptr->string); else fprintf(out_fp,"%s\n",uptr->string); } else { /* check for a service prefix (ie: http://) */ if (strstr(uptr->string,"://")!=NULL) fprintf(out_fp,"%s\n", uptr->string,uptr->string); else { if (log_type == LOG_FTP) /* FTP log? */ fprintf(out_fp,"%s\n",uptr->string); else { /* Web log */ if (use_https) /* secure server mode, use https:// */ fprintf(out_fp, "%s\n", hname,uptr->string,uptr->string); else /* otherwise use standard 'http://' */ fprintf(out_fp, "%s\n", hname,uptr->string,uptr->string); } } } tot_num--; i++; } } fprintf(out_fp,"\n"); if ((!flag) || (flag&&!ntop_urls)) { if ( (all_urls) && ((u_reg+u_grp)>ntop_urls) ) { if (all_urls_page(u_reg, u_grp)) { fprintf(out_fp,"",GRPCOLOR); fprintf(out_fp,"\n",_("View All URLs")); if (flag) /* do we need to sort first? */ qsort(u_array,a_ctr,sizeof(UNODEPTR),qs_url_cmph); } } } fprintf(out_fp,"
" \ "%s %lu %s %lu %s %s %s
" \ "%s %lu %s %lu %s
" \ "#" \ "%s" \ "%s" \ "%s
%d%lu%3.02f%%%.0f%3.02f%%", i+1,uptr->count, (t_hit==0)?0:((float)uptr->count/t_hit)*100.0, uptr->xfer/1024, (t_xfer==0)?0:((float)uptr->xfer/t_xfer)*100.0); if (uptr->flag==OBJ_GRP) { if (hlite_groups) fprintf(out_fp,"%s
\n"); fprintf(out_fp,""); fprintf(out_fp,"", cur_year,cur_month,html_ext); fprintf(out_fp,"%s
\n

\n"); } /*********************************************/ /* ALL_URLS_PAGE - HTML page of all urls */ /*********************************************/ int all_urls_page(u_long u_reg, u_long u_grp) { UNODEPTR uptr, *pointer; char url_fname[256], buffer[256]; FILE *out_fp; int i=(u_grp)?1:0; /* generate file name */ snprintf(url_fname,sizeof(url_fname),"url_%04d%02d.%s", cur_year,cur_month,html_ext); /* open file */ if ( (out_fp=open_out_file(url_fname))==NULL ) return 0; snprintf(buffer,sizeof(buffer),"%s %d - %s", _(l_month[cur_month-1]),cur_year,_("URL")); /* write_html_head(buffer, out_fp); */ fprintf(out_fp,"

\n");

   fprintf(out_fp," %12s      %12s      %s\n",
           _("Hits"),_("KBytes"),_("URL"));
   fprintf(out_fp,"----------------  ----------------  " \
                  "--------------------\n\n");

   /* do groups first (if any) */
   pointer=u_array;
   while (u_grp)
   {
      uptr=*pointer++;
      if (uptr->flag == OBJ_GRP)
      {
         fprintf(out_fp,"%-8lu %6.02f%%  %8.0f %6.02f%%  %s\n",
            uptr->count,
            (t_hit==0)?0:((float)uptr->count/t_hit)*100.0,
            uptr->xfer/1024,
            (t_xfer==0)?0:((float)uptr->xfer/t_xfer)*100.0,
            uptr->string);
         u_grp--;
      }
   }

   if (i) fprintf(out_fp,"\n");

   /* now do invididual sites (if any) */
   pointer=u_array;
   while (u_reg)
   {
      uptr=*pointer++;
      if (uptr->flag == OBJ_REG)
      {
         fprintf(out_fp,"%-8lu %6.02f%%  %8.0f %6.02f%%  %s\n",
            uptr->count,
            (t_hit==0)?0:((float)uptr->count/t_hit)*100.0,
            uptr->xfer/1024,
            (t_xfer==0)?0:((float)uptr->xfer/t_xfer)*100.0,
            uptr->string);
         u_reg--;
      }
   }

   fprintf(out_fp,"
\n"); write_html_tail(out_fp); fclose(out_fp); return 1; } /*********************************************/ /* TOP_ENTRY_TABLE - top n entry/exit urls */ /*********************************************/ void top_entry_table(int flag) { u_long cnt=0, u_entry=0, u_exit=0, tot_num; u_long t_entry=0, t_exit=0; int i; UNODEPTR uptr, *pointer; cnt=a_ctr; pointer=u_array; while (cnt--) { if ( (int)((UNODEPTR)(*pointer)->flag) == OBJ_REG ) { if ( (u_long)((UNODEPTR)(*pointer)->entry) ) { u_entry++; t_entry+=(u_long)((UNODEPTR)(*pointer)->entry); } if ( (u_long)((UNODEPTR)(*pointer)->exit) ) { u_exit++; t_exit +=(u_long)((UNODEPTR)(*pointer)->exit); } } pointer++; } /* calculate how many we have */ tot_num=(flag)?u_exit:u_entry; if (flag) { if (tot_num > ntop_exit ) tot_num=ntop_exit; } else { if (tot_num > ntop_entry) tot_num=ntop_entry; } /* return if none to do */ if (!tot_num) return; if (flag) fprintf(out_fp,"\n"); /* do anchor tag */ else fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n", GREY,_("Top"),tot_num,_("of"), (flag)?u_exit:u_entry,(flag)?_("Total Exit Pages"):_("Total Entry Pages")); fprintf(out_fp,"\n"); fprintf(out_fp,"\n", GREY); fprintf(out_fp,"\n", DKGREEN,_("Hits")); fprintf(out_fp,"\n", YELLOW,_("Visits")); fprintf(out_fp,"\n", CYAN,_("URL")); fprintf(out_fp,"\n"); pointer=u_array; i=0; while (tot_num) { uptr=*pointer++; if (uptr->flag != OBJ_HIDE) { fprintf(out_fp,"\n"); fprintf(out_fp, "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n", uptr->string,uptr->string); else { if (use_https) /* secure server mode, use https:// */ fprintf(out_fp, "%s\n", hname,uptr->string,uptr->string); else /* otherwise use standard 'http://' */ fprintf(out_fp, "%s\n", hname,uptr->string,uptr->string); } tot_num--; i++; } } fprintf(out_fp,"\n"); fprintf(out_fp,"
" \ "%s %lu %s %lu %s
" \ "#" \ "%s" \ "%s" \ "%s
%d%lu%3.02f%%%lu%3.02f%%", i+1,uptr->count, (t_hit==0)?0:((float)uptr->count/t_hit)*100.0, (flag)?uptr->exit:uptr->entry, (flag)?((t_exit==0)?0:((float)uptr->exit/t_exit)*100.0) :((t_entry==0)?0:((float)uptr->entry/t_entry)*100.0)); /* check for a service prefix (ie: http://) */ if (strstr(uptr->string,"://")!=NULL) fprintf(out_fp, "%s
\n

\n"); } /*********************************************/ /* TOP_REFS_TABLE - generate top n table */ /*********************************************/ void top_refs_table() { u_long cnt=0, r_reg=0, r_grp=0, r_hid=0, tot_num; int i; RNODEPTR rptr, *pointer; if (t_ref==0) return; /* return if none to process */ cnt=a_ctr; pointer=r_array; while(cnt--) { /* calculate totals */ switch ( (int)((RNODEPTR)(*pointer)->flag) ) { case OBJ_REG: r_reg++; break; case OBJ_HIDE: r_hid++; break; case OBJ_GRP: r_grp++; break; } pointer++; } if ( (tot_num=r_reg+r_grp)==0 ) return; /* split if none */ if (tot_num > ntop_refs) tot_num=ntop_refs; /* get max to do... */ fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n", GREY, _("Top"), tot_num, _("of"), t_ref, _("Total Referrers")); fprintf(out_fp,"\n"); fprintf(out_fp,"\n", GREY); fprintf(out_fp,"\n", DKGREEN,_("Hits")); fprintf(out_fp,"\n", CYAN,_("Referrer")); fprintf(out_fp,"\n"); pointer=r_array; i=0; while(tot_num) { rptr=*pointer++; if (rptr->flag != OBJ_HIDE) { /* shade grouping? */ if (shade_groups && (rptr->flag==OBJ_GRP)) fprintf(out_fp,"\n", GRPCOLOR); else fprintf(out_fp,"\n"); fprintf(out_fp, "\n" \ "\n" \ "\n" \ "\n"); tot_num--; i++; } } fprintf(out_fp,"\n"); if ( (all_refs) && ((r_reg+r_grp)>ntop_refs) ) { if (all_refs_page(r_reg, r_grp)) { fprintf(out_fp,"",GRPCOLOR); fprintf(out_fp,"\n",_("View All Referrers")); } } fprintf(out_fp,"
" \ "%s %lu %s %lu %s
" \ "#" \ "%s" \ "%s
%d%lu%3.02f%%", i+1,rptr->count, (t_hit==0)?0:((float)rptr->count/t_hit)*100.0); if (rptr->flag==OBJ_GRP) { if (hlite_groups) fprintf(out_fp,"%s",rptr->string); else fprintf(out_fp,"%s",rptr->string); } else { if (rptr->string[0] != '-') { if (nofollow == 0) { fprintf(out_fp,"%s", rptr->string, rptr->string); } else { fprintf(out_fp,"%s", rptr->string, rptr->string); } } else { fprintf(out_fp,"%s", rptr->string); } } fprintf(out_fp,"
\n"); fprintf(out_fp,""); fprintf(out_fp,"", cur_year,cur_month,html_ext); fprintf(out_fp,"%s
\n

\n"); } /*********************************************/ /* ALL_REFS_PAGE - HTML page of all refs */ /*********************************************/ int all_refs_page(u_long r_reg, u_long r_grp) { RNODEPTR rptr, *pointer; char ref_fname[256], buffer[256]; FILE *out_fp; int i=(r_grp)?1:0; /* generate file name */ snprintf(ref_fname,sizeof(ref_fname),"ref_%04d%02d.%s", cur_year,cur_month,html_ext); /* open file */ if ( (out_fp=open_out_file(ref_fname))==NULL ) return 0; snprintf(buffer,sizeof(buffer),"%s %d - %s", _(l_month[cur_month-1]),cur_year,_("Referrer")); write_html_head(buffer, out_fp); fprintf(out_fp,"

\n");

   fprintf(out_fp," %12s      %s\n",_("Hits"),_("Referrer"));
   fprintf(out_fp,"----------------  --------------------\n\n");

   /* do groups first (if any) */
   pointer=r_array;
   while(r_grp)
   {
      rptr=*pointer++;
      if (rptr->flag == OBJ_GRP)
      {
         fprintf(out_fp,"%-8lu %6.02f%%  %s\n",
            rptr->count,
            (t_hit==0)?0:((float)rptr->count/t_hit)*100.0,
            rptr->string);
         r_grp--;
      }
   }

   if (i) fprintf(out_fp,"\n");

   pointer=r_array;
   while(r_reg)
   {
      rptr=*pointer++;
      if (rptr->flag == OBJ_REG)
      {
         fprintf(out_fp,"%-8lu %6.02f%%  %s\n",
            rptr->count,
            (t_hit==0)?0:((float)rptr->count/t_hit)*100.0,
            rptr->string);
         r_reg--;
      }
   }

   fprintf(out_fp,"
\n"); write_html_tail(out_fp); fclose(out_fp); return 1; } /*********************************************/ /* TOP_AGENTS_TABLE - generate top n table */ /*********************************************/ void top_agents_table() { u_long cnt, a_reg=0, a_grp=0, a_hid=0, tot_num; int i; ANODEPTR aptr, *pointer; if (t_agent == 0) return; /* don't bother if we don't have any */ cnt=a_ctr; pointer=a_array; while(cnt--) { /* calculate totals */ switch ( (int)((ANODEPTR)(*pointer)->flag) ) { case OBJ_REG: a_reg++; break; case OBJ_GRP: a_grp++; break; case OBJ_HIDE: a_hid++; break; } pointer++; } if ( (tot_num=a_reg+a_grp)==0 ) return; /* split if none */ if (tot_num > ntop_agents) tot_num=ntop_agents; /* get max to do... */ fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n", GREY, _("Top"), tot_num, _("of"), t_agent, _("Total User Agents")); fprintf(out_fp,"\n"); fprintf(out_fp,"\n", GREY); fprintf(out_fp,"\n", DKGREEN,_("Hits")); fprintf(out_fp,"\n", CYAN,_("User Agent")); fprintf(out_fp,"\n"); pointer=a_array; i=0; while(tot_num) { aptr=*pointer++; if (aptr->flag != OBJ_HIDE) { /* shade grouping? */ if (shade_groups && (aptr->flag==OBJ_GRP)) fprintf(out_fp,"\n", GRPCOLOR); else fprintf(out_fp,"\n"); fprintf(out_fp, "\n" \ "\n" \ "\n" \ "\n", aptr->string); else fprintf(out_fp,"%s\n", aptr->string); tot_num--; i++; } } fprintf(out_fp,"\n"); if ( (all_agents) && ((a_reg+a_grp)>ntop_agents) ) { if (all_agents_page(a_reg, a_grp)) { fprintf(out_fp,"",GRPCOLOR); fprintf(out_fp,"\n",_("View All User Agents")); } } fprintf(out_fp,"
" \ "%s %lu %s %lu %s
" \ "#" \ "%s" \ "%s
%d%lu%3.02f%%", i+1,aptr->count, (t_hit==0)?0:((float)aptr->count/t_hit)*100.0); if ((aptr->flag==OBJ_GRP)&&hlite_groups) fprintf(out_fp,"%s
\n"); fprintf(out_fp,""); fprintf(out_fp,"", cur_year,cur_month,html_ext); fprintf(out_fp,"%s
\n

\n"); } /*********************************************/ /* ALL_AGENTS_PAGE - HTML user agent page */ /*********************************************/ int all_agents_page(u_long a_reg, u_long a_grp) { ANODEPTR aptr, *pointer; char agent_fname[256], buffer[256]; FILE *out_fp; int i=(a_grp)?1:0; /* generate file name */ snprintf(agent_fname,sizeof(agent_fname),"agent_%04d%02d.%s", cur_year,cur_month,html_ext); /* open file */ if ( (out_fp=open_out_file(agent_fname))==NULL ) return 0; snprintf(buffer,sizeof(buffer),"%s %d - %s", _(l_month[cur_month-1]),cur_year,_("User Agent")); write_html_head(buffer, out_fp); fprintf(out_fp,"

\n");

   fprintf(out_fp," %12s      %s\n",_("Hits"),_("User Agent"));
   fprintf(out_fp,"----------------  ----------------------\n\n");

   /* do groups first (if any) */
   pointer=a_array;
   while(a_grp)
   {
      aptr=*pointer++;
      if (aptr->flag == OBJ_GRP)
      {
         fprintf(out_fp,"%-8lu %6.02f%%  %s\n",
             aptr->count,
             (t_hit==0)?0:((float)aptr->count/t_hit)*100.0,
             aptr->string);
         a_grp--;
      }
   }

   if (i) fprintf(out_fp,"\n");

   pointer=a_array;
   while(a_reg)
   {
      aptr=*pointer++;
      if (aptr->flag == OBJ_REG)
      {
         fprintf(out_fp,"%-8lu %6.02f%%  %s\n",
             aptr->count,
             (t_hit==0)?0:((float)aptr->count/t_hit)*100.0,
             aptr->string);
         a_reg--;
      }
   }

   fprintf(out_fp,"
\n"); write_html_tail(out_fp); fclose(out_fp); return 1; } /*********************************************/ /* TOP_SEARCH_TABLE - generate top n table */ /*********************************************/ void top_search_table() { u_long cnt,t_val=0, tot_num; int i; SNODEPTR sptr, *pointer; if ( (t_ref==0)||(a_ctr==0)) return; /* don't bother if none to do */ cnt=tot_num=a_ctr; pointer=s_array; while(cnt--) { t_val+=(u_long)((SNODEPTR)(*pointer)->count); pointer++; } if ( tot_num > ntop_search) tot_num=ntop_search; fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n", GREY, _("Top"), tot_num, _("of"), a_ctr, _("Total Search Strings")); fprintf(out_fp,"\n"); fprintf(out_fp,"\n", GREY); fprintf(out_fp,"\n", DKGREEN,_("Hits")); fprintf(out_fp,"\n", CYAN,_("Search String")); fprintf(out_fp,"\n"); pointer=s_array; i=0; while(tot_num) { sptr=*pointer++; fprintf(out_fp, "\n" \ "\n" \ "\n" \ "\n" \ "\n",sptr->string); tot_num--; i++; } fprintf(out_fp,"\n"); if ( (all_search) && (a_ctr>ntop_search) ) { if (all_search_page(a_ctr, t_val)) { fprintf(out_fp,"",GRPCOLOR); fprintf(out_fp,"\n",_("View All Search Strings")); } } fprintf(out_fp,"
" \ "%s %lu %s %lu %s
" \ "#" \ "%s" \ "%s
%d%lu%3.02f%%", i+1,sptr->count, (t_val==0)?0:((float)sptr->count/t_val)*100.0); fprintf(out_fp,"%s
\n"); fprintf(out_fp,""); fprintf(out_fp,"", cur_year,cur_month,html_ext); fprintf(out_fp,"%s
\n

\n"); } /*********************************************/ /* ALL_SEARCH_PAGE - HTML for search strings */ /*********************************************/ int all_search_page(u_long tot_num, u_long t_val) { SNODEPTR sptr, *pointer; char search_fname[256], buffer[256]; FILE *out_fp; if (!tot_num) return 0; /* generate file name */ snprintf(search_fname,sizeof(search_fname),"search_%04d%02d.%s", cur_year,cur_month,html_ext); /* open file */ if ( (out_fp=open_out_file(search_fname))==NULL ) return 0; snprintf(buffer,sizeof(buffer),"%s %d - %s", _(l_month[cur_month-1]),cur_year,_("Search String")); write_html_head(buffer, out_fp); fprintf(out_fp,"

\n");

   fprintf(out_fp," %12s      %s\n",_("Hits"),_("Search String"));
   fprintf(out_fp,"----------------  ----------------------\n\n");

   pointer=s_array;
   while(tot_num)
   {
      sptr=*pointer++;
      fprintf(out_fp,"%-8lu %6.02f%%  %s\n",
         sptr->count,
         (t_val==0)?0:((float)sptr->count/t_val)*100.0,
         sptr->string);
      tot_num--;
   }
   fprintf(out_fp,"
\n"); write_html_tail(out_fp); fclose(out_fp); return 1; } /*********************************************/ /* TOP_USERS_TABLE - generate top n table */ /*********************************************/ void top_users_table() { u_long cnt=0, i_reg=0, i_grp=0, i_hid=0, tot_num; int i; INODEPTR iptr, *pointer; cnt=a_ctr; pointer=i_array; while(cnt--) { /* calculate totals */ switch ( (int)((INODEPTR)(*pointer)->flag) ) { case OBJ_REG: i_reg++; break; case OBJ_GRP: i_grp++; break; case OBJ_HIDE: i_hid++; break; } pointer++; } if ( (tot_num=i_reg+i_grp)==0 ) return; /* split if none */ if (tot_num > ntop_users) tot_num = ntop_users; fprintf(out_fp,"\n"); /* now do tag */ fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n", GREY,_("Top"), tot_num, _("of"), t_user, _("Total Usernames")); fprintf(out_fp,"\n"); fprintf(out_fp,"\n",GREY); fprintf(out_fp,"\n",DKGREEN,_("Hits")); fprintf(out_fp,"\n",LTBLUE,_("Files")); fprintf(out_fp,"\n",RED,_("KBytes")); fprintf(out_fp,"\n",YELLOW,_("Visits")); fprintf(out_fp,"\n",CYAN,_("Username")); fprintf(out_fp,"\n"); pointer=i_array; i=0; while(tot_num) { iptr=*pointer++; if (iptr->flag != OBJ_HIDE) { /* shade grouping? */ if (shade_groups && (iptr->flag==OBJ_GRP)) fprintf(out_fp,"\n", GRPCOLOR); else fprintf(out_fp,"\n"); fprintf(out_fp, "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n", iptr->string); else fprintf(out_fp,"%s\n", iptr->string); tot_num--; i++; } } fprintf(out_fp,"\n"); if ( (all_users) && ((i_reg+i_grp)>ntop_users) ) { if (all_users_page(i_reg, i_grp)) { fprintf(out_fp,"",GRPCOLOR); fprintf(out_fp,"\n",_("View All Usernames")); } } fprintf(out_fp,"
" \ "%s %lu %s %lu %s
" \ "#" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s
%d%lu%3.02f%%%lu%3.02f%%%.0f%3.02f%%%lu%3.02f%%", i+1,iptr->count, (t_hit==0)?0:((float)iptr->count/t_hit)*100.0,iptr->files, (t_file==0)?0:((float)iptr->files/t_file)*100.0,iptr->xfer/1024, (t_xfer==0)?0:((float)iptr->xfer/t_xfer)*100.0,iptr->visit, (t_visit==0)?0:((float)iptr->visit/t_visit)*100.0); if ((iptr->flag==OBJ_GRP)&&hlite_groups) fprintf(out_fp,"%s
\n"); fprintf(out_fp,""); fprintf(out_fp,"", cur_year,cur_month,html_ext); fprintf(out_fp,"%s
\n

\n"); } /*********************************************/ /* ALL_USERS_PAGE - HTML of all usernames */ /*********************************************/ int all_users_page(u_long i_reg, u_long i_grp) { INODEPTR iptr, *pointer; char user_fname[256], buffer[256]; FILE *out_fp; int i=(i_grp)?1:0; /* generate file name */ snprintf(user_fname,sizeof(user_fname),"user_%04d%02d.%s", cur_year,cur_month,html_ext); /* open file */ if ( (out_fp=open_out_file(user_fname))==NULL ) return 0; snprintf(buffer,sizeof(buffer),"%s %d - %s", _(l_month[cur_month-1]),cur_year,_("Username")); write_html_head(buffer, out_fp); fprintf(out_fp,"

\n");

   fprintf(out_fp," %12s      %12s      %12s      %12s      %s\n",
           _("Hits"), _("Files"), _("KBytes"), _("Visits"), _("Username"));
   fprintf(out_fp,"----------------  ----------------  ----------------  " \
                  "----------------  --------------------\n\n");

   /* Do groups first (if any) */
   pointer=i_array;
   while(i_grp)
   {
      iptr=*pointer++;
      if (iptr->flag == OBJ_GRP)
      {
         fprintf(out_fp,
         "%-8lu %6.02f%%  %8lu %6.02f%%  %8.0f %6.02f%%  %8lu %6.02f%%  %s\n",
            iptr->count,
            (t_hit==0)?0:((float)iptr->count/t_hit)*100.0,iptr->files,
            (t_file==0)?0:((float)iptr->files/t_file)*100.0,iptr->xfer/1024,
            (t_xfer==0)?0:((float)iptr->xfer/t_xfer)*100.0,iptr->visit,
            (t_visit==0)?0:((float)iptr->visit/t_visit)*100.0,
            iptr->string);
         i_grp--;
      }
   }

   if (i) fprintf(out_fp,"\n");

   /* Now do individual users (if any) */
   pointer=i_array;
   while(i_reg)
   {
      iptr=*pointer++;
      if (iptr->flag == OBJ_REG)
      {
         fprintf(out_fp,
         "%-8lu %6.02f%%  %8lu %6.02f%%  %8.0f %6.02f%%  %8lu %6.02f%%  %s\n",
            iptr->count,
            (t_hit==0)?0:((float)iptr->count/t_hit)*100.0,iptr->files,
            (t_file==0)?0:((float)iptr->files/t_file)*100.0,iptr->xfer/1024,
            (t_xfer==0)?0:((float)iptr->xfer/t_xfer)*100.0,iptr->visit,
            (t_visit==0)?0:((float)iptr->visit/t_visit)*100.0,
            iptr->string);
         i_reg--;
      }
   }

   fprintf(out_fp,"
\n"); write_html_tail(out_fp); fclose(out_fp); return 1; } /*********************************************/ /* TOP_CTRY_TABLE - top countries table */ /*********************************************/ void top_ctry_table() { int i,j,x,tot_num=0,tot_ctry=0; int ctry_fnd; u_long idx; HNODEPTR hptr; char *domain; u_long pie_data[10]; char *pie_legend[10]; char pie_title[48]; char pie_fname[48]; extern int ctry_graph; /* include external flag */ /* scan hash table adding up domain totals */ for (i=0;iflag != OBJ_GRP) /* ignore group totals */ { domain = hptr->string+strlen(hptr->string)-1; while ( (*domain!='.')&&(domain!=hptr->string)) domain--; if ((domain==hptr->string)||(isdigit((int)*++domain))) { ctry[0].count+=hptr->count; ctry[0].files+=hptr->files; ctry[0].xfer +=hptr->xfer; } else { ctry_fnd=0; idx=ctry_idx(domain); for (j=0;ctry[j].desc;j++) { if (idx==ctry[j].idx) { ctry[j].count+=hptr->count; ctry[j].files+=hptr->files; ctry[j].xfer +=hptr->xfer; ctry_fnd=1; break; } } if (!ctry_fnd) { ctry[0].count+=hptr->count; ctry[0].files+=hptr->files; ctry[0].xfer +=hptr->xfer; } } } hptr=hptr->next; } } for (i=0;ctry[i].desc;i++) { if (ctry[i].count!=0) tot_ctry++; for (j=0;j top_ctrys[j]->count) { for (x=ntop_ctrys-1;x>j;x--) top_ctrys[x]=top_ctrys[x-1]; top_ctrys[x]=&ctry[i]; break; } } } } /* put our anchor tag first... */ fprintf(out_fp,"
\n"); /* generate pie chart if needed */ if (ctry_graph) { for (i=0;i<10;i++) pie_data[i]=0; /* init data array */ if (ntop_ctrys<10) j=ntop_ctrys; else j=10; /* ensure data size */ for (i=0;icount; /* load the array */ pie_legend[i]=_(top_ctrys[i]->desc); } snprintf(pie_title,sizeof(pie_title),"%s %s %d", _("Usage by Country for"),_(l_month[cur_month-1]),cur_year); sprintf(pie_fname,"ctry_usage_%04d%02d.png",cur_year,cur_month); pie_chart(pie_fname,pie_title,t_hit,pie_data,pie_legend); /* do it */ /* put the image tag in the page */ fprintf(out_fp,"\"%s\"

\n",pie_fname,pie_title); } /* Now do the table */ for (i=0;icount!=0) tot_num++; fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n", GREY,_("Top"),tot_num,_("of"),tot_ctry,_("Total Countries")); fprintf(out_fp,"\n"); fprintf(out_fp,"\n",GREY); fprintf(out_fp,"\n",DKGREEN,_("Hits")); fprintf(out_fp,"\n",LTBLUE,_("Files")); fprintf(out_fp,"\n",RED,_("KBytes")); fprintf(out_fp,"\n",CYAN,_("Country")); fprintf(out_fp,"\n"); for (i=0;icount!=0) fprintf(out_fp,"" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n" \ "\n", i+1,top_ctrys[i]->count, (t_hit==0)?0:((float)top_ctrys[i]->count/t_hit)*100.0, top_ctrys[i]->files, (t_file==0)?0:((float)top_ctrys[i]->files/t_file)*100.0, top_ctrys[i]->xfer/1024, (t_xfer==0)?0:((float)top_ctrys[i]->xfer/t_xfer)*100.0, _(top_ctrys[i]->desc)); } fprintf(out_fp,"\n"); fprintf(out_fp,"
" \ "%s %d %s %d %s
" \ "#" \ "%s" \ "%s" \ "%s" \ "%s
%d%lu%3.02f%%%lu%3.02f%%%.0f%3.02f%%%s
\n

\n"); } /*********************************************/ /* DUMP_ALL_SITES - dump sites to tab file */ /*********************************************/ void dump_all_sites() { HNODEPTR hptr, *pointer; FILE *out_fp; char filename[256]; u_long cnt=a_ctr; /* generate file name */ snprintf(filename,sizeof(filename),"%s/site_%04d%02d.%s", (dump_path)?dump_path:".",cur_year,cur_month,dump_ext); /* open file */ if ( (out_fp=open_out_file(filename))==NULL ) return; /* need a header? */ if (dump_header) { fprintf(out_fp,"%s\t%s\t%s\t%s\t%s\n", _("Hits"),_("Files"),_("KBytes"),_("Visits"),_("Hostname")); } /* dump 'em */ pointer=h_array; while (cnt) { hptr=*pointer++; if (hptr->flag != OBJ_GRP) { fprintf(out_fp, "%lu\t%lu\t%.0f\t%lu\t%s\n", hptr->count,hptr->files,hptr->xfer/1024, hptr->visit,hptr->string); } cnt--; } fclose(out_fp); return; } /*********************************************/ /* DUMP_ALL_URLS - dump all urls to tab file */ /*********************************************/ void dump_all_urls() { UNODEPTR uptr, *pointer; FILE *out_fp; char filename[256]; u_long cnt=a_ctr; /* generate file name */ snprintf(filename,sizeof(filename),"%s/url_%04d%02d.%s", (dump_path)?dump_path:".",cur_year,cur_month,dump_ext); /* open file */ if ( (out_fp=open_out_file(filename))==NULL ) return; /* need a header? */ if (dump_header) { fprintf(out_fp,"%s\t%s\t%s\n",_("Hits"),_("KBytes"),_("URL")); } /* dump 'em */ pointer=u_array; while (cnt) { uptr=*pointer++; if (uptr->flag != OBJ_GRP) { fprintf(out_fp,"%lu\t%.0f\t%s\n", uptr->count,uptr->xfer/1024,uptr->string); } cnt--; } fclose(out_fp); return; } /*********************************************/ /* DUMP_ALL_REFS - dump all refs to tab file */ /*********************************************/ void dump_all_refs() { RNODEPTR rptr, *pointer; FILE *out_fp; char filename[256]; u_long cnt=a_ctr; /* generate file name */ snprintf(filename,sizeof(filename),"%s/ref_%04d%02d.%s", (dump_path)?dump_path:".",cur_year,cur_month,dump_ext); /* open file */ if ( (out_fp=open_out_file(filename))==NULL ) return; /* need a header? */ if (dump_header) { fprintf(out_fp,"%s\t%s\n",_("Hits"),_("Referrer")); } /* dump 'em */ pointer=r_array; while(cnt) { rptr=*pointer++; if (rptr->flag != OBJ_GRP) { fprintf(out_fp,"%lu\t%s\n",rptr->count, rptr->string); } cnt--; } fclose(out_fp); return; } /*********************************************/ /* DUMP_ALL_AGENTS - dump agents htab file */ /*********************************************/ void dump_all_agents() { ANODEPTR aptr, *pointer; FILE *out_fp; char filename[256]; u_char cnt=a_ctr; /* generate file name */ snprintf(filename,sizeof(filename),"%s/agent_%04d%02d.%s", (dump_path)?dump_path:".",cur_year,cur_month,dump_ext); /* open file */ if ( (out_fp=open_out_file(filename))==NULL ) return; /* need a header? */ if (dump_header) { fprintf(out_fp,"%s\t%s\n",_("Hits"),_("User Agent")); } /* dump 'em */ pointer=a_array; while(cnt) { aptr=*pointer++; if (aptr->flag != OBJ_GRP) { fprintf(out_fp,"%lu\t%s\n",aptr->count,aptr->string); } cnt--; } fclose(out_fp); return; } /*********************************************/ /* DUMP_ALL_USERS - dump username tab file */ /*********************************************/ void dump_all_users() { INODEPTR iptr, *pointer; FILE *out_fp; char filename[256]; u_long cnt=a_ctr; /* generate file name */ snprintf(filename,sizeof(filename),"%s/user_%04d%02d.%s", (dump_path)?dump_path:".",cur_year,cur_month,dump_ext); /* open file */ if ( (out_fp=open_out_file(filename))==NULL ) return; /* need a header? */ if (dump_header) { fprintf(out_fp,"%s\t%s\t%s\t%s\t%s\n", _("Hits"),_("Files"),_("KBytes"),_("Visits"),_("Username")); } /* dump 'em */ pointer=i_array; while(cnt) { iptr=*pointer++; if (iptr->flag != OBJ_GRP) { fprintf(out_fp, "%lu\t%lu\t%.0f\t%lu\t%s\n", iptr->count,iptr->files,iptr->xfer/1024, iptr->visit,iptr->string); } cnt--; } fclose(out_fp); return; } /*********************************************/ /* DUMP_ALL_SEARCH - dump search htab file */ /*********************************************/ void dump_all_search() { SNODEPTR sptr, *pointer; FILE *out_fp; char filename[256]; u_char cnt=a_ctr; /* generate file name */ snprintf(filename,sizeof(filename),"%s/search_%04d%02d.%s", (dump_path)?dump_path:".",cur_year,cur_month,dump_ext); /* open file */ if ( (out_fp=open_out_file(filename))==NULL ) return; /* need a header? */ if (dump_header) { fprintf(out_fp,"%s\t%s\n",_("Hits"),_("Search String")); } /* dump 'em */ pointer=s_array; while(cnt) { sptr=*pointer++; fprintf(out_fp,"%lu\t%s\n",sptr->count,sptr->string); cnt--; } fclose(out_fp); return; } /*********************************************/ /* WRITE_MAIN_INDEX - main index.html file */ /*********************************************/ int write_main_index() { /* create main index file */ int i,days_in_month; int lyear=0; int s_mth=0; double gt_hit=0.0; double gt_files=0.0; double gt_pages=0.0; double gt_xfer=0.0; double gt_visits=0.0; char index_fname[256]; char buffer[BUFSIZE]; if (verbose>1) printf("%s\n",_("Generating summary report")); snprintf(buffer,sizeof(buffer),"%s %s",_("Usage summary for"),hname); for (i=0;i<12;i++) /* get last month in history */ { if (hist_year[i]>lyear) { lyear=hist_year[i]; s_mth=hist_month[i]; } if (hist_year[i]==lyear) { if (hist_month[i]>=s_mth) s_mth=hist_month[i]; } } i=(s_mth==12)?1:s_mth+1; year_graph6x( "usage.png", /* filename */ buffer, /* graph title */ i, /* last month */ hist_hit, /* data set 1 */ hist_files, /* data set 2 */ hist_site, /* data set 3 */ hist_xfer, /* data set 4 */ hist_page, /* data set 5 */ hist_visit); /* data set 6 */ /* now do html stuff... */ snprintf(index_fname,sizeof(index_fname),"index.%s",html_ext); if ( (out_fp=open_out_file(index_fname)) == NULL) { if (verbose) fprintf(stderr,"%s %s!\n",_("Error: Unable to open file"),index_fname); return 1; } write_html_head(_("Last 12 Months"), out_fp); /* year graph */ fprintf(out_fp,"\"%s\"

\n",buffer); /* month table */ fprintf(out_fp,"\n"); fprintf(out_fp,"\n"); fprintf(out_fp,"\n",_("Summary by Month")); fprintf(out_fp,"\n"); fprintf(out_fp,"\n",GREY,_("Month")); fprintf(out_fp,"\n",GREY,_("Daily Avg")); fprintf(out_fp,"\n",GREY,_("Monthly Totals")); fprintf(out_fp,"\n",DKGREEN,_("Hits")); fprintf(out_fp,"\n",LTBLUE,_("Files")); fprintf(out_fp,"\n",CYAN,_("Pages")); fprintf(out_fp,"\n",YELLOW,_("Visits")); fprintf(out_fp,"\n",ORANGE,_("Sites")); fprintf(out_fp,"\n",RED,_("KBytes")); fprintf(out_fp,"\n",YELLOW,_("Visits")); fprintf(out_fp,"\n",CYAN,_("Pages")); fprintf(out_fp,"\n",LTBLUE,_("Files")); fprintf(out_fp,"\n",DKGREEN,_("Hits")); fprintf(out_fp,"\n"); for (i=0;i<12;i++) { if (--s_mth < 0) s_mth = 11; if ((hist_month[s_mth]==0) && (hist_files[s_mth]==0)) continue; days_in_month=(hist_lday[s_mth]-hist_fday[s_mth])+1; fprintf(out_fp,"\n",hist_year[s_mth], hist_month[s_mth], html_ext, _(s_month[hist_month[s_mth]-1]), hist_year[s_mth]); fprintf(out_fp,"\n", hist_hit[s_mth]/days_in_month); fprintf(out_fp,"\n", hist_files[s_mth]/days_in_month); fprintf(out_fp,"\n", hist_page[s_mth]/days_in_month); fprintf(out_fp,"\n", hist_visit[s_mth]/days_in_month); fprintf(out_fp,"\n", hist_site[s_mth]); fprintf(out_fp,"\n", hist_xfer[s_mth]); fprintf(out_fp,"\n", hist_visit[s_mth]); fprintf(out_fp,"\n", hist_page[s_mth]); fprintf(out_fp,"\n", hist_files[s_mth]); fprintf(out_fp,"\n", hist_hit[s_mth]); gt_hit += hist_hit[s_mth]; gt_files += hist_files[s_mth]; gt_pages += hist_page[s_mth]; gt_xfer += hist_xfer[s_mth]; gt_visits+= hist_visit[s_mth]; } fprintf(out_fp,"\n"); fprintf(out_fp,"\n",GREY,_("Totals")); fprintf(out_fp,"\n",GREY,gt_xfer); fprintf(out_fp,"\n",GREY,gt_visits); fprintf(out_fp,"\n",GREY,gt_pages); fprintf(out_fp,"\n",GREY,gt_files); fprintf(out_fp,"\n",GREY,gt_hit); fprintf(out_fp,"\n"); fprintf(out_fp,"
",GREY); fprintf(out_fp,"%s
" \ "%s" \ "%s" \ "%s
" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s" \ "%s
%s %d%lu%lu%lu%lu%lu%.0f%lu%lu%lu%lu
" \ "%s" \ "%.0f" \ "%.0f" \ "%.0f" \ "%.0f" \ "%.0f
\n"); write_html_tail(out_fp); fclose(out_fp); return 0; } /*********************************************/ /* QS_SITE_CMPH - QSort compare site by hits */ /*********************************************/ int qs_site_cmph(const void *cp1, const void *cp2) { u_long t1, t2; t1=(*(HNODEPTR *)cp1)->count; t2=(*(HNODEPTR *)cp2)->count; if (t1!=t2) return (t2string, (*(HNODEPTR *)cp2)->string ); } /*********************************************/ /* QS_SITE_CMPK - QSort cmp site by bytes */ /*********************************************/ int qs_site_cmpk(const void *cp1, const void *cp2) { double t1, t2; t1=(*(HNODEPTR *)cp1)->xfer; t2=(*(HNODEPTR *)cp2)->xfer; if (t1!=t2) return (t2string, (*(HNODEPTR *)cp2)->string ); } /*********************************************/ /* QS_URL_CMPH - QSort compare URL by hits */ /*********************************************/ int qs_url_cmph(const void *cp1, const void *cp2) { u_long t1, t2; t1=(*(UNODEPTR *)cp1)->count; t2=(*(UNODEPTR *)cp2)->count; if (t1!=t2) return (t2string, (*(UNODEPTR *)cp2)->string ); } /*********************************************/ /* QS_URL_CMPK - QSort compare URL by bytes */ /*********************************************/ int qs_url_cmpk(const void *cp1, const void *cp2) { double t1, t2; t1=(*(UNODEPTR *)cp1)->xfer; t2=(*(UNODEPTR *)cp2)->xfer; if (t1!=t2) return (t2string, (*(UNODEPTR *)cp2)->string ); } /*********************************************/ /* QS_URL_CMPN - QSort compare URL by entry */ /*********************************************/ int qs_url_cmpn(const void *cp1, const void *cp2) { double t1, t2; t1=(*(UNODEPTR *)cp1)->entry; t2=(*(UNODEPTR *)cp2)->entry; if (t1!=t2) return (t2string, (*(UNODEPTR *)cp2)->string ); } /*********************************************/ /* QS_URL_CMPX - QSort compare URL by exit */ /*********************************************/ int qs_url_cmpx(const void *cp1, const void *cp2) { double t1, t2; t1=(*(UNODEPTR *)cp1)->exit; t2=(*(UNODEPTR *)cp2)->exit; if (t1!=t2) return (t2string, (*(UNODEPTR *)cp2)->string ); } /*********************************************/ /* QS_REF_CMPH - QSort compare Refs by hits */ /*********************************************/ int qs_ref_cmph(const void *cp1, const void *cp2) { u_long t1, t2; t1=(*(RNODEPTR *)cp1)->count; t2=(*(RNODEPTR *)cp2)->count; if (t1!=t2) return (t2string, (*(RNODEPTR *)cp2)->string ); } /*********************************************/ /* QS_AGNT_CMPH - QSort cmp Agents by hits */ /*********************************************/ int qs_agnt_cmph(const void *cp1, const void *cp2) { u_long t1, t2; t1=(*(ANODEPTR *)cp1)->count; t2=(*(ANODEPTR *)cp2)->count; if (t1!=t2) return (t2string, (*(ANODEPTR *)cp2)->string ); } /*********************************************/ /* QS_SRCH_CMPH - QSort cmp srch str by hits */ /*********************************************/ int qs_srch_cmph(const void *cp1, const void *cp2) { u_long t1, t2; t1=(*(SNODEPTR *)cp1)->count; t2=(*(SNODEPTR *)cp2)->count; if (t1!=t2) return (t2string, (*(SNODEPTR *)cp2)->string ); } /*********************************************/ /* QS_IDENT_CMPH - QSort cmp ident by hits */ /*********************************************/ int qs_ident_cmph(const void *cp1, const void *cp2) { u_long t1, t2; t1=(*(INODEPTR *)cp1)->count; t2=(*(INODEPTR *)cp2)->count; if (t1!=t2) return (t2string, (*(INODEPTR *)cp2)->string ); } /*********************************************/ /* LOAD_SITE_ARRAY - load up the sort array */ /*********************************************/ u_long load_site_array(HNODEPTR *pointer) { HNODEPTR hptr; int i; u_long ctr = 0; /* load the array */ for (i=0;inext; } } return ctr; /* return number loaded */ } /*********************************************/ /* LOAD_URL_ARRAY - load up the sort array */ /*********************************************/ u_long load_url_array(UNODEPTR *pointer) { UNODEPTR uptr; int i; u_long ctr = 0; /* load the array */ for (i=0;inext; } } return ctr; /* return number loaded */ } /*********************************************/ /* LOAD_REF_ARRAY - load up the sort array */ /*********************************************/ u_long load_ref_array(RNODEPTR *pointer) { RNODEPTR rptr; int i; u_long ctr = 0; /* load the array */ for (i=0;inext; } } return ctr; /* return number loaded */ } /*********************************************/ /* LOAD_AGENT_ARRAY - load up the sort array */ /*********************************************/ u_long load_agent_array(ANODEPTR *pointer) { ANODEPTR aptr; int i; u_long ctr = 0; /* load the array */ for (i=0;inext; } } return ctr; /* return number loaded */ } /*********************************************/ /* LOAD_SRCH_ARRAY - load up the sort array */ /*********************************************/ u_long load_srch_array(SNODEPTR *pointer) { SNODEPTR sptr; int i; u_long ctr = 0; /* load the array */ for (i=0;inext; } } return ctr; /* return number loaded */ } /*********************************************/ /* LOAD_IDENT_ARRAY - load up the sort array */ /*********************************************/ u_long load_ident_array(INODEPTR *pointer) { INODEPTR iptr; int i; u_long ctr = 0; /* load the array */ for (i=0;inext; } } return ctr; /* return number loaded */ } /*********************************************/ /* OPEN_OUT_FILE - Open file for output */ /*********************************************/ FILE *open_out_file(char *filename) { struct stat out_stat; FILE *out_fp; /* stat the file */ if ( !(lstat(filename, &out_stat)) ) { /* check if the file a symlink */ if ( S_ISLNK(out_stat.st_mode) ) { if (verbose) fprintf(stderr,"%s %s!\n",_("Error: File is a symlink"),filename); return NULL; } } /* open the file... */ if ( (out_fp=fopen(filename,"w")) == NULL) { if (verbose) fprintf(stderr,"%s %s!\n",_("Error: Unable to open file"),filename); return NULL; } return out_fp; }