nasl_misc_funcs.c

来自「大国补丁后的nessus2.2.8的源代码」· C语言 代码 · 共 877 行 · 第 1/2 页

C
877
字号
  tree_cell		*retc = NULL;  anon_nasl_var		*v, myvar;  named_nasl_var	*vn;  nasl_array		*a, *a2;  int		i, j, vi;  retc = alloc_tree_cell(0, NULL);  retc->type = DYN_ARRAY;  retc->x.ref_val = a2 = emalloc(sizeof(nasl_array));  bzero(&myvar, sizeof(myvar));  for (i = vi = 0;        (v = nasl_get_var_by_num(&lexic->ctx_vars, vi, 0)) != NULL;       vi ++)    {      if (v->var_type == VAR2_ARRAY)	{	  a = &v->v.v_arr;	  /* First the numerical index */	  for (j = 0; j < a->max_idx; j ++)	    if (a->num_elt[j] != NULL && a->num_elt[j]->var_type != VAR2_UNDEF)	      {		myvar.var_type = VAR2_INT;		myvar.v.v_int = j;		add_var_to_list(a2, i ++, &myvar);	      }	  /* Then the string index */	  if (a->hash_elt != NULL)	    for (j = 0; j < VAR_NAME_HASH; j++)	      for (vn = a->hash_elt[j]; vn != NULL; vn = vn->next_var)		if (vn->u.var_type != VAR2_UNDEF)		  {		    myvar.var_type = VAR2_STRING;		    myvar.v.v_str.s_val = (unsigned char*)vn->var_name;		    myvar.v.v_str.s_siz = strlen(vn->var_name);		    add_var_to_list(a2, i ++, &myvar);		  }	}      else	nasl_perror(lexic, "nasl_keys: bad variable #%d skipped\n", vi);    }	   return retc;}tree_cell*nasl_max_index(lex_ctxt* lexic){  tree_cell	*retc;  anon_nasl_var	*v;  nasl_array	*a;  v = nasl_get_var_by_num(&lexic->ctx_vars, 0, 0);  if (v == NULL)    return NULL;  if (v->var_type != VAR2_ARRAY)    return NULL;  a = &v->v.v_arr;  retc = alloc_tree_cell(0, NULL);  retc->type = CONST_INT;  retc->x.i_val = array_max_index(a);  return retc;}tree_cell*nasl_typeof(lex_ctxt* lexic){  tree_cell	*retc;  anon_nasl_var	*u;  const char*	s;  retc = alloc_tree_cell(0, NULL); retc->type = CONST_DATA;  u = nasl_get_var_by_num(&lexic->ctx_vars, 0, 0);  if (u == NULL)    s = "null";  else    switch (u->var_type)      {      case VAR2_UNDEF:	s= "undef";	break;      case VAR2_INT:	s = "int";	break;      case VAR2_STRING:	s = "string";	break;      case VAR2_DATA:	s = "data";	break;      case VAR2_ARRAY:	s = "array";	break;      default:	s = "unknown";	break;      }  retc->size = strlen(s);  retc->x.str_val = emalloc(retc->size);  strcpy(retc->x.str_val, s);  return retc;}    tree_cell*nasl_defined_func(lex_ctxt* lexic){  void		*f;   char		*s;  tree_cell	*retc;  s = get_str_var_by_num(lexic, 0);  if (s == NULL)    {      nasl_perror(lexic, "defined_func: missing parameter\n");      return NULL;    }  f = get_func_ref_by_name(lexic, s);  retc = alloc_tree_cell(0, NULL);  retc->type = CONST_INT;  retc->x.i_val = (f != NULL);  return retc;}tree_cell*nasl_func_named_args(lex_ctxt* lexic){  nasl_func	*f;   char		*s;  int		i;  tree_cell	*retc;  nasl_array	*a;  anon_nasl_var	v;  s = get_str_var_by_num(lexic, 0);  if (s == NULL)    {      nasl_perror(lexic, "func_named_args: missing parameter\n");      return NULL;    }  f = get_func_ref_by_name(lexic, s);  if (f == NULL)    {      nasl_perror(lexic, "func_named_args: unknown function \"%s\"\n", s);      return NULL;    }  retc = alloc_typed_cell(DYN_ARRAY);  retc->x.ref_val = a = emalloc(sizeof(nasl_array));  memset(&v, 0, sizeof(v));  v.var_type = VAR2_STRING;  for (i = 0; i < f->nb_named_args; i ++)    {      v.v.v_str.s_val = (unsigned char*)f->args_names[i];      v.v.v_str.s_siz = strlen(f->args_names[i]);      if (add_var_to_list(a, i, &v) < 0)	nasl_perror(lexic, "func_named_args: add_var_to_list failed (internal error)\n");    }  return retc;}tree_cell*nasl_func_unnamed_args(lex_ctxt* lexic){  nasl_func	*f;   char		*s;  tree_cell	*retc;  s = get_str_var_by_num(lexic, 0);  if (s == NULL)    {      nasl_perror(lexic, "func_unnamed_args: missing parameter\n");      return NULL;    }  f = get_func_ref_by_name(lexic, s);  if (f == NULL)    {      nasl_perror(lexic, "func_unnamed_args: unknown function \"%s\"\n", s);      return NULL;    }  retc = alloc_typed_cell(CONST_INT);  retc->x.i_val = f->nb_unnamed_args;  return retc;}tree_cell*nasl_func_has_arg(lex_ctxt* lexic){  nasl_func	*f;   char		*s;  int		vt, i, flag = 0;  tree_cell	*retc;  s = get_str_var_by_num(lexic, 0);  if (s == NULL)    {      nasl_perror(lexic, "func_has_arg: missing parameter\n");      return NULL;    }  f = get_func_ref_by_name(lexic, s);  if (f == NULL)    {      nasl_perror(lexic, "func_args: unknown function \"%s\"\n", s);      return NULL;    }  vt = get_var_type_by_num(lexic, 1);  switch(vt)    {    case VAR2_INT:      i = get_int_var_by_num(lexic, 1, -1);      if (i >= 0 &&  i < f->nb_unnamed_args)	flag = 1;      break;    case VAR2_STRING:    case VAR2_DATA:      s = get_str_var_by_num(lexic, 1);      for (i = 0; i < f->nb_named_args && ! flag; i ++)	if (strcmp(s, f->args_names[i]) == 0)	  flag = 1;      break;    default:      nasl_perror(lexic, "func_has_arg: string or integer expected as 2nd parameter\n");      return NULL;    }  retc = alloc_typed_cell(CONST_INT);  retc->x.i_val = flag;  return retc;}/* Sorts an array */static lex_ctxt	*mylexic = NULL;static intvar_cmp(const void * a, const void * b){  anon_nasl_var ** pv1 = (anon_nasl_var **)a, ** pv2 = (anon_nasl_var**)b;  tree_cell	*t1, *t2;  t1 = var2cell((anon_nasl_var*)*pv1);  t2 = var2cell((anon_nasl_var*)*pv2);  return cell_cmp(mylexic, t1, t2);}tree_cell*nasl_sort_array(lex_ctxt* lexic){  tree_cell	*retc = NULL;  nasl_array		*a;  if (mylexic != NULL)    {      nasl_perror(lexic, "sort: this function is not reentrant!\n");      return NULL;    }  mylexic = lexic;  retc = nasl_make_list(lexic);  if (retc != NULL)    {      a = retc->x.ref_val;      qsort(a->num_elt, a->max_idx, sizeof(a->num_elt[0]), var_cmp);    }  mylexic = NULL;  return retc;}tree_cell*nasl_unixtime(lex_ctxt* lexic){  tree_cell	*retc;  retc = alloc_typed_cell(CONST_INT);  retc->x.i_val = time(NULL);  return retc;}tree_cell*nasl_gettimeofday(lex_ctxt* lexic){  tree_cell		*retc;  struct timeval	t;  char			str[64];  if (gettimeofday(&t, NULL) < 0)    {      nasl_perror(lexic, "gettimeofday: %s\n",  strerror(errno));      return NULL;    }  sprintf(str, "%u.%06u", t.tv_sec, t.tv_usec);  retc = alloc_typed_cell(CONST_DATA);  retc->size = strlen(str);  retc->x.str_val = emalloc(retc->size);  strcpy(retc->x.str_val, str);  return retc;}tree_cell*nasl_localtime(lex_ctxt* lexic){  tree_cell		*retc;  struct tm		*ptm;  time_t		tictac;  int			utc;  nasl_array		*a;  anon_nasl_var		v;  tictac = get_int_var_by_num(lexic, 0, 0);  if (tictac == 0)    tictac = time(NULL);  utc = get_int_local_var_by_name(lexic, "utc", 0);    if (utc)    ptm = gmtime(&tictac);  else    ptm = localtime(&tictac);  if (ptm == NULL)    {      nasl_perror(lexic, "localtime(%d,utc=%d): %s\n", tictac, utc, strerror(errno));      return NULL;    }  retc = alloc_typed_cell(DYN_ARRAY);  retc->x.ref_val = a = emalloc(sizeof(nasl_array));  memset(&v, 0, sizeof(v));  v.var_type = VAR2_INT;  v.v.v_int = ptm->tm_sec; add_var_to_array(a, "sec", &v); /* seconds */  v.v.v_int = ptm->tm_min; add_var_to_array(a, "min", &v); /* minutes */  v.v.v_int = ptm->tm_hour; add_var_to_array(a, "hour", &v); /* hours */  v.v.v_int = ptm->tm_mday; add_var_to_array(a, "mday", &v); /* day of the month */  v.v.v_int = ptm->tm_mon+1; add_var_to_array(a, "mon", &v); /* month */  v.v.v_int = ptm->tm_year+1900; add_var_to_array(a, "year", &v); /* year */  v.v.v_int = ptm->tm_wday; add_var_to_array(a, "wday", &v); /* day of the week */  v.v.v_int = ptm->tm_yday+1; add_var_to_array(a, "yday", &v); /* day in the year */  v.v.v_int = ptm->tm_isdst; add_var_to_array(a, "isdst", &v); /* daylight saving time */  return retc;}tree_cell*nasl_mktime(lex_ctxt* lexic){  struct tm	tm;  tree_cell	*retc;  time_t	tictac;  tm.tm_sec = get_int_local_var_by_name(lexic, "sec", 0); /* seconds */  tm.tm_min = get_int_local_var_by_name(lexic, "min", 0); /* minutes */  tm.tm_hour = get_int_local_var_by_name(lexic, "hour", 0); /* hours */  tm.tm_mday = get_int_local_var_by_name(lexic, "mday", 0); /* day of the month */  tm.tm_mon = get_int_local_var_by_name(lexic, "mon", 1); /* month */  tm.tm_mon -= 1;  tm.tm_year = get_int_local_var_by_name(lexic, "year", 0); /* year */  if (tm.tm_year >= 1900) tm.tm_year -= 1900;      tm.tm_isdst = get_int_local_var_by_name(lexic, "isdst", -1); /* daylight saving time */  errno = 0;  tictac = mktime(&tm);  if (tictac == (time_t)(-1))    {      nasl_perror(lexic, "mktime(sec=%02d min=%02d hour=%02d mday=%02d mon=%02d year=%04d isdst=%d): %s\n", 		  tm.tm_sec, tm.tm_min, tm.tm_hour, tm.tm_mday, 		  tm.tm_mon+1, tm.tm_year+1900, tm.tm_isdst,		  errno ? strerror(errno): "invalid value?");      return NULL;    }  retc = alloc_typed_cell(CONST_INT);  retc->x.i_val = tictac;  return retc;}tree_cell*nasl_open_sock_kdc(lex_ctxt* lexic){  tree_cell		*retc;  struct timeval	t;  int                   timeout = 30;  int                   port = 88;  char                  *hostname = NULL; /* Domain name for windows */  int                   tcp = 0;  int                   ret;  struct arglist        *script_infos, *prefs;  char                  *_port = NULL, *_tcp = NULL;  char * val;  int type;  script_infos = lexic->script_infos;  hostname = plug_get_key(script_infos, "Secret/kdc_hostname", &type);  if ( ! hostname || type != KB_TYPE_STR )	return NULL;    port = (int)plug_get_key(script_infos, "Secret/kdc_port", &type);  if ( port <= 0 || type != KB_TYPE_INT )	return NULL;  tcp = (int)plug_get_key(script_infos, "Secret/kdc_use_tcp", &type);  if ( tcp < 0 || type != KB_TYPE_INT )	tcp = 0;  if (tcp == 0)    ret = open_sock_opt_hn(hostname, port, SOCK_DGRAM, IPPROTO_UDP, timeout);  else    ret = open_sock_opt_hn(hostname, port, SOCK_STREAM, IPPROTO_TCP, timeout);  if (ret < 0)    return NULL;  retc = alloc_typed_cell(CONST_INT);  retc->x.i_val = ret;  return retc;}

⌨️ 快捷键说明

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