home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / sarg1221.zip / topuser.c < prev    next >
C/C++ Source or Header  |  2002-10-11  |  20KB  |  500 lines

  1. /*
  2.  * sarg - Squid user management log
  3.  * Mar/98 - Pedro L Orso - orso@onda.com.br
  4.  */
  5.  
  6. #include "include/conf.h"
  7.  
  8. int topuser(const char *dirname, int debug, const char *outdir, int userip, char *BgColor, char *TxColor, char *TxBgColor, char *TiColor, char *LogoImage, char *LogoText, char *LogoTextColor, char *Width, char *Height, char *Title, char *BgImage, char *FontFace, char *HeaderColor, char *HeaderBgColor, char *FontSize, char *TempDir, char *Ip2Name, char *TopuserSortField, char *TopuserSortOrder, char *UserAgentLog, char *DateFormat, int smartfilter)
  9.  
  10. {
  11.  
  12.    FILE *fp_in, *fp_ou, *fp_top1, *fp_top2, *fp_top3;
  13.    long long int ttnbytes=0, ttnacc=0, tnacc=0;
  14.    long long int tnbytes=0, ttnelap=0, tnelap=0;
  15.    long long int tnincache=0, tnoucache=0, ttnincache=0, ttnoucache=0;
  16.    float perc=0.00;
  17.    float perc2=0.00;
  18.    float inperc=0.00, ouperc=0.00;
  19.    int posicao=0;
  20.    char olduser[MAXLEN], csort[MAXLEN], periodo[MAXLEN], arqper[MAXLEN];
  21.    char wger[MAXLEN], top1[MAXLEN], top2[MAXLEN], top3[MAXLEN];
  22.    char user[MAXLEN], nacc[20], nbytes[20], url[1024], preg[8000], tusr[MAXLEN];
  23.    char ip[MAXLEN], hora[16], data[16], elap[16], incac[16], oucac[16], html[MAXLEN];
  24.    char ipantes[MAXLEN], nameantes[MAXLEN];
  25.    char sfield[10]="2,2";
  26.    char order[3]="-r";
  27.    char wheader[512];
  28.    char ftime[128];
  29.    int  totuser=0;
  30.    int  topcount=0;
  31.    char *s;
  32.    char mask2[255]="<th bgcolor=%s><font size=%s color=%s>%s</font></th>";
  33.  
  34.    ipantes[0]='\0';
  35.    nameantes[0]='\0';
  36.  
  37.    strcpy(wger,dirname);
  38.    strcpy(top1,dirname);
  39.    strcpy(top2,dirname);
  40.    strcpy(top3,dirname);
  41.    strcpy(tusr,dirname);
  42.    strcat(wger,"/geral");
  43.    strcat(top1,"/top");
  44.    strcat(top2,"/top.tmp");
  45.    strcat(tusr,"/usuarios");
  46.    strcat(top3,"/index.html");
  47.  
  48.    if((fp_in=fopen(wger,"r"))==NULL) {
  49.     fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],wger);
  50.     exit(1);
  51.    }
  52.  
  53.    if((fp_top1=fopen(top1,"w"))==NULL) {
  54.     fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],top1);
  55.     exit(1);
  56.    }
  57.  
  58.    if((fp_top2=fopen(top2,"w"))==NULL) {
  59.     fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],top2);
  60.     exit(1);
  61.    }
  62.  
  63.    fscanf(fp_in,"%s",user);
  64.    fscanf(fp_in,"%s",nacc);
  65.    fscanf(fp_in,"%s",nbytes);
  66.    fscanf(fp_in,"%s",url);
  67.    fscanf(fp_in,"%s",ip);
  68.    fscanf(fp_in,"%s",hora);
  69.    fscanf(fp_in,"%s",data);
  70.    fscanf(fp_in,"%s",elap);
  71.    fscanf(fp_in,"%s",incac);
  72.    fscanf(fp_in,"%s",oucac);
  73.  
  74.    strcpy(olduser,user);
  75.    totuser=1;
  76.  
  77.    while(!feof(fp_in)) {
  78.       if(strcmp(olduser,user) != 0) {
  79.          if(strcmp(user,"TOTAL") != 0)
  80.             totuser++;
  81.  
  82.          my_lltoa(tnbytes,val1,15);
  83.          my_lltoa(tnacc,val2,15);
  84.          my_lltoa(tnelap,val3,15);
  85.          my_lltoa(tnincache,val4,15);
  86.          my_lltoa(tnoucache,val5,15);
  87.          sprintf(preg,"%s %s %s %s %s %s\n",olduser,val1,val2,val3,val4,val5);
  88.          fputs(preg,fp_top2);
  89.  
  90.      strcpy(olduser,user);
  91.          ttnbytes+=tnbytes;
  92.      ttnacc+=tnacc;
  93.      ttnelap+=tnelap;
  94.          ttnincache+=tnincache;
  95.          ttnoucache+=tnoucache;
  96.          tnbytes=0;
  97.          tnacc=0;
  98.          tnelap=0; 
  99.          tnincache=0;
  100.          tnoucache=0;
  101.       }
  102.  
  103.       tnbytes+=my_atoll(nbytes);
  104.       tnacc+=my_atoll(nacc);
  105.       tnelap+=my_atoll(elap);
  106.       tnincache+=my_atoll(incac);
  107.       tnoucache+=my_atoll(oucac);
  108.  
  109.       fscanf(fp_in,"%s",user);
  110.       fscanf(fp_in,"%s",nacc);
  111.       fscanf(fp_in,"%s",nbytes);
  112.       fscanf(fp_in,"%s",url);
  113.       fscanf(fp_in,"%s",ip);
  114.       fscanf(fp_in,"%s",hora);
  115.       fscanf(fp_in,"%s",data);
  116.       fscanf(fp_in,"%s",elap);
  117.       fscanf(fp_in,"%s",incac);
  118.       fscanf(fp_in,"%s",oucac);
  119.  
  120.       if(strcmp(user,"TOTAL") == 0)
  121.          continue;
  122.    }
  123.  
  124.    my_lltoa(tnbytes,val1,15);
  125.    my_lltoa(tnacc,val2,15);
  126.    my_lltoa(tnelap,val3,15);
  127.    my_lltoa(tnincache,val4,15);
  128.    my_lltoa(tnoucache,val5,15);
  129.    sprintf(preg,"%s %s %s %s %s %s\n",olduser,val1,val2,val3,val4,val5);
  130.    fputs(preg,fp_top2);
  131.  
  132.    ttnbytes+=tnbytes;
  133.    ttnacc+=tnacc;
  134.    ttnelap+=tnelap;
  135.    ttnincache+=tnincache;
  136.    ttnoucache+=tnoucache;
  137.  
  138.    my_lltoa(ttnbytes,val1,15);
  139.    my_lltoa(ttnacc,val2,15);
  140.    my_lltoa(ttnelap,val3,15);
  141.    my_lltoa(ttnincache,val4,15);
  142.    my_lltoa(ttnoucache,val5,15);
  143.    sprintf(preg,"TOTAL %s %s %s %s %s\n",val1,val2,val3,val4,val5);
  144.    fclose(fp_in);
  145.    fclose(fp_top2);
  146.    fclose(fp_top1);
  147.  
  148.    strup(TopuserSortField);
  149.    strlow(TopuserSortOrder);
  150.  
  151.    if(strcmp(TopuserSortField,"USER") == 0)
  152.       strcpy(sfield,"1,1");
  153.  
  154.    if(strcmp(TopuserSortField,"CONNECT") == 0)
  155.       strcpy(sfield,"3,3");
  156.  
  157.    if(strcmp(TopuserSortField,"TIME") == 0)
  158.       strcpy(sfield,"4,4");
  159.  
  160.    if(strcmp(TopuserSortOrder,"normal") == 0)
  161.       order[0]='\0';
  162.  
  163.    sprintf(csort, SORT" -n -T %s %s -k %s -o %s %s", TempDir, order, sfield, top1, top2);
  164.    system(csort);
  165.  
  166.    unlink(top2);
  167.  
  168.    if((fp_top1=fopen(top1,"a"))==NULL) {
  169.     fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],top1);
  170.     exit(1);
  171.    }
  172.    fputs(preg,fp_top1);
  173.    fclose(fp_top1);
  174.  
  175.    if((fp_top1=fopen(top1,"r"))==NULL) {
  176.       fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],top1);
  177.       exit(1);
  178.    }
  179.  
  180.    if((fp_top3=fopen(top3,"w"))==NULL) {
  181.       fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],top3);
  182.       exit(1);
  183.    }
  184.  
  185.  /*
  186.  * Obtem o periodo
  187.  */
  188.  
  189.    strcpy(arqper,dirname);
  190.    strcat(arqper,"/periodo");
  191.  
  192.    if ((fp_in = fopen(arqper, "r")) == 0) {
  193.       fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],arqper);
  194.       exit(1);
  195.    }
  196.  
  197.    fgets(periodo,sizeof(periodo),fp_in);
  198.    fclose(fp_in);
  199.  
  200.    fputs("<html>\n",fp_top3);
  201.    fputs("<head>\n",fp_top3);
  202.    sprintf(html,"  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
  203.    fputs(html,fp_top3);
  204.    fputs("</head>\n",fp_top3);
  205.  
  206.    // DAS: Using style=font-family more corresponds to standards. 
  207.    sprintf(preg,"<body bgcolor=%s text=%s background='%s' style='font-family:%s;'>\n",BgColor,TxColor,BgImage,FontFace);
  208.    fputs(preg,fp_top3);
  209.    fputs("<center><table cellpadding=0 cellspacing=0>\n",fp_top3);
  210.  
  211.    if(strlen(LogoImage) > 0) {
  212.       sprintf(preg,"<tr><th align=left><img src='%s' border=0 align=absmiddle width=%s height=%s><font color=%s>%s</font>\n",LogoImage,Width,Height,LogoTextColor,LogoText);
  213.       fputs(preg,fp_top3);
  214.    }
  215.  
  216.    sprintf(preg,"<tr><th align=center><b><font color=%s size=+1>%s</font></b></th></tr>\n",TiColor,Title);
  217.    fputs(preg,fp_top3);
  218.  
  219.    sprintf(preg,"<tr><td align=center bgcolor=%s><font size=%s>%s: %s</font></td></tr>\n",HeaderBgColor,FontSize,text[89],periodo);
  220.    fputs(preg,fp_top3);
  221.    strcat(wheader,(char *)text[104]);
  222.    strcat(wheader,": ");
  223.    strcat(wheader,TopuserSortField);
  224.    strcat(wheader,", ");
  225.    strcat(wheader,TopuserSortOrder);
  226.    sprintf(preg,"<tr><td align=center bgcolor=%s><font size=%s>%s</font></td></tr>\n",HeaderBgColor,FontSize,wheader);
  227.    fputs(preg,fp_top3);
  228.    sprintf(preg,"<tr><td align=center bgcolor=%s><font size=%s>Topuser %s</font></td></tr>\n",HeaderBgColor,FontSize,text[55]);
  229.    fputs(preg,fp_top3);
  230.  
  231.    fputs("</table></center>\n",fp_top3);
  232.    fputs("<center><table cellpadding=0 cellspacing=1>\n",fp_top3);
  233.    fputs("<tr><td></td><td></td></tr>",fp_top3);
  234.  
  235.    if(strstr(ReportType,"topsites") != 0) {
  236.       sprintf(preg,"<tr><td colspan=11><font size=-1><a href=\"topsites.html\">%s</a> %s</font></td></tr>\n",text[119],text[55]);
  237.       fputs(preg,fp_top3);
  238.    }
  239.  
  240.    if(strstr(ReportType,"sites_users") != 0) {
  241.       sprintf(preg,"<tr><td colspan=11><font size=-1><a href=\"siteuser.html\">%s</a> %s</font></td></tr>\n",text[85],text[55]);
  242.       fputs(preg,fp_top3);
  243.    }
  244.  
  245.    if(denied_count) {
  246.       sprintf(preg,"<tr><td colspan=11><font size=-1><a href=\"denied.html\">%s</a> %s</font></td></tr>\n",text[118],text[55]);
  247.       fputs(preg,fp_top3);
  248.    }
  249.  
  250.    if(authfail_count) {
  251.       sprintf(preg,"<tr><td colspan=11><font size=-1><a href=\"authfail.html\">%s</a> %s</font></td></tr>\n",text[117],text[55]);
  252.       fputs(preg,fp_top3);
  253.    }
  254.  
  255.    if(smartfilter) {
  256.      sprintf(preg,"<tr><td colspan=11><font size=-1><a href=\"smartfilter.html\">%s</a> %s</font></td></tr>\n",text[116],text[55]);
  257.      fputs(preg,fp_top3);
  258.    }
  259.    strcpy(preg,"<tr><td></td></tr>\n");
  260.    fputs(preg,fp_top3);
  261.  
  262.    strcpy(val1,text[100]);
  263.    strcpy(val2,text[98]);
  264.    strcpy(val3,text[92]);
  265.    strcpy(val4,text[93]);
  266.    sprintf(val11,"%%%s",text[93]);
  267.    sprintf(val5,"%s-%s-%s",text[113],text[114],text[112]);
  268.    strcpy(val6,text[94]);
  269.    strcpy(val7,text[95]);
  270.    sprintf(val8,"%%%s",text[99]);
  271.  
  272.    if(strstr(TopUserFields,"NUM") == 0)         bzero(val1, 255);
  273.    if(strstr(TopUserFields,"USERID") == 0)     bzero(val2, 255);
  274.    if(strstr(TopUserFields,"CONNECT") == 0)     bzero(val3, 255);
  275.    if(strstr(TopUserFields,"BYTES") == 0)     bzero(val4, 255);
  276.    if(strstr(TopUserFields,"SETYB") == 0)     bzero(val11, 255);
  277.    if(strstr(TopUserFields,"IN-CACHE-OUT") == 0) bzero(val5, 255);
  278.    if(strstr(TopUserFields,"USED_TIME") == 0)      bzero(val6, 255);
  279.    if(strstr(TopUserFields,"MILISEC") == 0)      bzero(val7, 255);
  280.    if(strstr(TopUserFields,"TIME") == 0)      bzero(val8, 255);
  281.  
  282.    sprintf(preg,"<tr><th bgcolor=%s><font size=%s color=%s>%s</font></th><th bgcolor=%s><font size=%s color=%s></font></th><th align=left bgcolor=%s><font size=%s color=%s>%s</font></th><th bgcolor=%s><font size=%s color=%s>%s</font></th><th bgcolor=%s><font size=%s color=%s>%s</font></th><th bgcolor=%s><font size=%s color=%s>%s</font></th><th bgcolor=%s colspan=2><font size=%s color=%s>%s</font></th><th bgcolor=%s><font size=%s color=%s>%s</font></th><th bgcolor=%s><font size=%s color=%s>%s</font></th><th bgcolor=%s><font size=%s color=%s>%s</font></th></tr>\n",HeaderBgColor,FontSize,HeaderColor,val1,HeaderBgColor,FontSize,HeaderColor,HeaderBgColor,FontSize,HeaderColor,val2,HeaderBgColor,FontSize,HeaderColor,val3,HeaderBgColor,FontSize,HeaderColor,val4,HeaderBgColor,FontSize,HeaderColor,val11,HeaderBgColor,FontSize,HeaderColor,val5,HeaderBgColor,FontSize,HeaderColor,val6,HeaderBgColor,FontSize,HeaderColor,val7,HeaderBgColor,FontSize,HeaderColor,val8);
  283.  
  284.    fputs(preg,fp_top3);
  285.  
  286.    strcpy(preg,"<tr><td></td></tr>\n");
  287.    fputs(preg,fp_top3);
  288.  
  289.    fscanf(fp_top1,"%s",user);
  290.    fscanf(fp_top1,"%s",nbytes);
  291.    fscanf(fp_top1,"%s",nacc);
  292.    fscanf(fp_top1,"%s",elap);
  293.    fscanf(fp_top1,"%s",incac);
  294.    fscanf(fp_top1,"%s",oucac);
  295.  
  296.    while(!feof(fp_top1)) {
  297.       if(atoi(TopUsersNum) > 0 && topcount >= atoi(TopUsersNum)) goto final;
  298.       strcpy(user2,user);
  299.       tnbytes=my_atoll(nbytes);
  300.  
  301.       if(tnbytes) {
  302.          perc=tnbytes * 100;
  303.          perc=perc / ttnbytes;
  304.       } else perc = 0;
  305.  
  306.       if(atol(elap)) {
  307.          perc2=atol(elap);
  308.          perc2=((perc2 * 100) / ttnelap);
  309.       } else perc2 = 0;
  310.  
  311.       if(atol(incac)) {
  312.          inperc=atol(incac);
  313.          inperc=((inperc * 100) / tnbytes);
  314.       } else inperc = 0;
  315.  
  316.       if(atol(oucac)) {
  317.          ouperc=atol(oucac);
  318.          ouperc=((ouperc * 100) / tnbytes);
  319.       } else ouperc = 0;
  320.  
  321.       strcpy(href," ");
  322.       strcpy(href2," ");
  323.  
  324.       if(strcmp(user,"TOTAL") != 0){
  325.          strcpy(href,"<a href='");
  326.          strcpy(href2,"<a href='d");
  327.          strcat(href,user);
  328.          strcat(href2,user);
  329.          strcat(href,".html'>");
  330.          strcat(href2,".html'>");
  331.       }
  332.  
  333.       posicao++;
  334.  
  335.       tnelap=my_atoll(elap);
  336.  
  337.       if(userip) {
  338.          fixip(user2);
  339.          if(strcmp(Ip2Name,"yes") == 0) {
  340.             if(strcmp(user2,ipantes) != 0) {
  341.                strcpy(ipantes,user2);
  342.                ip2name(user2);
  343.                strcpy(nameantes,user2);
  344.             } else strcpy(user2,nameantes);
  345.          }
  346.       }
  347.     
  348.       if(strstr(ReportType,"date_time") != 0) {
  349.          sprintf(ltext110,"%s",text[110]);
  350.          if(*ltext110){
  351.             for(s=ltext110; *s; ++s)
  352.                *s=tolower(*s);
  353.          }
  354.       } else {
  355.          bzero(href2, MAXLEN);
  356.          bzero(ltext110, 50);
  357.          sprintf(val1,"%s/d%s.html",dirname,user);
  358.      unlink(val1);
  359.       }
  360.  
  361.       if(UserTabFile[0] != '\0') {
  362.          sprintf(warea,":%s:",user2);
  363.      
  364.          if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) {
  365.             z1=0;
  366.             str2=(char *) strstr(str+1,":");
  367.             str2++;
  368.             bzero(name, MAXLEN);
  369.             while(str2[z1] != ':') {
  370.                name[z1]=str2[z1];
  371.                z1++;
  372.             }
  373.          } else strcpy(name,user2);
  374.       } else strcpy(name,user2);
  375.  
  376.       if(strcmp(Ip2Name,"yes") == 0) {
  377.          if((str=(char *) strstr(name, ".")) != (char *) NULL) {
  378.             if((str=(char *) strstr(str+1, ".")) != (char *) NULL)
  379.                ip2name(name);
  380.          }
  381.       }
  382.  
  383.       twork=my_atoll(nacc);
  384.       my_lltoa(twork,nacc,0);
  385.       sprintf(wwork1,"%s",fixnum(twork));
  386.       sprintf(wwork2,"%s",fixnum(tnbytes));
  387.       sprintf(wwork3,"%s",fixnum(tnelap));
  388.  
  389.       sprintf(val1,"%d",posicao);
  390.       sprintf(val2,"%s%s</a>",href2,ltext110);
  391.       sprintf(val3,"%3.2f%%",perc);
  392.       sprintf(val4,"%3.2f%%",inperc);
  393.       sprintf(val5,"%3.2f%%",ouperc);
  394.       sprintf(val6,"%s",buildtime(tnelap));
  395.       sprintf(val7,"%3.2f%%",perc2);
  396.  
  397.       if(strstr(TopUserFields,"NUM") == 0)              bzero(val1, 255);
  398.       if(strstr(TopUserFields,"USERID") == 0)        bzero(val2, 255);
  399.       if(strstr(TopUserFields,"CONNECT") == 0)         bzero(wwork1, 255);
  400.       if(strstr(TopUserFields,"BYTES") == 0)         bzero(wwork2, 255);
  401.       if(strstr(TopUserFields,"SETYB") == 0)         bzero(val3, 255);
  402.       if(strstr(TopUserFields,"IN-CACHE-OUT") == 0)     bzero(val4, 255);
  403.       if(strstr(TopUserFields,"IN-CACHE-OUT") == 0)     bzero(val5, 255);
  404.       if(strstr(TopUserFields,"USED_TIME") == 0)     bzero(val6, 255);
  405.       if(strstr(TopUserFields,"MILISEC") == 0)          bzero(wwork3, 255);
  406.       if(strstr(TopUserFields,"TIME") == 0)          bzero(val7, 255);
  407.       if(strstr(ReportType,"users_sites") == 0)         href[0]='\0';
  408.  
  409.       sprintf(preg,"<tr><td align=right border=0 bgcolor=%s><font size=%s>%s</font></td><td bgcolor=%s><font size=%s>%s</font></td><td bgcolor=%s><font size=%s>%s%s</font></td><td align=right bgcolor=%s><font size=%s>%s</font></td><td align=right bgcolor=%s><font size=%s>%s</font></td><td align=right bgcolor=%s><font size=%s>%s</font></td><td align=right bgcolor=%s><font size=%s>%s</font></td><td align=right bgcolor=%s><font size=%s>%s</font></td><td align=center bgcolor=%s><font size=%s>%s</font></td><td align=right bgcolor=%s><font size=%s>%s</font><td align=right bgcolor=%s><font size=%s>%s</font></td></tr>\n",TxBgColor,FontSize,val1,TxBgColor,FontSize,val2,TxBgColor,FontSize,href,name,TxBgColor,FontSize,wwork1,TxBgColor,FontSize,wwork2,TxBgColor,FontSize,val3,TxBgColor,FontSize,val4,TxBgColor,FontSize,val5,TxBgColor,FontSize,val6,TxBgColor,FontSize,wwork3,TxBgColor,FontSize,val7);
  410.  
  411.       if(strstr(user,"TOTAL") != 0){
  412.  
  413.      strcpy(preg,"<tr><td></td></tr><tr><td></td></tr>");
  414.          fputs(preg,fp_top3);
  415.  
  416.          if(atol(incac)) {
  417.             inperc=ttnbytes / 100;
  418.             inperc=atol(incac) / inperc;
  419.          } else inperc = 0;
  420.  
  421.          if(atol(oucac)) {
  422.             ouperc=ttnbytes / 100;
  423.             ouperc=atol(oucac) / ouperc;
  424.          } else ouperc = 0;
  425.  
  426.      sprintf(wwork1,"%s",fixnum(ttnacc));
  427.      sprintf(wwork2,"%s",fixnum(ttnbytes));
  428.      sprintf(wwork3,"%s",fixnum(ttnelap));
  429.  
  430.          if(strstr(ReportType,"date_time") != 0) {
  431.         if(strstr(TopUserFields,"TOTAL") != 0)
  432.                sprintf(preg,"<tr><td></td><th align=left bgcolor=%s><font size=%s color=%s>%s</th><td></td><th align=right bgcolor=%s><font size=%s color=%s>%s</th><th align=right bgcolor=%s><font size=%s color=%s>%15s</th><td></td><th align=right bgcolor=%s><font size=%s color=%s>%3.2f%%</th><th align=left bgcolor=%s><font size=%s color=%s>%3.2f%%</th><th align=center bgcolor=%s><font size=%s color=%s>%s</th><th align=right bgcolor=%s><font size=%s color=%s>%s</th></tr>\n",HeaderBgColor,FontSize,HeaderColor,text[107],HeaderBgColor,FontSize,HeaderColor,wwork1,HeaderBgColor,FontSize,HeaderColor,wwork2,HeaderBgColor,FontSize,HeaderColor,inperc,HeaderBgColor,FontSize,HeaderColor,ouperc,HeaderBgColor,FontSize,HeaderColor,buildtime(ttnelap),HeaderBgColor,FontSize,HeaderColor,wwork3);
  433.      } else if(strstr(TopUserFields,"TOTAL") != 0)
  434.             sprintf(preg,"<tr><td></td><td></td><th align=left bgcolor=%s><font size=%s color=%s>%s</th><th align=right bgcolor=%s><font size=%s color=%s>%s</th><th align=right bgcolor=%s><font size=%s color=%s>%15s</th><td></td><th align=right bgcolor=%s><font size=%s color=%s>%3.2f%%</th><th align=left bgcolor=%s><font size=%s color=%s>%3.2f%%</th><th align=center bgcolor=%s><font size=%s color=%s>%s</th><th align=right bgcolor=%s><font size=%s color=%s>%s</th></tr>\n",HeaderBgColor,FontSize,HeaderColor,text[107],HeaderBgColor,FontSize,HeaderColor,wwork1,HeaderBgColor,FontSize,HeaderColor,wwork2,HeaderBgColor,FontSize,HeaderColor,inperc,HeaderBgColor,FontSize,HeaderColor,ouperc,HeaderBgColor,FontSize,HeaderColor,buildtime(ttnelap),HeaderBgColor,FontSize,HeaderColor,wwork3);
  435.  
  436.       }
  437.  
  438.       fputs(preg,fp_top3);
  439.  
  440.       topcount++;
  441.  
  442.       fscanf(fp_top1,"%s",user);
  443.       fscanf(fp_top1,"%s",nbytes);
  444.       fscanf(fp_top1,"%s",nacc);
  445.       fscanf(fp_top1,"%s",elap);
  446.       fscanf(fp_top1,"%s",incac);
  447.       fscanf(fp_top1,"%s",oucac);
  448.    }
  449.  
  450.    if(ttnbytes) {
  451.       tnbytes=ttnbytes / totuser;
  452.    } else tnbytes=0;
  453.  
  454.    twork=ttnacc/totuser;
  455.    twork2=ttnelap/totuser;
  456.    sprintf(wwork1,"%s",fixnum(twork));
  457.    sprintf(wwork2,"%s",fixnum(tnbytes));
  458.    sprintf(wwork3,"%s",fixnum(twork2));
  459.  
  460.    if((strstr(ReportType,"date_time") && strstr(TopUserFields,"AVERAGE") != 0))
  461.       sprintf(preg,"<tr><th></th><th align=left bgcolor=%s><font size=%s color=%s>%s</font></th><th></th><th align=right bgcolor=%s><font size=%s color=%s>%s</font></th><th align=right bgcolor=%s><font size=%s color=%s>%15s</font></th><td></td><td></td><td></td><th align=center bgcolor=%s><font size=%s color=%s>%s</font></th><th align=right bgcolor=%s><font size=%s color=%s>%s</font></th></tr>\n",HeaderBgColor,FontSize,HeaderColor,text[96],HeaderBgColor,FontSize,HeaderColor,wwork1,HeaderBgColor,FontSize,HeaderColor,wwork2,HeaderBgColor,FontSize,HeaderColor,buildtime(ttnelap/totuser),HeaderBgColor,FontSize,HeaderColor,wwork3);
  462.    else
  463.       if(strstr(TopUserFields,"AVERAGE") != 0) {
  464.          sprintf(preg,"<tr><th><td></td></th><th align=left bgcolor=%s><font size=%s color=%s>%s</font></th><th align=right bgcolor=%s><font size=%s color=%s>%s</font></th><th align=right bgcolor=%s><font size=%s color=%s>%15s</font></th><td></td><td></td><td></td><th align=center bgcolor=%s><font size=%s color=%s>%s</font></th><th align=right bgcolor=%s><font size=%s color=%s>%s</font></th></tr>\n",HeaderBgColor,FontSize,HeaderColor,text[96],HeaderBgColor,FontSize,HeaderColor,wwork1,HeaderBgColor,FontSize,HeaderColor,wwork2,HeaderBgColor,FontSize,HeaderColor,buildtime(ttnelap/totuser),HeaderBgColor,FontSize,HeaderColor,wwork3);
  465.          fputs(preg,fp_top3);
  466.       }
  467.  
  468.    if(strlen(UserAgentLog) > 0) {
  469.       fputs("<tr><td></td></tr>\n",fp_top3);
  470.       fputs("<tr><td></td></tr>\n",fp_top3);
  471.       fputs("<td align=left colspan=8><font size=-1><a href='useragent.html'>Useragent</a> Report</td>\n",fp_top3);
  472.    }
  473.  
  474.    strcpy(preg,"</table></center>");
  475.    fputs(preg,fp_top3);
  476.  
  477.    zdate(ftime, DateFormat);
  478.    sprintf(html,"<br><br><center><font size=-2>%s <a href='%s'>%s-%s</a> %s %s</font></center>\n",text[108],URL,PGM,VERSION,text[109],ftime);
  479.    fputs(html,fp_top3);
  480.  
  481. final:
  482.    fclose(fp_top1);
  483.    if(strcmp(RemoveTempFiles,"yes") == 0)
  484.       unlink(top1);
  485.  
  486.    fclose(fp_top3);
  487.  
  488.    if((fp_ou=fopen(tusr,"w"))==NULL) {
  489.       fprintf(stderr, "SARG: (topuser) %s: %s\n",text[45],tusr);
  490.       exit(1);
  491.    }
  492.  
  493.    sprintf(preg,"%d\n",totuser);
  494.    fputs(preg,fp_ou);
  495.  
  496.    fclose(fp_ou);
  497.  
  498.    return (0);
  499. }
  500.