logparse.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * COPYRIGHT AND DISCLAIMER
  3.  * 
  4.  * Copyright (C) 1996-1997 by the Regents of the University of California.
  5.  *
  6.  * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR
  7.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  8.  * OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF,
  9.  * EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  10.  * 
  11.  * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
  12.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
  13.  * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS
  14.  * PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO
  15.  * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
  16.  * MODIFICATIONS.
  17.  *
  18.  * For inquiries email Steve Gribble <gribble@cs.berkeley.edu>.
  19.  */
  20. /*
  21.  *     Author: Steve Gribble
  22.  *       Date: Nov. 23rd, 1996
  23.  *       File: logparse.c
  24.  */
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <ctype.h>
  29. #include <time.h>
  30. #include <unistd.h>
  31. #include <sys/time.h>
  32. #include <sys/types.h>
  33. #include <netinet/in.h>
  34. #include <errno.h>
  35. #include "logparse.h"
  36. #include "utils.h"
  37. // extern int errno; // -- this should come from errno.h
  38. /** 
  39.  ** lf_get_next_entry will suck the next record out of the logfile, and
  40.  ** return a lf_entry record witih the information stuffed into it.  Note
  41.  ** that memory WILL be allocated for the url field;  the caller is
  42.  ** responsible for freeing the memory when done.  The logfile should have
  43.  ** everything stored in network order, if all is well.
  44.  **
  45.  ** This function returns 0 on success, 1 for EOF, and something else
  46.  ** otherwise.  On failure,
  47.  ** no memory will have been allocated.
  48.  **/
  49. int lf_get_next_entry(int logfile_fd, lf_entry *nextentry, int vers)
  50. {
  51.   unsigned char blockbuf[60], *tmp;
  52.   int           uln, ret;
  53.   if ((ret = correct_read(logfile_fd, (char *)blockbuf, (size_t) 60)) != 60) {
  54.     if (ret == 0)
  55.       return 1;
  56. /*    fprintf(stderr, "read 60 failed...%dn", ret); */
  57.     return 2;
  58.   }
  59.   /* We got one! */
  60.   nextentry->version = vers;
  61.   memcpy( &(nextentry->crs),  blockbuf+0,  4);
  62.   memcpy( &(nextentry->cru),  blockbuf+4,  4);
  63.   memcpy( &(nextentry->srs),  blockbuf+8,  4);
  64.   memcpy( &(nextentry->sru),  blockbuf+12, 4);
  65.   memcpy( &(nextentry->sls),  blockbuf+16, 4);
  66.   memcpy( &(nextentry->slu),  blockbuf+20, 4);
  67.   memcpy( &(nextentry->cip),  blockbuf+24, 4);
  68.   memcpy( &(nextentry->cpt),  blockbuf+28, 2);
  69.   memcpy( &(nextentry->sip),  blockbuf+30, 4);
  70.   memcpy( &(nextentry->spt),  blockbuf+34, 2);
  71.   memcpy( &(nextentry->cprg), blockbuf+36, 1);
  72.   memcpy( &(nextentry->sprg), blockbuf+37, 1);
  73.   memcpy( &(nextentry->cims), blockbuf+38, 4);
  74.   memcpy( &(nextentry->sexp), blockbuf+42, 4);
  75.   memcpy( &(nextentry->slmd), blockbuf+46, 4);
  76.   memcpy( &(nextentry->rhl),  blockbuf+50, 4);
  77.   memcpy( &(nextentry->rdl),  blockbuf+54, 4);
  78.   memcpy( &(nextentry->urllen), blockbuf+58, 2);
  79.   /* Now let's read in that url */
  80.   uln = ntohs(nextentry->urllen);
  81.   nextentry->url = (unsigned char *) malloc(sizeof(char) * 
  82.     (int) (uln + 1));
  83.   if (nextentry->url == NULL) {
  84.     fprintf(stderr, "out of memory in lf_get_next_netry!n");
  85.     exit(1);
  86.   }
  87.   if ((ret = correct_read(logfile_fd, (char *) (nextentry->url), (size_t) uln))
  88.       != uln ) {
  89.     if (ret == 0) {
  90.       free(nextentry->url);
  91.       return 1;
  92.     }
  93.     fprintf(stderr, "read of %d failed %dn", uln, ret);
  94.     perror("aargh.");
  95.     free(nextentry->url);
  96.     return 2;
  97.   }
  98.   tmp = nextentry->url;
  99.   *(tmp + uln) = '';
  100.   return 0;
  101. }
  102. /** 
  103.  ** This function will convert all of the entries in the record into/from
  104.  ** host order.  This function is its own inverse.  This function cannot
  105.  ** fail.
  106.  **/
  107. void lf_convert_order(lf_entry *convertme)
  108. {
  109.   convertme->crs = ntohl(convertme->crs);
  110.   convertme->cru = ntohl(convertme->cru);
  111.   convertme->srs = ntohl(convertme->srs);
  112.   convertme->sru = ntohl(convertme->sru);
  113.   convertme->sls = ntohl(convertme->sls);
  114.   convertme->slu = ntohl(convertme->slu);
  115.   convertme->cip = ntohl(convertme->cip);
  116.   convertme->cpt = ntohs(convertme->cpt);
  117.   convertme->sip = ntohl(convertme->sip);
  118.   convertme->spt = ntohs(convertme->spt);
  119.   convertme->cims = ntohl(convertme->cims);
  120.   convertme->sexp = ntohl(convertme->sexp);
  121.   convertme->slmd = ntohl(convertme->slmd);
  122.   convertme->rhl = ntohl(convertme->rhl);
  123.   convertme->rdl = ntohl(convertme->rdl);
  124.   convertme->urllen = ntohs(convertme->urllen);
  125. }
  126. /**
  127.  ** This function will write the entry pointed to by writeme back
  128.  ** out to the file outf, in the canonical logfile binary format.
  129.  ** It returns 0 on success, something else on failure.
  130.  **/
  131. int  lf_write(FILE *outf, lf_entry *writeme)
  132. {
  133.   unsigned char blockbuf[60];
  134.   int           uln, ret;
  135.   memcpy( blockbuf+0, &(writeme->crs),   4);
  136.   memcpy( blockbuf+4, &(writeme->cru),   4);
  137.   memcpy( blockbuf+8, &(writeme->srs),   4);
  138.   memcpy( blockbuf+12, &(writeme->sru),  4);
  139.   memcpy( blockbuf+16, &(writeme->sls),  4);
  140.   memcpy( blockbuf+20, &(writeme->slu),  4);
  141.   memcpy( blockbuf+24, &(writeme->cip),  4);
  142.   memcpy( blockbuf+28, &(writeme->cpt),  2);
  143.   memcpy( blockbuf+30, &(writeme->sip),  4);
  144.   memcpy( blockbuf+34, &(writeme->spt),  2);
  145.   memcpy( blockbuf+36, &(writeme->cprg), 1);
  146.   memcpy( blockbuf+37, &(writeme->sprg), 1);
  147.   memcpy( blockbuf+38, &(writeme->cims), 4);
  148.   memcpy( blockbuf+42, &(writeme->sexp), 4);
  149.   memcpy( blockbuf+46, &(writeme->slmd), 4);
  150.   memcpy( blockbuf+50, &(writeme->rhl),  4);
  151.   memcpy( blockbuf+54, &(writeme->rdl),  4);
  152.   memcpy( blockbuf+58, &(writeme->urllen), 2);
  153.   ret = fwrite(&(blockbuf[0]), 60, 1, outf);
  154.   if (ret != 1) {
  155.     fprintf(stderr, "write 60 failed...%dn", ret);
  156.     perror("arrgh1");
  157.     return 1;
  158.   }
  159.   /* Now let's write out that url */
  160.   uln = ntohs(writeme->urllen);
  161.   ret = fwrite(writeme->url, (size_t) uln, 1, outf);
  162.   if (ret != 1) {
  163.     fprintf(stderr, "write of %d failed %dn", uln, ret);
  164.     perror("aargh.");
  165.     return 2;
  166.   }
  167.   return 0;
  168. }
  169. /** 
  170.  ** This function will dump a human-readable output version of the record
  171.  ** to the passed-in file pointer.  Assume that the record is in NETWORK
  172.  ** order. Nothing can possibly go wrong. :)
  173.  **/
  174. void lf_dump(FILE *dumpf, lf_entry *dumpme)
  175. {
  176.   char addr1buf[128], addr2buf[128];
  177.   lf_convert_order(dumpme);
  178.   lf_ntoa(dumpme->cip, addr1buf);
  179.   lf_ntoa(dumpme->sip, addr2buf);
  180.   fprintf(dumpf, "%lu:%lu %lu:%lu %lu:%lu %s:%hu %s:%hu %u %u ",
  181.   dumpme->crs, dumpme->cru, dumpme->srs, dumpme->sru,
  182.   dumpme->sls, dumpme->slu, addr1buf, dumpme->cpt,
  183.   addr2buf, dumpme->spt, dumpme->cprg, dumpme->sprg);
  184.   fprintf(dumpf, "%lu %lu %lu %lu %lu %u %sn",
  185.   dumpme->cims, dumpme->sexp, dumpme->slmd, dumpme->rhl,
  186.   dumpme->rdl, dumpme->urllen, dumpme->url);
  187.   lf_convert_order(dumpme);
  188. }
  189. /** 
  190.  ** lf_ntoa takes a network IP address (in host order) and converts it
  191.  ** to an ascii representation. addrbuf had better be 16 bytes or
  192.  ** more...
  193.  **/
  194. void lf_ntoa(unsigned long addr, char *addrbuf)
  195. {
  196.   sprintf(addrbuf, "%lu.%lu.%lu.%lu",
  197.   (addr >> 24),
  198.   (addr >> 16) % 256,
  199.   (addr >> 8) % 256,
  200.   (addr) % 256);
  201. }