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
26#define G_LOG_DOMAIN "lib nasl"
27
28extern FILE *nasl_trace_fp;
29
30static char *debug_filename = NULL;
31static char *debug_funname = NULL;
32static char debug_plugin_filename[PATH_MAX];
33
34static GHashTable *functions_filenames = NULL;
35
41const char *
43{
45}
46
52void
53nasl_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
59const char *
60nasl_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 */
72void
73nasl_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
81const char *
83{
84 return debug_funname;
85}
86
87void
88nasl_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
98void
99nasl_set_function_filename (const char *function)
100{
101 assert (function);
102
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
110void
111nasl_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
160int
162{
163 if (nasl_trace_fp == NULL)
164 return 0;
165 else
166 return 1;
167}
168
174void
175nasl_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}
int nasl_trace_enabled(void)
Checks if the nasl_trace_fp is set.
Definition: nasl_debug.c:161
FILE * nasl_trace_fp
Definition: exec.c:357
const char * nasl_get_plugin_filename()
Get the current launched plugin filename.
Definition: nasl_debug.c:42
void nasl_set_function_name(const char *funname)
Definition: nasl_debug.c:73
void nasl_set_filename(const char *filename)
Definition: nasl_debug.c:88
static char * debug_filename
Definition: nasl_debug.c:30
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
static char debug_plugin_filename[PATH_MAX]
Definition: nasl_debug.c:32
void nasl_set_function_filename(const char *function)
Definition: nasl_debug.c:99
static char * debug_funname
Definition: nasl_debug.c:31
static GHashTable * functions_filenames
Definition: nasl_debug.c:34
void nasl_set_plugin_filename(const char *filename)
Set the current launched plugin filename.
Definition: nasl_debug.c:53
const char * nasl_get_function_name()
Definition: nasl_debug.c:82
void nasl_perror(lex_ctxt *lexic, char *msg,...)
Definition: nasl_debug.c:111
const char * nasl_get_filename(const char *function)
Definition: nasl_debug.c:60
tree_cell * script_name(lex_ctxt *lexic)
char * name
Definition: scanneraux.h:35
struct script_infos * script_infos
Definition: nasl_lex_ctxt.h:30
struct struct_lex_ctxt * up_ctxt
Definition: nasl_lex_ctxt.h:24