OpenVAS Scanner  22.7.9
nasl_debug.c
Go to the documentation of this file.
1 /* SPDX-FileCopyrightText: 2023 Greenbone AG
2  * SPDX-FileCopyrightText: 2002-2004 Tenable Network Security
3  *
4  * SPDX-License-Identifier: GPL-2.0-only
5  */
6 
7 #include "nasl_debug.h"
8 
9 #include "../misc/plugutils.h"
10 #include "exec.h"
11 #include "nasl_func.h"
12 #include "nasl_global_ctxt.h"
13 #include "nasl_lex_ctxt.h"
14 #include "nasl_tree.h"
15 #include "nasl_var.h"
16 
17 #include <gvm/base/logging.h>
18 #include <stdarg.h>
19 #include <string.h> /* for str() */
20 #include <unistd.h>
21 
22 #undef G_LOG_DOMAIN
23 
26 #define G_LOG_DOMAIN "lib nasl"
27 
28 extern FILE *nasl_trace_fp;
29 
30 static char *debug_filename = NULL;
31 static char *debug_funname = NULL;
32 static char debug_plugin_filename[PATH_MAX];
33 
34 static GHashTable *functions_filenames = NULL;
35 
41 const char *
43 {
44  return debug_plugin_filename;
45 }
46 
52 void
53 nasl_set_plugin_filename (const char *filename)
54 {
55  strncpy (debug_plugin_filename, filename, sizeof (debug_plugin_filename));
56  debug_plugin_filename[PATH_MAX - 1] = '\0';
57 }
58 
59 const char *
60 nasl_get_filename (const char *function)
61 {
62  char *ret = NULL;
63 
64  if (functions_filenames && function)
65  ret = g_hash_table_lookup (functions_filenames, function);
66  return ret ? ret : debug_filename;
67 }
68 
69 /* For debug purposes, the non internal function name is saved to
70  * be displayed in the error message.
71  */
72 void
73 nasl_set_function_name (const char *funname)
74 {
75  if (funname == debug_funname)
76  return;
77  g_free (debug_funname);
78  debug_funname = g_strdup (funname);
79 }
80 
81 const char *
83 {
84  return debug_funname;
85 }
86 
87 void
88 nasl_set_filename (const char *filename)
89 {
90  assert (filename);
91 
92  if (filename == debug_filename)
93  return;
94  g_free (debug_filename);
95  debug_filename = g_strdup (filename);
96 }
97 
98 void
99 nasl_set_function_filename (const char *function)
100 {
101  assert (function);
102 
103  if (!functions_filenames)
105  g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
106  g_hash_table_insert (functions_filenames, g_strdup (function),
107  g_strdup (debug_filename));
108 }
109 
110 void
111 nasl_perror (lex_ctxt *lexic, char *msg, ...)
112 {
113  va_list param;
114  gchar debug_message[4096];
115  gchar *final_message;
116  char *script_name = "";
117  lex_ctxt *lexic2 = NULL;
118  int line_nb = 0;
119  va_start (param, msg);
120 
121  if (lexic != NULL)
122  {
123  script_name = lexic->script_infos->name;
124  if (script_name == NULL)
125  script_name = "";
126 
127  /* Climbing up to find a line number */
128  for (lexic2 = lexic; lexic2 != NULL; lexic2 = lexic2->up_ctxt)
129  {
130  if (lexic2->line_nb != 0)
131  {
132  line_nb = lexic2->line_nb;
133  break;
134  }
135  }
136  }
137 
138  g_vsnprintf (debug_message, sizeof (debug_message), msg, param);
139  if ((debug_funname != NULL) && (g_strcmp0 (debug_funname, "") != 0))
140  final_message = g_strconcat ("In function '", debug_funname,
141  "()': ", debug_message, NULL);
142  else
143  final_message = g_strdup (debug_message);
144 
145  if (g_strcmp0 (debug_filename, script_name) == 0)
146  g_message ("[%d](%s:%d) %s", getpid (), script_name, line_nb,
147  final_message);
148  else
149  g_message ("[%d](%s)(%s:%d) %s", getpid (), script_name, debug_filename,
150  line_nb, final_message);
151  g_free (final_message);
152  va_end (param);
153 }
154 
160 int
162 {
163  if (nasl_trace_fp == NULL)
164  return 0;
165  else
166  return 1;
167 }
168 
174 void
175 nasl_trace (lex_ctxt *lexic, char *msg, ...)
176 {
177  va_list param;
178  char debug_message[4096];
179  char *script_name = "", *p;
180 
181  if (nasl_trace_fp == NULL)
182  return;
183  va_start (param, msg);
184 
185  if (lexic != NULL)
186  {
187  script_name = lexic->script_infos->name;
188  if (script_name == NULL)
189  script_name = "";
190  }
191 
192  vsnprintf (debug_message, sizeof (debug_message), msg, param);
193  for (p = debug_message; *p != '\0'; p++)
194  ;
195  if (p == debug_message || p[-1] != '\n')
196  fprintf (nasl_trace_fp, "[%d](%s) %s\n", getpid (), script_name,
197  debug_message);
198  else
199  fprintf (nasl_trace_fp, "[%d](%s) %s", getpid (), script_name,
200  debug_message);
201 
202  va_end (param);
203 }
struct_lex_ctxt::line_nb
int line_nb
Definition: nasl_lex_ctxt.h:33
nasl_trace
void nasl_trace(lex_ctxt *lexic, char *msg,...)
Prints debug message in printf fashion to nasl_trace_fp if it exists.
Definition: nasl_debug.c:175
nasl_get_function_name
const char * nasl_get_function_name()
Definition: nasl_debug.c:82
nasl_trace_fp
FILE * nasl_trace_fp
Definition: exec.c:357
script_infos::name
char * name
Definition: scanneraux.h:35
nasl_set_function_filename
void nasl_set_function_filename(const char *function)
Definition: nasl_debug.c:99
nasl_set_function_name
void nasl_set_function_name(const char *funname)
Definition: nasl_debug.c:73
exec.h
debug_plugin_filename
static char debug_plugin_filename[PATH_MAX]
Definition: nasl_debug.c:32
debug_funname
static char * debug_funname
Definition: nasl_debug.c:31
struct_lex_ctxt::up_ctxt
struct struct_lex_ctxt * up_ctxt
Definition: nasl_lex_ctxt.h:24
nasl_debug.h
nasl_perror
void nasl_perror(lex_ctxt *lexic, char *msg,...)
Definition: nasl_debug.c:111
nasl_trace_enabled
int nasl_trace_enabled(void)
Checks if the nasl_trace_fp is set.
Definition: nasl_debug.c:161
nasl_lex_ctxt.h
nasl_func.h
script_name
tree_cell * script_name(lex_ctxt *lexic)
Definition: nasl_scanner_glue.c:234
nasl_get_plugin_filename
const char * nasl_get_plugin_filename()
Get the current launched plugin filename.
Definition: nasl_debug.c:42
struct_lex_ctxt::script_infos
struct script_infos * script_infos
Definition: nasl_lex_ctxt.h:30
struct_lex_ctxt
Definition: nasl_lex_ctxt.h:23
debug_filename
static char * debug_filename
Definition: nasl_debug.c:30
nasl_var.h
nasl_set_plugin_filename
void nasl_set_plugin_filename(const char *filename)
Set the current launched plugin filename.
Definition: nasl_debug.c:53
nasl_global_ctxt.h
functions_filenames
static GHashTable * functions_filenames
Definition: nasl_debug.c:34
nasl_get_filename
const char * nasl_get_filename(const char *function)
Definition: nasl_debug.c:60
nasl_set_filename
void nasl_set_filename(const char *filename)
Definition: nasl_debug.c:88
nasl_tree.h