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

Telnet服务器

开发平台:

Unix_Linux

  1. /* Nessuslib -- the Nessus Library
  2.  * Copyright (C) 1998 - 2003 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.  
  20. #include <includes.h>
  21. #include "store.h"
  22. #include "plugutils.h"
  23. /*-----------------------------------------------------------------------------*/
  24. static char * arglist2str(struct arglist * arg)
  25. {
  26.  char * ret;
  27.  int sz;
  28.  
  29.  
  30.  
  31.  if(arg == NULL)
  32.   return estrdup("");
  33.  
  34.  if(arg->name == NULL)
  35.   return estrdup("");
  36.   
  37.  sz = (strlen(arg->name) + 1) * 10;
  38.  ret = emalloc(sz);
  39.  strncpy(ret, arg->name, sz - 1);
  40.  arg = arg->next;
  41.  if(arg == NULL)
  42.   return ret;
  43.  while(arg->next != NULL)
  44.  { 
  45.    if(arg->name == NULL)
  46.      return ret;
  47.    if(strlen(arg->name) + 3 + strlen(ret) >= sz )
  48.    {
  49.     sz = strlen(arg->name) + 3 + strlen(ret) * 2;
  50.     ret = erealloc(ret, sz);
  51.    }
  52.    strcat(ret, ", ");
  53.    strcat(ret, arg->name);
  54.    arg = arg->next;
  55.  }
  56.  return ret;
  57. }
  58. struct arglist * str2arglist(char * str)
  59. {
  60.  struct arglist * ret;
  61.  char * t = strchr(str, ',');
  62.  if(!str || str[0] == '')
  63.   {
  64.    return NULL;
  65.   }
  66.  ret = emalloc ( sizeof(struct arglist) );
  67.   
  68.   
  69.  while((t = strchr(str, ',')) != NULL)
  70.  {
  71.   t[0] = 0;
  72.   while(str[0]==' ')str++;
  73.   if(str[0] != '')
  74.   {
  75.    arg_add_value(ret, str, ARG_INT, 0, (void*)1);
  76.   }
  77.   str = t+1;
  78.  }
  79.  
  80.  while(str[0]==' ')str++;
  81.  if(str[0] != '')
  82.    arg_add_value(ret, str, ARG_INT, 0, (void*)1);
  83.   
  84.   return ret;
  85. }
  86. /*-----------------------------------------------------------------------------*/
  87. static int safe_copy(char * str, char * dst, int sz, char * path, char * item)
  88. {
  89.  if(str == NULL) /* empty strings are OK */
  90.   {
  91.   dst[0] = '';
  92.   return 0;
  93.   }
  94.   
  95.  if(strlen(str) >= sz)
  96.  {
  97.   fprintf(stderr, "nessus-libraries/libnessus/store.c: %s has a too long %s (%ld)n", path, item, strlen(str));
  98.   return -1;
  99.  }
  100.  strcpy(dst, str);
  101.  return 0;
  102. }
  103. /*-----------------------------------------------------------------------------*/
  104. #define MODE_SYS 0
  105. #define MODE_USR 1
  106. static char sys_store_dir[PATH_MAX+1];
  107. static char usr_store_dir[PATH_MAX+1];
  108. static int current_mode = -1;
  109. int store_init_sys(char * dir)
  110. {
  111.  current_mode = MODE_SYS;
  112.  
  113.  snprintf(sys_store_dir, sizeof(sys_store_dir), "%s/.desc", dir);
  114.  if((mkdir(sys_store_dir, 0755) < 0) && (errno != EEXIST))
  115.  {
  116.   fprintf(stderr, "mkdir(%s) : %sn", sys_store_dir, strerror(errno));
  117.   return -1;
  118.  } 
  119.  
  120.  
  121.  return 0;
  122. }
  123. int store_init_user(char * dir)
  124. {
  125.  current_mode = MODE_USR;
  126.  snprintf(usr_store_dir, sizeof(usr_store_dir), "%s/.desc", dir);
  127.  if((mkdir(usr_store_dir, 0755) < 0) && (errno != EEXIST))
  128.  {
  129.   fprintf(stderr, "mkdir(%s) : %sn", usr_store_dir, strerror(errno));
  130.   return -1;
  131.  } 
  132.  
  133.  return 0;
  134. }
  135. /*--------------------------------------------------------------------------------*/
  136. int store_get_plugin_f(struct plugin * plugin, struct pprefs * pprefs, char * dir, char * file)
  137. {
  138.  int fd;
  139.  struct plugin * p;
  140.  struct stat st;
  141.  int len;
  142.  char file_name[PATH_MAX+1];
  143.  char * str;
  144.  
  145.  bzero(plugin, sizeof(*plugin));
  146.  plugin->id = -1;
  147.  
  148.  if(dir == NULL || dir[0] == '' || file == NULL || file[0] == '')
  149.   return -1;
  150.  
  151.  snprintf(file_name, sizeof(file_name), "%s/%s", dir, file);
  152.  str = strrchr(file_name, '.');
  153.  if(str != NULL)
  154.  {
  155.   str[0] = '';
  156.   if(strlen(file_name) + 6 < sizeof(file_name))
  157.    strcat(file_name, ".desc");
  158.  }
  159.  if(file == NULL)
  160.   return -1;
  161.   
  162.  fd = open(file_name, O_RDONLY);
  163.  if(fd < 0)
  164.   return -1;
  165.  
  166.  if(fstat(fd, &st) < 0)
  167.  { 
  168.   perror("fstat ");
  169.   close(fd);
  170.   return -1;
  171.  } 
  172.  
  173.  if(st.st_size == 0)
  174.  {
  175.   close(fd);
  176.   return 0;
  177.  }
  178.  
  179.  len = st.st_size;
  180.  p = (struct plugin*)mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
  181.  if(p == MAP_FAILED || p == NULL)
  182.  {
  183.   perror("mmap ");
  184.   close(fd);
  185.   return -1;
  186.  }
  187.  
  188.  bcopy(p, plugin, sizeof(struct plugin));
  189.  
  190.  if(p->has_prefs && pprefs != NULL)
  191.  {
  192.   bcopy((char*)p + sizeof(struct plugin), pprefs, sizeof(struct pprefs) * MAX_PREFS);
  193.  }
  194.  munmap((char*)p, len);
  195.  close(fd);
  196.  return 0;
  197. }
  198. int store_get_plugin(struct plugin * p, char * name)
  199. {
  200.  int e = store_get_plugin_f(p, NULL, usr_store_dir, name);
  201.  if(p->id < 0)
  202.   return store_get_plugin_f(p, NULL, sys_store_dir, name);
  203.  else
  204.   return e;
  205. }
  206. /*--------------------------------------------------------------------------------*/
  207. struct arglist * store_load_plugin(char * dir, char * file,  struct arglist * prefs)
  208. {
  209.  char desc_file[PATH_MAX+1];
  210.  char plug_file[PATH_MAX+1];
  211.  char * str;
  212.  char store_dir[PATH_MAX+1];
  213.  struct plugin p;
  214.  struct pprefs pp[MAX_PREFS];
  215.  
  216.  struct arglist * ret;
  217.  int i;
  218.  struct stat st1, st2;
  219.  struct arglist * al;
  220.  
  221.  bzero(pp, sizeof(pp));
  222.  
  223.  snprintf(desc_file, sizeof(desc_file), "%s/.desc/%s", dir, file);
  224.  str = strrchr(desc_file, '.');
  225.  if( str != NULL )
  226.  {
  227.   str[0] = '';
  228.   if( strlen(desc_file) + 6 < sizeof(desc_file) )
  229.    strcat(desc_file, ".desc");
  230.  }
  231.  snprintf(plug_file, sizeof(plug_file), "%s/%s", dir, file);
  232.  if (  stat(plug_file, &st1) < 0 || 
  233.        stat(desc_file, &st2) < 0 ) 
  234. return NULL;
  235.  /* 
  236.   * Look if the plugin is newer, and if that's the case also make sure that
  237.   * the plugin mtime is not in the future...
  238.   */
  239.  if ( st1.st_mtime > st2.st_mtime && st1.st_mtime <= time(NULL) )
  240. return NULL;
  241.  snprintf(store_dir, sizeof(store_dir), "%s/.desc", dir);
  242.  if(store_get_plugin_f(&p, pp, store_dir, file) < 0)
  243.   return NULL;
  244.   
  245.  if(p.magic != MAGIC)
  246.   return NULL;
  247.  if(p.id <= 0) return NULL;
  248.     
  249.  ret = emalloc(sizeof(struct arglist));   
  250.  plug_set_id(ret, p.id);
  251.  plug_set_category(ret, p.category);
  252.  plug_set_fname(ret, file);
  253.  plug_set_path(ret, p.path);
  254.  plug_set_family(ret, p.family, NULL);
  255.   al = str2arglist(p.required_ports);
  256.  if ( al != NULL ) arg_add_value(ret, "required_ports", ARG_ARGLIST, -1, al);
  257.  al = str2arglist(p.required_keys);
  258.  if ( al != NULL ) arg_add_value(ret, "required_keys", ARG_ARGLIST, -1, al);
  259.  al = str2arglist(p.required_udp_ports);
  260.  if ( al != NULL ) arg_add_value(ret, "required_udp_ports", ARG_ARGLIST, -1, al)
  261. ;
  262.  al = str2arglist(p.excluded_keys);
  263.  if ( al != NULL ) arg_add_value(ret, "excluded_keys", ARG_ARGLIST, -1, al);
  264.  al = str2arglist(p.dependencies);
  265.  if ( al != NULL ) arg_add_value(ret, "DEPENDENCIES", ARG_ARGLIST, -1, al);
  266.  
  267.  if ( p.timeout != 0 ) arg_add_value(ret, "TIMEOUT", ARG_INT, -1, (void*)p.timeout);
  268.  arg_add_value(ret, "NAME", ARG_STRING, strlen(p.name), estrdup(p.name));
  269.  arg_add_value(ret, "preferences", ARG_ARGLIST, -1, prefs);
  270.  
  271.  if(p.has_prefs)
  272.  {
  273.  for(i=0;pp[i].type[0] != '';i++)
  274.   { 
  275.    _add_plugin_preference(prefs, p.name, pp[i].name, pp[i].type, pp[i].dfl);
  276.   }
  277.  }
  278.  return ret;
  279. }
  280. #define OLD_CVE_SZ 128
  281. #define OLD_BID_SZ 64
  282. #define OLD_XREF_SZ 512
  283. struct arglist * store_plugin(struct arglist * plugin, char * file)
  284. {
  285.  char desc_file[PATH_MAX+1];
  286.  char path[PATH_MAX+1];
  287.  struct plugin plug;
  288.  struct pprefs pp[MAX_PREFS+1];
  289.  char  * str;
  290.  char * dir;
  291.  struct arglist * arglist, * ret,  *prefs;
  292.  int e;
  293.  int fd;
  294.  int num_plugin_prefs = 0;
  295.  
  296.  if( current_mode == MODE_SYS )
  297.    dir = sys_store_dir;
  298.   else
  299.    dir = usr_store_dir;
  300.    
  301.   if(strlen(file) + 2 > sizeof(path))
  302.    return NULL;
  303.  
  304.  strncpy(path, dir, sizeof(path) - 2 - strlen(file));
  305.  str = strrchr(path, '/');
  306.  if(str != NULL)
  307.  {
  308.   str[0] = '';
  309.  }
  310.  strcat(path, "/");
  311.  strcat(path, file);
  312.  
  313.  
  314.  snprintf(desc_file, sizeof(desc_file), "%s/%s", dir, file);
  315.  str = strrchr(desc_file, '.');
  316.  if( str != NULL )
  317.  {
  318.   str[0] = '';
  319.   if(strlen(desc_file) + 6 < sizeof(desc_file) )
  320.    strcat(desc_file, ".desc");
  321.  }
  322.  
  323.  
  324.  bzero(&plug, sizeof(plug));
  325.  bzero(pp, sizeof(pp));
  326.  
  327.  plug.magic = MAGIC;
  328.  plug.id = _plug_get_id(plugin);
  329.  e = safe_copy(path, plug.path, sizeof(plug.path), path, "path"); 
  330.  if(e < 0)return NULL;
  331.  
  332.  plug.timeout = _plug_get_timeout(plugin);
  333.  plug.category = _plug_get_category(plugin);
  334.  
  335.  str = _plug_get_name(plugin);
  336.  e = safe_copy(str, plug.name, sizeof(plug.name), path, "name");
  337.  if(e < 0)return NULL;
  338.  
  339.  
  340.  str = _plug_get_version(plugin);
  341.  e = safe_copy(str, plug.version, sizeof(plug.version), path, "version");
  342.  if(e < 0)return NULL;
  343.  
  344.  
  345.  str = _plug_get_summary(plugin);
  346.  e = safe_copy(str, plug.summary, sizeof(plug.summary), path, "summary");
  347.  if(e < 0)return NULL;
  348.  
  349.  str = _plug_get_description(plugin);
  350.  e = safe_copy(str, plug.description, sizeof(plug.description), path, "description");
  351.  if(e < 0)return NULL;
  352.  
  353.  str = _plug_get_copyright(plugin);
  354.  e = safe_copy(str, plug.copyright, sizeof(plug.copyright), path, "copyright");
  355.  if(e < 0)return NULL;
  356.  
  357.  str = _plug_get_family(plugin);
  358.  e = safe_copy(str, plug.family, sizeof(plug.family), path, "family");
  359.  if(e < 0)return NULL;
  360.  
  361.  str = _plug_get_cve_id(plugin);
  362. #ifdef DEBUG_STORE
  363.  if ( str != NULL && strlen(str) > OLD_CVE_SZ )
  364. fprintf(stderr, "WARNING! CVE size will be too long for older versions of Nessus!n");
  365. #endif
  366.  e = safe_copy(str, plug.cve_id, sizeof(plug.cve_id), path, "cve_id");
  367.  if(e < 0)return NULL;
  368.  
  369.  str = _plug_get_bugtraq_id(plugin);
  370. #ifdef DEBUG_STORE
  371.  if ( str != NULL && strlen(str) > OLD_BID_SZ)
  372. fprintf(stderr, "WARNING! BID size will be too long for older versions of Nessus!n");
  373. #endif
  374.  e = safe_copy(str, plug.bid, sizeof(plug.bid), path, "bugtraq id");
  375.  if(e < 0)return NULL;
  376.  
  377.  str = _plug_get_xref(plugin);
  378. #ifdef DEBUG_STORE
  379.  if ( str != NULL && strlen(str) > OLD_XREF_SZ)
  380. fprintf(stderr, "WARNING! BID size will be too long for older versions of Nessus!n");
  381. #endif
  382.  e = safe_copy(str, plug.xref, sizeof(plug.xref), path, "xref id");
  383.  if(e < 0)return NULL;
  384.  
  385.  arglist = _plug_get_deps(plugin);
  386.  str = arglist2str(arglist);
  387.  e = safe_copy(str, plug.dependencies, sizeof(plug.dependencies), path, "dependencies");
  388.  efree(&str);
  389.  if(e < 0)return NULL;
  390.  
  391.  arglist = _plug_get_required_keys(plugin);
  392.  str = arglist2str(arglist);
  393.  e = safe_copy(str, plug.required_keys, sizeof(plug.required_keys), path, "required keys");
  394.  efree(&str);
  395.  if(e < 0)return NULL;
  396.  
  397.  arglist = _plug_get_excluded_keys(plugin);
  398.  str = arglist2str(arglist);
  399.  e = safe_copy(str, plug.excluded_keys, sizeof(plug.excluded_keys), path, "excluded_keys");
  400.  efree(&str);
  401.  if(e < 0)return NULL;
  402.  
  403.  arglist = _plug_get_required_ports(plugin);
  404.  str = arglist2str(arglist);
  405.  e = safe_copy(str, plug.required_ports, sizeof(plug.required_ports), path, "required ports");
  406.  efree(&str);
  407.  if(e < 0)return NULL;
  408.  
  409.  arglist = _plug_get_required_udp_ports(plugin);
  410.  str = arglist2str(arglist);
  411.  e = safe_copy(str, plug.required_udp_ports, sizeof(plug.required_udp_ports), path, "required udp ports");
  412.  efree(&str);
  413.  if(e < 0)return NULL;
  414.  
  415.  
  416.  prefs = arg_get_value(plugin, "preferences");
  417.  
  418.  
  419.  arglist = arg_get_value(plugin, "PLUGIN_PREFS");
  420.  if( arglist != NULL )
  421.  {
  422.   char * p_name = _plug_get_name(plugin);
  423.   
  424.   while(arglist->next != NULL)
  425.   {
  426.    char * name = arglist->name;
  427.    char * dfl = arglist->value;
  428.    char * type, * str;
  429.    
  430.    type = arglist->name;
  431.    str = strchr(type, '/');
  432.    str[0] = '';
  433.    name = str + 1;
  434.    e = safe_copy(type, pp[num_plugin_prefs].type, sizeof(pp[num_plugin_prefs].type), path, "preference-type");
  435.    if(e < 0)return NULL;
  436.    e = safe_copy(name, pp[num_plugin_prefs].name, sizeof(pp[num_plugin_prefs].name), path, "preference-name");
  437.    if(e < 0)return NULL;
  438.    e = safe_copy(dfl, pp[num_plugin_prefs].dfl, sizeof(pp[num_plugin_prefs].dfl), path, "preference-default");
  439.    if(e < 0)return NULL;
  440.    num_plugin_prefs ++;
  441.   
  442.    
  443.    if(num_plugin_prefs >= MAX_PREFS)
  444.    {
  445.     fprintf(stderr, "%s: too many preferencesn", path);
  446.     return NULL;
  447.    }
  448.    _add_plugin_preference(prefs, p_name, name, type, dfl);
  449.    str[0] = '/';
  450.    arglist = arglist->next;
  451.   }
  452.  }
  453.  
  454.  if(num_plugin_prefs > 0)
  455.   plug.has_prefs = 1;
  456.  
  457.  fd = open(desc_file, O_RDWR|O_CREAT|O_TRUNC, 0644);
  458.  if(fd < 0)
  459.  { 
  460.   return NULL;
  461.  }
  462.  
  463.  if(write(fd, &plug, sizeof(plug)) < 0)
  464.  {
  465.   perror("write ");
  466.  }
  467.  
  468.  if(num_plugin_prefs > 0)
  469.  {
  470.   write(fd, pp, sizeof(pp));
  471.  }
  472.  close(fd); 
  473.  
  474.  
  475.  arg_set_value(plugin, "preferences", -1, NULL);
  476.  arg_free_all(plugin);
  477.  return NULL;
  478. }
  479. /*---------------------------------------------------------------------*/
  480. char * store_fetch_path(struct arglist * desc)
  481. {
  482.  char * fname = _plug_get_fname(desc);
  483.  static struct plugin p;
  484.  
  485.  store_get_plugin(&p, fname);
  486.  return p.path;
  487. }
  488. char * store_fetch_name(struct arglist * desc)
  489. {
  490.  char * fname = _plug_get_fname(desc);
  491.  static struct plugin p;
  492.  
  493.  store_get_plugin(&p, fname);
  494.  return p.name;
  495. }
  496. char * store_fetch_version(struct arglist * desc)
  497. {
  498.  char * fname = _plug_get_fname(desc);
  499.  static struct plugin p;
  500.  
  501.  store_get_plugin(&p, fname);
  502.  return p.version;
  503. }
  504. int store_fetch_timeout(struct arglist * desc)
  505. {
  506.  char * fname = _plug_get_fname(desc);
  507.  static struct plugin p;
  508.  
  509.  store_get_plugin(&p, fname);
  510.  return p.timeout;
  511. }
  512. char * store_fetch_summary(struct arglist * desc)
  513. {
  514.  char * fname = _plug_get_fname(desc);
  515.  static struct plugin p;
  516.  
  517.  store_get_plugin(&p, fname);
  518.  return p.summary;
  519. }
  520. char * store_fetch_description(struct arglist * desc)
  521. {
  522.  char * fname = _plug_get_fname(desc);
  523.  static struct plugin p;
  524.  
  525.  store_get_plugin(&p, fname);
  526.  return p.description;
  527. }
  528. int store_fetch_category(struct arglist * desc)
  529. {
  530.  return plug_get_category(desc);
  531. }
  532. char * store_fetch_copyright(struct arglist * desc)
  533. {
  534.  char * fname = _plug_get_fname(desc);
  535.  static struct plugin p;
  536.  
  537.  store_get_plugin(&p, fname);
  538.  return p.copyright;
  539. }
  540. char * store_fetch_family(struct arglist * desc)
  541. {
  542.  char * fname = _plug_get_fname(desc);
  543.  static struct plugin p;
  544.  
  545.  store_get_plugin(&p, fname);
  546.  return p.family;
  547. }
  548. char * store_fetch_cve_id(struct arglist * desc)
  549. {
  550.  char * fname = _plug_get_fname(desc);
  551.  static struct plugin p;
  552.  
  553.  store_get_plugin(&p, fname);
  554.  return p.cve_id;
  555. }
  556. char * store_fetch_bugtraq_id(struct arglist * desc)
  557. {
  558.  char * fname = _plug_get_fname(desc);
  559.  static struct plugin p;
  560.  
  561.  store_get_plugin(&p, fname);
  562.  return p.bid;
  563. }
  564. char * store_fetch_xref(struct arglist * desc)
  565. {
  566.  char * fname = _plug_get_fname(desc);
  567.  static struct plugin p;
  568.  
  569.  store_get_plugin(&p, fname);
  570.  return p.xref;
  571. }
  572. struct arglist * store_fetch_dependencies(struct arglist * desc)
  573. {
  574.  char * fname = _plug_get_fname(desc);
  575.  static struct plugin p;
  576.  struct arglist * ret;
  577.  
  578.  store_get_plugin(&p, fname);
  579.  ret = str2arglist(p.dependencies);
  580.  return ret; 
  581. }
  582. struct arglist * store_fetch_required_keys(struct arglist * desc)
  583. {
  584.  char * fname = _plug_get_fname(desc);
  585.  static struct plugin p;
  586.  struct arglist * ret;
  587.  
  588.  store_get_plugin(&p, fname);
  589.  ret = str2arglist(p.required_keys);
  590.  return ret; 
  591. }
  592. struct arglist * store_fetch_excluded_keys(struct arglist * desc)
  593. {
  594.  char * fname = _plug_get_fname(desc);
  595.  static struct plugin p;
  596.  struct arglist * ret;
  597.  
  598.  store_get_plugin(&p, fname);
  599.  ret = str2arglist(p.excluded_keys);
  600.  return ret; 
  601. }
  602. struct arglist * store_fetch_required_ports(struct arglist * desc)
  603. {
  604.  char * fname = _plug_get_fname(desc);
  605.  static struct plugin p;
  606.  struct arglist * ret;
  607.  
  608.  store_get_plugin(&p, fname);
  609.  ret = str2arglist(p.required_ports);
  610.  return ret; 
  611. }
  612. struct arglist * store_fetch_required_udp_ports(struct arglist * desc)
  613. {
  614.  char * fname = _plug_get_fname(desc);
  615.  static struct plugin p;
  616.  struct arglist * ret;
  617.  
  618.  store_get_plugin(&p, fname);
  619.  ret = str2arglist(p.required_udp_ports);
  620.  return ret; 
  621. }
  622.  
  623. /*---------------------------------------------------------------------*/
  624. #if 0
  625. void store_dump_plugin(int id)
  626. {
  627.  struct plugin plugin;
  628.  store_get_plugin(&plugin, id);
  629.  
  630.  printf("PLUGIN ID# %dn", plugin.id);
  631.  printf("in %sn", plugin.path);
  632.  printf("nn");
  633.  printf("Name: %sn", plugin.name);
  634.  printf("timeout : %dn", plugin.timeout);
  635.  printf("category: %dn",  plugin.category);
  636.  printf("version : %sn",  plugin.version);
  637.  printf("summary : %sn",  plugin.summary);
  638.  printf("description: %sn",  plugin.description);
  639.  printf("copyright: %sn",  plugin.copyright);
  640.  printf("family %sn",  plugin.family);
  641.  printf("cve_id : %sn",  plugin.cve_id);
  642.  printf("bid : %sn",  plugin.bid);
  643.  printf("xrefs : %sn",  plugin.xrefs);
  644.  printf("dependencies: %sn", plugin.dependencies);
  645.  printf("required_keys : %sn", plugin.required_keys);
  646.  printf("excluded_key : %sn", plugin.excluded_keys);
  647.  printf("required_ports: %sn", plugin.required_ports);
  648.  printf("required_udp_ports: %sn", plugin.required_udp_ports);
  649. }
  650. #endif