diff.c
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:5k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /* Nessuslib -- the Nessus Library
  2.  * Copyright (C) 2000 Renaud Deraison
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Library General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Library General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Library General Public
  15.  * License along with this library; if not, write to the Free
  16.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  *
  18.  * 
  19.  * Banner comparison functions. The problem with banner comparison is that
  20.  * a lot of banners display the current time of the day along their lines.
  21.  * This does not ease our task which will be to determine if a change in 
  22.  * two banners is due to a time change or something else.
  23.  */
  24.  
  25. #include <includes.h> 
  26. #undef DEBUG
  27. /*------------------------------------------------------------------------* 
  28.  *                      Private definitions                               *
  29.  *------------------------------------------------------------------------*/
  30.  
  31. #define abs(x) ((x)>0?(x):-(x))
  32. #define NO_DATE 0
  33. #define IS_DATE 1
  34. #define NEED_CONTEXT 2
  35.  
  36. /*
  37.  * Return <1> if <a> appears to be a date.
  38.  *
  39.  * <a> will not be a valid date if :
  40.  * - the timezone changes 
  41.  * - two numbers are separated by spaces. For instance "4 12 Sep" is
  42.  *        *not* a date
  43.  *
  44.  * - it contains something else than a digit, space, comma, semi-column,
  45.  *   {Mon...Sun} or {Jan..Dec}
  46.  */
  47. static int
  48. is_date(a)
  49.  char *a;
  50. {
  51.  int i, l;
  52.  int space = 0;
  53.  int digit = 0;
  54.  
  55.  
  56.  l = strlen(a);
  57.  if(l==1)return NEED_CONTEXT;
  58.  for(i=0;i<l;i++)
  59.  {
  60.  if(isdigit(a[i])){
  61.   if(space && digit){
  62. return 0;
  63. }
  64. digit++;
  65. space = 0;
  66. continue;
  67. }
  68.  else if(a[i]==':'){
  69.   space = 0;
  70.   continue;
  71. }
  72.  else if(a[i]=='+'){
  73.   space = 0;
  74.   continue;
  75. }
  76.  else if(a[i]==' '){
  77.   space++;
  78. continue;
  79. }
  80.  else if(a[i]==','){
  81.   space = 0;
  82.   continue;
  83. }
  84.  else {
  85.  if((!strncmp(a+i, "Mon", 3))||
  86.     (!strncmp(a+i, "Tue", 3))||
  87.     (!strncmp(a+i, "Wed", 3))||
  88.     (!strncmp(a+i, "Thu", 3))||
  89.     (!strncmp(a+i, "Fri", 3))||
  90.     (!strncmp(a+i, "Sat", 3))||
  91.     (!strncmp(a+i, "Sun", 3))||
  92.     (!strncmp(a+i, "Jan", 3))||
  93.     (!strncmp(a+i, "Feb", 3))||
  94.     (!strncmp(a+i, "Mar", 3))||
  95.     (!strncmp(a+i, "Apr", 3))||
  96.     (!strncmp(a+i, "May", 3))||
  97.     (!strncmp(a+i, "Jun", 3))||
  98.     (!strncmp(a+i, "Jul", 3))||
  99.     (!strncmp(a+i, "Aug", 3))||
  100.     (!strncmp(a+i, "Sep", 3))||
  101.     (!strncmp(a+i, "Oct", 3))||
  102.     (!strncmp(a+i, "Nov", 3))||
  103.     (!strncmp(a+i, "Dec", 3))){
  104.   i+=2;
  105. space = 0;
  106. digit = 0;
  107. continue;
  108.  }
  109.  }
  110.  return 0; /* this is not a date */
  111.  }
  112.  return 1; /* no error -  this is a date */
  113. }
  114. /*------------------------------------------------------------------------*
  115.  *                       Public functions                                 *
  116.  *------------------------------------------------------------------------*/
  117.  
  118.  
  119.  
  120. /*
  121.  * Returns <1> if <a> and <b> are not the same. This is more complicated
  122.  * than a strcmp() as dates are taken in account.
  123.  */
  124. int banner_diff(a,b)
  125. char * a, * b;
  126. {
  127. int l_a, l_b , i_a, i_b;
  128. char * copy = NULL;
  129. l_a = strlen(a);
  130. l_b = strlen(b);
  131. /*
  132.  * We tolerate a difference in length of 3 chars at max
  133.  */
  134. if(abs(l_a - l_b) > 3)
  135. {
  136. return 1;
  137. }
  138. /*
  139.  * <b> must always be the longest string
  140.  */
  141. if(l_b < l_a)
  142. {
  143.  char * t = a;
  144.  int t_i;
  145.  a = b;
  146.  b = t;
  147.  
  148.  t_i = l_a;
  149.  l_a = l_b;
  150.  l_b = t_i;
  151. }
  152.    
  153. for(i_a=0, i_b=0;(i_b<l_b) && (i_a<l_a);i_a++, i_b++)
  154. {
  155. if(a[i_a] != b[i_b])
  156. {
  157.  /*
  158.   * Once we spot a difference, we 
  159.   * go through the string backward, until we
  160.   * find another place which differs.
  161.   */
  162.   int j = 0, k = 0;
  163.   int res;
  164. #ifdef DEBUG   
  165.   printf("SPOTTED %c != %cn", a[i_a], b[i_b]);
  166. #endif
  167.   copy = (char*)malloc(l_b - i_b + 1);
  168.   bzero(copy, l_b - i_b + 1);
  169.   for(j=strlen(a), k=strlen(b);(j>i_a)&&(k>i_b)&&(a[j]==b[k]);j--,k--);
  170. #ifdef DEBUG
  171.   printf("END : %sn", b+k);
  172. #endif  
  173.   bcopy (b + i_b, copy, (k-i_b) + 1);
  174. #ifdef DEBUG
  175.   printf("Copy : '%s'n", copy);
  176. #endif   
  177.   res = is_date(copy);
  178. #ifdef DEBUG   
  179.   printf("isdate(copy) = %dn", res);
  180. #endif
  181.   
  182.   
  183.   if(res == NEED_CONTEXT)
  184.   {
  185.    copy = realloc(copy, (k-i_b) + 1 + 4);
  186.    bcopy (b + i_b, copy, (k-i_b) + 1 + 4);
  187.    res = is_date(copy);
  188.   }
  189.   
  190.   free(copy);
  191.   i_b+=(k-i_b);
  192.   i_a+=(j-i_a);
  193.   if(res==IS_DATE)continue;
  194.   else return 1;
  195. }
  196. }
  197. return 0;
  198. }
  199. #ifdef DEBUG
  200. void main()
  201. {
  202. printf("%d (should be 1)n", banner_diff("Sendmail 1.2.3",
  203.  "Sendmail 1.4.3"));
  204. printf("%d (should be 0)n", banner_diff("Sendmail 1.2.3, 4 Oct 2000", "Sendmail 1.2.3, 29 Dec 2002"));
  205. printf("%d (should be 1)n", banner_diff("Sendmail 1.2.4 3 Oct 2000",
  206. "Sendmail 1.2.5 3 Oct 2000"));
  207. }
  208. #endif