OpenVAS Scanner 23.40.3
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 <assert.h>
10#include <gvm/base/logging.h>
11#include <stdarg.h>
12#include <stdio.h>
13#include <string.h> /* for str() */
14#include <unistd.h>
15
16#undef G_LOG_DOMAIN
20#define G_LOG_DOMAIN "lib nasl"
21
22extern FILE *nasl_trace_fp;
23
24static char *debug_filename = NULL;
25static char *debug_funname = NULL;
26static char debug_plugin_filename[PATH_MAX];
27
28static GHashTable *functions_filenames = NULL;
29
35const char *
40
46void
47nasl_set_plugin_filename (const char *filename)
48{
49 strncpy (debug_plugin_filename, filename, sizeof (debug_plugin_filename));
50 debug_plugin_filename[PATH_MAX - 1] = '\0';
51}
52
53const char *
54nasl_get_filename (const char *function)
55{
56 char *ret = NULL;
57
58 if (functions_filenames && function)
59 ret = g_hash_table_lookup (functions_filenames, function);
60 return ret ? ret : debug_filename;
61}
62
63/* For debug purposes, the non internal function name is saved to
64 * be displayed in the error message.
65 */
66void
67nasl_set_function_name (const char *funname)
68{
69 if (funname == debug_funname)
70 return;
71 g_free (debug_funname);
72 debug_funname = g_strdup (funname);
73}
74
75const char *
80
81void
82nasl_set_filename (const char *filename)
83{
84 assert (filename);
85
86 if (filename == debug_filename)
87 return;
88 g_free (debug_filename);
89 debug_filename = g_strdup (filename);
90}
91
92void
93nasl_set_function_filename (const char *function)
94{
95 assert (function);
96
99 g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
100 g_hash_table_insert (functions_filenames, g_strdup (function),
101 g_strdup (debug_filename));
102}
103
104void
105nasl_perror (lex_ctxt *lexic, char *msg, ...)
106{
107 va_list param;
108 gchar debug_message[4096];
109 gchar *final_message;
110 char *script_name = "";
111 lex_ctxt *lexic2 = NULL;
112 int line_nb = 0;
113 va_start (param, msg);
114
115 if (lexic != NULL)
116 {
117 script_name = lexic->script_infos->name;
118 if (script_name == NULL)
119 script_name = "";
120
121 /* Climbing up to find a line number */
122 for (lexic2 = lexic; lexic2 != NULL; lexic2 = lexic2->up_ctxt)
123 {
124 if (lexic2->line_nb != 0)
125 {
126 line_nb = lexic2->line_nb;
127 break;
128 }
129 }
130 }
131
132 g_vsnprintf (debug_message, sizeof (debug_message), msg, param);
133 if ((debug_funname != NULL) && (g_strcmp0 (debug_funname, "") != 0))
134 final_message = g_strconcat ("In function '", debug_funname,
135 "()': ", debug_message, NULL);
136 else
137 final_message = g_strdup (debug_message);
138
139 if (g_strcmp0 (debug_filename, script_name) == 0)
140 g_message ("[%d](%s:%d) %s", getpid (), script_name, line_nb,
141 final_message);
142 else
143 g_message ("[%d](%s)(%s:%d) %s", getpid (), script_name, debug_filename,
144 line_nb, final_message);
145 g_free (final_message);
146 va_end (param);
147}
148
154int
156{
157 if (nasl_trace_fp == NULL)
158 return 0;
159 else
160 return 1;
161}
162
168void
169nasl_trace (lex_ctxt *lexic, char *msg, ...)
170{
171 va_list param;
172 char debug_message[4096];
173 char *script_name = "", *p;
174
175 if (nasl_trace_fp == NULL)
176 return;
177 va_start (param, msg);
178
179 if (lexic != NULL)
180 {
181 script_name = lexic->script_infos->name;
182 if (script_name == NULL)
183 script_name = "";
184 }
185
186 vsnprintf (debug_message, sizeof (debug_message), msg, param);
187 for (p = debug_message; *p != '\0'; p++)
188 ;
189 if (p == debug_message || p[-1] != '\n')
190 fprintf (nasl_trace_fp, "[%d](%s) %s\n", getpid (), script_name,
191 debug_message);
192 else
193 fprintf (nasl_trace_fp, "[%d](%s) %s", getpid (), script_name,
194 debug_message);
195
196 va_end (param);
197}
FILE * nasl_trace_fp
Definition exec.c:357
int nasl_trace_enabled(void)
Checks if the nasl_trace_fp is set.
Definition nasl_debug.c:155
const char * nasl_get_plugin_filename()
Get the current launched plugin filename.
Definition nasl_debug.c:36
void nasl_set_function_name(const char *funname)
Definition nasl_debug.c:67
void nasl_set_filename(const char *filename)
Definition nasl_debug.c:82
static char * debug_filename
Definition nasl_debug.c:24
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:169
static char debug_plugin_filename[PATH_MAX]
Definition nasl_debug.c:26
void nasl_set_function_filename(const char *function)
Definition nasl_debug.c:93
static char * debug_funname
Definition nasl_debug.c:25
static GHashTable * functions_filenames
Definition nasl_debug.c:28
void nasl_set_plugin_filename(const char *filename)
Set the current launched plugin filename.
Definition nasl_debug.c:47
const char * nasl_get_function_name()
Definition nasl_debug.c:76
void nasl_perror(lex_ctxt *lexic, char *msg,...)
Definition nasl_debug.c:105
const char * nasl_get_filename(const char *function)
Definition nasl_debug.c:54
struct struct_lex_ctxt lex_ctxt
tree_cell * script_name(lex_ctxt *lexic)
char * name
Definition scanneraux.h:35
struct script_infos * script_infos
struct struct_lex_ctxt * up_ctxt