⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashtab.c

📁 c语言实现的web http报文分析
💻 C
📖 第 1 页 / 共 2 页
字号:
int put_anode(char *str, int type, u_long count, u_long *ctr, ANODEPTR *htab){   ANODEPTR cptr,nptr;   if (str[0]=='-') return 0;     /* skip bad user agents */   /* check if hashed */   if ( (cptr = htab[hash(str)]) == NULL)   {      /* not hashed */      if ( (nptr=new_anode(str)) != NULL)      {         nptr->flag = type;         nptr->count= count;         nptr->next = NULL;         htab[hash(str)] = nptr;         if (type!=OBJ_GRP) (*ctr)++;      }   }   else   {      /* hashed */      while (cptr != NULL)      {         if (strcmp(cptr->string,str)==0)         {            if ((type==cptr->flag)||((type!=OBJ_GRP)&&(cptr->flag!=OBJ_GRP)))            {               /* found... bump counter */               cptr->count+=count;               return 0;            }         }         cptr = cptr->next;      }      /* not found... */      if ( (nptr = new_anode(str)) != NULL)      {         nptr->flag  = type;         nptr->count = count;         nptr->next  = htab[hash(str)];         htab[hash(str)]=nptr;         if (type!=OBJ_GRP) (*ctr)++;      }   }   if (type==OBJ_GRP) nptr->flag=OBJ_GRP;   else if (isinlist(hidden_agents,nptr->string)!=NULL)                      nptr->flag=OBJ_HIDE;   return nptr==NULL;}/*********************************************//* DEL_ALIST - delete user agent hash table  *//*********************************************/void	del_alist(ANODEPTR *htab){   /* free memory used by hash table */   ANODEPTR aptr,temp;   int i;   for (i=0;i<MAXHASH;i++)   {      if (htab[i] != NULL)      {         aptr = htab[i];         while (aptr != NULL)         {            temp = aptr->next;            free (aptr->string);            free (aptr);            aptr = temp;         }         htab[i]=NULL;      }   }}/*********************************************//* NEW_SNODE - Search str node creation      *//*********************************************/SNODEPTR new_snode(char *str){   SNODEPTR newptr;   char     *sptr;   if (strlen(str) >= MAXSRCHH)   {      if (verbose)      {         fprintf(stderr,"[new_snode] %s (%d)",msg_big_one,strlen(str));         if (debug_mode)            fprintf(stderr,":\n--> %s",str);         fprintf(stderr,"\n");      }      str[MAXSRCHH-1]=0;   }   if ( (sptr=malloc(strlen(str)+1))==NULL ) return (SNODEPTR)NULL;   strcpy(sptr,str);   if (( newptr = malloc(sizeof(struct snode))) != NULL)   {      newptr->string= sptr;      newptr->count = 1;   }   else free(sptr);   return newptr;}/*********************************************//* PUT_SNODE - insert/update search str node *//*********************************************/int put_snode(char *str, u_long count, SNODEPTR *htab){   SNODEPTR cptr,nptr;   if (str[0]==0 || str[0]==' ') return 0;     /* skip bad search strs */   /* check if hashed */   if ( (cptr = htab[hash(str)]) == NULL)   {      /* not hashed */      if ( (nptr=new_snode(str)) != NULL)      {         nptr->count = count;         nptr->next = NULL;         htab[hash(str)] = nptr;      }   }   else   {      /* hashed */      while (cptr != NULL)      {         if (strcmp(cptr->string,str)==0)         {            /* found... bump counter */            cptr->count+=count;            return 0;         }         cptr = cptr->next;      }      /* not found... */      if ( (nptr = new_snode(str)) != NULL)      {         nptr->count = count;         nptr->next  = htab[hash(str)];         htab[hash(str)]=nptr;      }   }   return nptr==NULL;}/*********************************************//* DEL_SLIST - delete search str hash table  *//*********************************************/void	del_slist(SNODEPTR *htab){   /* free memory used by hash table */   SNODEPTR aptr,temp;   int i;   for (i=0;i<MAXHASH;i++)   {      if (htab[i] != NULL)      {         aptr = htab[i];         while (aptr != NULL)         {            temp = aptr->next;            free (aptr->string);            free (aptr);            aptr = temp;         }         htab[i]=NULL;      }   }}/*********************************************//* NEW_INODE - create ident (username) node  *//*********************************************/INODEPTR new_inode(char *str){   INODEPTR newptr;   char     *sptr;   if (strlen(str) >= MAXIDENT)   {      if (verbose)      {         fprintf(stderr,"[new_inode] %s (%d)",msg_big_one,strlen(str));         if (debug_mode)            fprintf(stderr,":\n--> %s",str);         fprintf(stderr,"\n");      }      str[MAXIDENT-1]=0;   }   if ( (sptr=malloc(strlen(str)+1))==NULL ) return (INODEPTR)NULL;   strcpy(sptr,str);   if (( newptr = malloc(sizeof(struct inode))) != NULL)   {      newptr->string    =sptr;      newptr->visit     =1;      newptr->tstamp    =0;   }   else free(sptr);   return newptr;}/*********************************************//* PUT_INODE - insert/update ident node      *//*********************************************/int put_inode( char     *str,   /* ident str */               int       type,  /* obj type  */               u_long    count, /* hit count */               u_long    file,  /* File flag */               double    xfer,  /* xfer size */               u_long   *ctr,   /* counter   */               u_long    visit, /* visits    */               u_long    tstamp,/* timestamp */               INODEPTR *htab)  /* hashtable */{   INODEPTR cptr,nptr;   if ((str[0]=='-') || (str[0]==0)) return 0;  /* skip if no username */   /* check if hashed */   if ( (cptr = htab[hash(str)]) == NULL)   {      /* not hashed */      if ( (nptr=new_inode(str)) != NULL)      {         nptr->flag  = type;         nptr->count = count;         nptr->files = file;         nptr->xfer  = xfer;         nptr->next  = NULL;         htab[hash(str)] = nptr;         if (type!=OBJ_GRP) (*ctr)++;         if (visit)         {            nptr->visit=(visit-1);            nptr->tstamp=tstamp;            return 0;         }         else         {            if (ispage(log_rec.url)) nptr->tstamp=tstamp;         }      }   }   else   {      /* hashed */      while (cptr != NULL)      {         if (strcmp(cptr->string,str)==0)         {            if ((type==cptr->flag)||((type!=OBJ_GRP)&&(cptr->flag!=OBJ_GRP)))            {               /* found... bump counter */               cptr->count+=count;               cptr->files+=file;               cptr->xfer +=xfer;               if (ispage(log_rec.url))               {                  if ((tstamp-cptr->tstamp)>=visit_timeout)                     cptr->visit++;                  cptr->tstamp=tstamp;               }               return 0;            }         }         cptr = cptr->next;      }      /* not found... */      if ( (nptr = new_inode(str)) != NULL)      {         nptr->flag  = type;         nptr->count = count;         nptr->files = file;         nptr->xfer  = xfer;         nptr->next  = htab[hash(str)];         htab[hash(str)]=nptr;         if (type!=OBJ_GRP) (*ctr)++;         if (visit)         {            nptr->visit = (visit-1);            nptr->tstamp= tstamp;            return 0;         }         else         {            if (ispage(log_rec.url)) nptr->tstamp= tstamp;         }      }   }   if (nptr!=NULL)   {      /* set object type */      if (type==OBJ_GRP) nptr->flag=OBJ_GRP;            /* is it a grouping? */      else      {         /* check if it's a hidden object */         if (isinlist(hidden_users,nptr->string)!=NULL)           nptr->flag=OBJ_HIDE;      }   }   return nptr==NULL;}/*********************************************//* DEL_ILIST - delete ident hash table       *//*********************************************/void	del_ilist(INODEPTR *htab){   /* free memory used by hash table */   INODEPTR aptr,temp;   int i;   for (i=0;i<MAXHASH;i++)   {      if (htab[i] != NULL)      {         aptr = htab[i];         while (aptr != NULL)         {            temp = aptr->next;            free (aptr->string);    /* free ident string space */            free (aptr);            /* free ident structure    */            aptr = temp;         }         htab[i]=NULL;      }   }}#ifdef USE_DNS   /* only add these for DNS   *//*********************************************//* NEW_DNODE - DNS resolver node creation    *//*********************************************/DNODEPTR new_dnode(char *str){   DNODEPTR newptr;   char     *sptr;   if (strlen(str) >= MAXHOST)   {      if (verbose)      {         fprintf(stderr,"[new_dnode] %s (%d)",msg_big_one,strlen(str));         if (debug_mode)            fprintf(stderr,":\n--> %s",str);         fprintf(stderr,"\n");      }      str[MAXHOST-1]=0;   }   if ( (sptr=malloc(strlen(str)+1))==NULL ) return (DNODEPTR)NULL;   strcpy(sptr,str);   if (( newptr = malloc(sizeof(struct dnode))) != NULL)   {      newptr->string= sptr;   }   else free(sptr);   return newptr;}/*********************************************//* PUT_DNODE - insert/update dns host node   *//*********************************************/int put_dnode(char *str, struct in_addr *addr, DNODEPTR *htab){   DNODEPTR cptr,nptr;   if (str[0]==0 || str[0]==' ') return 0;     /* skip bad hostnames */   /* check if hashed */   if ( (cptr = htab[hash(str)]) == NULL)   {      /* not hashed */      if ( (nptr=new_dnode(str)) != NULL)      {         if (addr) memcpy(&nptr->addr, addr, sizeof(struct in_addr));            else   memset(&nptr->addr, 0, sizeof(struct in_addr));         nptr->next = NULL;         htab[hash(str)] = nptr;      }   }   else   {      /* hashed */      while (cptr != NULL)      {         if (strcmp(cptr->string,str)==0) return 0;         cptr = cptr->next;      }      /* not found... */      if ( (nptr = new_dnode(str)) != NULL)      {         if (addr) memcpy(&nptr->addr, addr, sizeof(struct in_addr));            else   memset(&nptr->addr, 0, sizeof(struct in_addr));         nptr->next  = htab[hash(str)];         htab[hash(str)]=nptr;      }   }   return nptr==NULL;}/*********************************************//* DEL_DLIST - delete dns hash table         *//*********************************************/void	del_dlist(DNODEPTR *htab){   /* free memory used by hash table */   DNODEPTR dptr,temp;   int i;   for (i=0;i<MAXHASH;i++)   {      if (htab[i] != NULL)      {         dptr = htab[i];         while (dptr != NULL)         {            temp = dptr->next;            free (dptr->string);            free (dptr);            dptr = temp;         }         htab[i]=NULL;      }   }}#endif /* USE_DNS *//*********************************************//* HASH - return hash value for string       *//*********************************************/u_long hash(char *str){   u_long hashval;   for (hashval = 0; *str != '\0'; str++)      hashval = *str + 31 * hashval;   return hashval % MAXHASH;}/*********************************************//* FIND_URL - Find URL in hash table         *//*********************************************/char *find_url(char *str){   UNODEPTR cptr;   if ( (cptr=um_htab[hash(str)]) != NULL)   {      while (cptr != NULL)      {         if (strcmp(cptr->string,str)==0)            return cptr->string;         cptr = cptr->next;      }   }   return blank_str;   /* shouldn't get here */}/*********************************************//* UPDATE_ENTRY - update entry page total    *//*********************************************/void update_entry(char *str){   UNODEPTR uptr;   if (str==NULL) return;   if ( (uptr = um_htab[hash(str)]) == NULL) return;   else   {      while (uptr != NULL)      {         if (strcmp(uptr->string,str)==0)         {            if (uptr->flag!=OBJ_GRP)            {               uptr->entry++;               return;            }         }         uptr=uptr->next;      }   }}/*********************************************//* UPDATE_EXIT  - update exit page total     *//*********************************************/void update_exit(char *str){   UNODEPTR uptr;   if (str==NULL) return;   if ( (uptr = um_htab[hash(str)]) == NULL) return;   else   {      while (uptr != NULL)      {         if (strcmp(uptr->string,str)==0)         {            if (uptr->flag!=OBJ_GRP)            {               uptr->exit++;               return;            }         }         uptr=uptr->next;      }   }}/*********************************************//* MONTH_UPDATE_EXIT  - eom exit page update *//*********************************************/void month_update_exit(u_long tstamp){   HNODEPTR nptr;   int i;   for (i=0;i<MAXHASH;i++)   {      nptr=sm_htab[i];      while (nptr!=NULL)      {         if (nptr->flag!=OBJ_GRP)         {            if ((tstamp-nptr->tstamp)>=visit_timeout)               update_exit(nptr->lasturl);         }         nptr=nptr->next;      }   }}/*********************************************//* TOT_VISIT - calculate total visits        *//*********************************************/u_long tot_visit(HNODEPTR *list){   HNODEPTR   hptr;   u_long     tot=0;   int        i;   for (i=0;i<MAXHASH;i++)   {      hptr=list[i];      while (hptr!=NULL)      {         if (hptr->flag!=OBJ_GRP) tot+=hptr->visit;         hptr=hptr->next;      }   }   return tot;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -