#include "../include/traffic.h" void write_line(struct host *h, u_char type, FILE *fp); void log_file() { FILE *fp; /* File pointer */ u_int i; /* Counter variable */ struct host *host; /* Open logfile */ if ( (fp = fopen(opt.logfile, "w")) == NULL ) { perror(opt.logfile); exit(1); } /* Write header */ fprintf( fp, "Traffic Analyzer (c) Krzysztof Pawlowski 2002, 2003\n\n"); for(i=0; i < MAX_COL; i++) switch(opt.columns[i]) { case COL_IP: fprintf( fp, "%15s ","Host"); break; case COL_DATA: fprintf( fp, "%19s ","Data"); break; case COL_DATA_MAX: fprintf( fp, "%19s ","Data max"); break; case COL_DATA_AVG: fprintf( fp, "%19s ","Data avg"); break; case COL_DATA_TOT: fprintf( fp, "%23s ","Data total"); break; case COL_PKT: fprintf( fp, "%13s ","Packets"); break; case COL_PKT_TOT: fprintf( fp, "%17s ","Packets total"); break; case COL_PKT_AVG: fprintf( fp, "%13s ","Packets avg"); break; case COL_PKT_MAX: fprintf( fp, "%13s ","Packets max"); break; case COL_MAC: fprintf( fp, "%17s ","MAC address"); break; case COL_HOSTNAME: fprintf( fp, "%32s ","Hostname"); break; case COL_TCP: fprintf( fp, "%19s ","TCP"); break; case COL_UDP: fprintf( fp, "%19s ","UDP"); break; case COL_ICMP: fprintf( fp, "%19s ","ICMP"); break; case COL_TCP_TOT: fprintf( fp, "%23s ","Total TCP"); break; case COL_UDP_TOT: fprintf( fp, "%23s ","Total UDP"); break; case COL_ICMP_TOT: fprintf( fp, "%23s ","Total ICMP"); break; } /* Print statistics to file */ for(i=0; i < h_num; i++) write_line(&hosts[i], 0, fp); if (opt.total) { fprintf(fp, "\n"); write_line(&total,1, fp); } /* Print footer */ fprintf( fp, "\n\nDevice: %s | Unit: %s / %s | Refresh: %ds | Time: %2dh %2dm %2ds | From / To" , opt.dev, opt.unit_name, opt.unit_t_name, opt.delay , opt.times * opt.delay / 3600 , ((opt.times * opt.delay) % 3600) / 60 , (opt.times * opt.delay) % 60 ); fclose(fp); } /* Write line with statisic of one host */ void write_line(struct host *h, u_char type, FILE *fp) { int i; /* Write IP */ if (type == 0) fprintf( fp, "\n%-15s ", inet_ntoa(h->ip)); else fprintf( fp, "\n%-15s ", "TOTAL"); for(i=1; i < MAX_COL; i++) switch(opt.columns[i]) { case COL_DATA: /* Write data current */ fprintf( fp, "%8.2f / %8.2f ", (h->last_in * opt.unit / opt.delay) , (h->last_out * opt.unit / opt.delay)); break; case COL_DATA_MAX: /* Write data max */ fprintf( fp, "%8.2f / %8.2f ", (h->max_in * opt.unit / opt.delay) , (h->max_out * opt.unit / opt.delay)); break; case COL_DATA_AVG: /* Write data average */ fprintf( fp, "%8.2f / %8.2f ", (h->tot_in * opt.unit / (opt.times * opt.delay)) , (h->tot_out * opt.unit / (opt.times * opt.delay))); break; case COL_DATA_TOT: /* Write data total */ fprintf( fp, "%10.2f / %10.2f ", (h->tot_in * opt.unit_t) , (h->tot_out * opt.unit_t)); break; case COL_PKT: /* Write packet current */ fprintf( fp, "%5d / %5d ", (int)(h->last_pkt_in / opt.delay) , (int)(h->last_pkt_out / opt.delay)); break; case COL_PKT_TOT: /* Write packet total */ fprintf( fp, "%8d / %8d", (int)h->tot_pkt_in , (int)h->tot_pkt_out); break; case COL_PKT_AVG: /* Write packet average */ fprintf( fp, "%5d / %5d ", (int)(h->tot_pkt_in / (opt.delay * opt.times)) , (int)(h->tot_pkt_out / (opt.delay * opt.times))); break; case COL_PKT_MAX: /* Write packet maximum */ fprintf( fp, "%5d / %5d ", (int)(h->max_pkt_in / opt.delay) , (int)(h->max_pkt_out / opt.delay)); break; case COL_MAC: /* Write MAC address */ fprintf( fp, "%17s", h->mac); break; case COL_HOSTNAME: /* Write hostname */ fprintf( fp, "%32s", h->hostname); break; case COL_TCP: /* Write TCP current */ fprintf( fp, "%8.2f / %8.2f ", (h->last_tcp_in * opt.unit / opt.delay) , (h->last_tcp_out * opt.unit / opt.delay)); break; case COL_UDP: /* Write UDP current */ fprintf( fp, "%8.2f / %8.2f ", (h->last_udp_in * opt.unit / opt.delay) , (h->last_udp_out * opt.unit / opt.delay)); break; case COL_ICMP: /* Write ICMP current */ fprintf( fp, "%8.2f / %8.2f ", (h->last_icmp_in * opt.unit / opt.delay) , (h->last_icmp_out * opt.unit / opt.delay)); break; case COL_TCP_TOT: /* Write TCP total */ fprintf( fp, "%10.2f / %10.2f ", (h->tot_tcp_in * opt.unit_t) , (h->tot_tcp_out * opt.unit_t)); break; case COL_UDP_TOT: /* Write UDP total */ fprintf( fp, "%10.2f / %10.2f ", (h->tot_udp_in * opt.unit_t) , (h->tot_udp_out * opt.unit_t)); break; case COL_ICMP_TOT: /* Write ICMP total */ fprintf( fp, "%10.2f / %10.2f ", (h->tot_icmp_in * opt.unit_t) , (h->tot_icmp_out * opt.unit_t)); break; } }