OpenVAS Scanner  7.0.0~git
nasl_debug.c
Go to the documentation of this file.
1 /* Based on work Copyright (C) 2002 - 2004 Tenable Network Security
2  *
3  * SPDX-License-Identifier: GPL-2.0-only
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * version 2 as published by the Free Software Foundation.
8  *
9  * This program 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
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 
19 #include "../misc/plugutils.h"
20 #include "exec.h"
21 #include "nasl_func.h"
22 #include "nasl_global_ctxt.h"
23 #include "nasl_lex_ctxt.h"
24 #include "nasl_tree.h"
25 #include "nasl_var.h"
26 
27 #include <gvm/base/logging.h>
28 #include <stdarg.h>
29 #include <string.h> /* for str() */
30 #include <unistd.h>
31 
32 #undef G_LOG_DOMAIN
33 
36 #define G_LOG_DOMAIN "lib nasl"
37 
38 extern FILE *nasl_trace_fp;
39 
40 static char *debug_filename = NULL;
41 static char *debug_funname = NULL;
42 static char debug_plugin_filename[PATH_MAX];
43 
44 static GHashTable *functions_filenames = NULL;
45 
51 const char *
53 {
54  return debug_plugin_filename;
55 }
56 
62 void
63 nasl_set_plugin_filename (const char *filename)
64 {
65  strncpy (debug_plugin_filename, filename, sizeof (debug_plugin_filename));
66 }
67 
68 const char *
69 nasl_get_filename (const char *function)
70 {
71  char *ret = NULL;
72 
73  if (functions_filenames && function)
74  ret = g_hash_table_lookup (functions_filenames, function);
75  return ret ?: debug_filename;
76 }
77 
78 /* For debug purposes, the non internal function name is saved to
79  * be displayed in the error message.
80  */
81 void
82 nasl_set_function_name (const char *funname)
83 {
84  if (funname == debug_funname)
85  return;
86  g_free (debug_funname);
87  debug_funname = g_strdup (funname);
88 }
89 
90 const char *
92 {
93  return debug_funname;
94 }
95 
96 void
97 nasl_set_filename (const char *filename)
98 {
99  assert (filename);
100 
101  if (filename == debug_filename)
102  return;
103  g_free (debug_filename);
104  debug_filename = g_strdup (filename);
105 }
106 
107 void
108 nasl_set_function_filename (const char *function)
109 {
110  assert (function);
111 
112  if (!functions_filenames)
114  g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
115  g_hash_table_insert (functions_filenames, g_strdup (function),
116  g_strdup (debug_filename));
117 }
118 
119 void
120 nasl_perror (lex_ctxt *lexic, char *msg, ...)
121 {
122  va_list param;
123  gchar debug_message[4096];
124  gchar *final_message;
125  char *script_name = "";
126  lex_ctxt *lexic2 = NULL;
127  int line_nb = 0;
128  va_start (param, msg);
129 
130  if (lexic != NULL)
131  {
132  script_name = lexic->script_infos->name;
133  if (script_name == NULL)
134  script_name = "";
135 
136  /* Climbing up to find a line number */
137  for (lexic2 = lexic; lexic2 != NULL; lexic2 = lexic2->up_ctxt)
138  {
139  if (lexic2->line_nb != 0)
140  {
141  line_nb = lexic2->line_nb;
142  break;
143  }
144  }
145  }
146 
147  g_vsnprintf (debug_message, sizeof (debug_message), msg, param);
148  if ((debug_funname != NULL) && (g_strcmp0 (debug_funname, "") != 0))
149  final_message = g_strconcat ("In function '", debug_funname,
150  "()': ", debug_message, NULL);
151  else
152  final_message = g_strdup (debug_message);
153 
154  if (g_strcmp0 (debug_filename, script_name) == 0)
155  g_message ("[%d](%s:%d) %s", getpid (), script_name, line_nb,
156  final_message);
157  else
158  g_message ("[%d](%s)(%s:%d) %s", getpid (), script_name, debug_filename,
159  line_nb, final_message);
160  g_free (final_message);
161  va_end (param);
162 }
163 
169 int
171 {
172  if (nasl_trace_fp == NULL)
173  return 0;
174  else
175  return 1;
176 }
177 
183 void
184 nasl_trace (lex_ctxt *lexic, char *msg, ...)
185 {
186  va_list param;
187  char debug_message[4096];
188  char *script_name = "", *p;
189 
190  if (nasl_trace_fp == NULL)
191  return;
192  va_start (param, msg);
193 
194  if (lexic != NULL)
195  {
196  script_name = lexic->script_infos->name;
197  if (script_name == NULL)
198  script_name = "";
199  }
200 
201  vsnprintf (debug_message, sizeof (debug_message), msg, param);
202  for (p = debug_message; *p != '\0'; p++)
203  ;
204  if (p == debug_message || p[-1] != '\n')
205  fprintf (nasl_trace_fp, "[%d](%s) %s\n", getpid (), script_name,
206  debug_message);
207  else
208  fprintf (nasl_trace_fp, "[%d](%s) %s", getpid (), script_name,
209  debug_message);
210 
211  va_end (param);
212 }
struct_lex_ctxt::line_nb
int line_nb
Definition: nasl_lex_ctxt.h:44
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:184
nasl_get_function_name
const char * nasl_get_function_name()
Definition: nasl_debug.c:91
nasl_trace_fp
FILE * nasl_trace_fp
Definition: exec.c:368
script_infos::name
char * name
Definition: scanneraux.h:49
nasl_set_function_filename
void nasl_set_function_filename(const char *function)
Definition: nasl_debug.c:108
nasl_set_function_name
void nasl_set_function_name(const char *funname)
Definition: nasl_debug.c:82
exec.h
debug_plugin_filename
static char debug_plugin_filename[PATH_MAX]
Definition: nasl_debug.c:42
debug_funname
static char * debug_funname
Definition: nasl_debug.c:41
struct_lex_ctxt::up_ctxt
struct struct_lex_ctxt * up_ctxt
Definition: nasl_lex_ctxt.h:35
nasl_perror
void nasl_perror(lex_ctxt *lexic, char *msg,...)
Definition: nasl_debug.c:120
nasl_trace_enabled
int nasl_trace_enabled(void)
Checks if the nasl_trace_fp is set.
Definition: nasl_debug.c:170
nasl_lex_ctxt.h
nasl_func.h
script_name
tree_cell * script_name(lex_ctxt *lexic)
Definition: nasl_scanner_glue.c:250
nasl_get_plugin_filename
const char * nasl_get_plugin_filename()
Get the current launched plugin filename.
Definition: nasl_debug.c:52
struct_lex_ctxt::script_infos
struct script_infos * script_infos
Definition: nasl_lex_ctxt.h:41
struct_lex_ctxt
Definition: nasl_lex_ctxt.h:33
debug_filename
static char * debug_filename
Definition: nasl_debug.c:40
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:63
nasl_global_ctxt.h
functions_filenames
static GHashTable * functions_filenames
Definition: nasl_debug.c:44
nasl_get_filename
const char * nasl_get_filename(const char *function)
Definition: nasl_debug.c:69
nasl_set_filename
void nasl_set_filename(const char *filename)
Definition: nasl_debug.c:97
nasl_tree.h