OpenVAS Libraries  9.0.3
nasl_debug.c
Go to the documentation of this file.
1 /* Nessus Attack Scripting Language
2  *
3  * Copyright (C) 2002 - 2004 Tenable Network Security
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2,
7  * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  *
18  */
19 
20 #include <stdarg.h>
21 #include <unistd.h>
22 
23 #include "../misc/arglists.h"
24 
25 #include "nasl_tree.h"
26 #include "nasl_global_ctxt.h"
27 #include "nasl_func.h"
28 #include "nasl_var.h"
29 #include "nasl_lex_ctxt.h"
30 #include "exec.h"
31 #include "../misc/plugutils.h"
32 #include "../misc/openvas_logging.h"
33 
34 
35 extern FILE *nasl_trace_fp;
36 
37 static char *debug_filename = NULL;
38 static char *debug_funname = NULL;
39 
40 static GHashTable *functions_filenames = NULL;
41 
42 const char *
43 nasl_get_filename (const char *function)
44 {
45  char *ret = NULL;
46 
47  if (functions_filenames && function)
48  ret = g_hash_table_lookup (functions_filenames, function);
49  return ret ?: debug_filename;
50 }
51 
52 /* For debug purposes, the non internal function name is saved to
53  * be displayed in the error message.
54  */
55 void
56 nasl_set_function_name (const char *funname)
57 {
58  if (funname == debug_funname)
59  return;
60  g_free (debug_funname);
61  debug_funname = g_strdup (funname);
62 }
63 
64 const char *
66 {
67  return debug_funname;
68 }
69 
70 void
71 nasl_set_filename (const char *filename)
72 {
73  assert (filename);
74 
75  if (filename == debug_filename)
76  return;
77  g_free (debug_filename);
78  debug_filename = g_strdup (filename);
79 }
80 
81 void
82 nasl_set_function_filename (const char *function)
83 {
84  assert (function);
85 
86  if (!functions_filenames)
87  functions_filenames = g_hash_table_new_full
88  (g_str_hash, g_str_equal, g_free, g_free);
89  g_hash_table_insert (functions_filenames, g_strdup (function),
90  g_strdup (debug_filename));
91 }
92 
93 void
94 nasl_perror (lex_ctxt * lexic, char *msg, ...)
95 {
96  va_list param;
97  gchar debug_message[4096];
98  gchar *final_message;
99  char *script_name = "";
100  lex_ctxt *lexic2 = NULL;
101  int line_nb = 0;
102 
103  va_start (param, msg);
104 
105  if (lexic != NULL)
106  {
107  script_name = arg_get_value (lexic->script_infos, "script_name");
108  if (script_name == NULL)
109  script_name = "";
110  /* Climbing up to find a line number */
111  for (lexic2 = lexic; lexic2 != NULL; lexic2 = lexic2->up_ctxt)
112  {
113  if (lexic2->line_nb != 0)
114  {
115  line_nb = lexic2->line_nb;
116  break;
117  }
118  }
119  }
120 
121  g_vsnprintf (debug_message, sizeof (debug_message), msg, param);
122  if ((debug_funname != NULL) && (g_strcmp0 (debug_funname, "") != 0))
123  final_message = g_strconcat ("In function '", debug_funname,
124  "()': ", debug_message, NULL);
125  else
126  final_message = g_strdup (debug_message);
127 
128  if (g_strcmp0 (debug_filename, script_name) == 0)
129  log_legacy_write ("[%d](%s:%d) %s\n", getpid (), script_name,
130  line_nb, final_message);
131  else
132  log_legacy_write ("[%d](%s)(%s:%d) %s\n", getpid (), script_name,
133  debug_filename, line_nb, final_message);
134  g_free(final_message);
135 
137 #if 0
138  if (lexic != NULL)
139  post_error (lexic->script_infos, 1, debug_message);
140 #endif
141 
142  va_end (param);
143 }
144 
150 int
152 {
153  if (nasl_trace_fp == NULL)
154  return 0;
155  else
156  return 1;
157 }
158 
164 void
165 nasl_trace (lex_ctxt * lexic, char *msg, ...)
166 {
167  va_list param;
168  char debug_message[4096];
169  char *script_name = "", *p;
170 
171  if (nasl_trace_fp == NULL)
172  return;
173  va_start (param, msg);
174 
175  if (lexic != NULL)
176  {
177  script_name = arg_get_value (lexic->script_infos, "script_name");
178  if (script_name == NULL)
179  script_name = "";
180  }
181 
182  vsnprintf (debug_message, sizeof (debug_message), msg, param);
183  for (p = debug_message; *p != '\0'; p++)
184  ;
185  if (p == debug_message || p[-1] != '\n')
186  fprintf (nasl_trace_fp, "[%d](%s) %s\n", getpid (), script_name,
187  debug_message);
188  else
189  fprintf (nasl_trace_fp, "[%d](%s) %s", getpid (), script_name,
190  debug_message);
191 
192  va_end (param);
193 }
int nasl_trace_enabled(void)
Checks if the nasl_trace_fp is set.
Definition: nasl_debug.c:151
const char * nasl_get_filename(const char *function)
Definition: nasl_debug.c:43
void post_error(const char *oid, struct arglist *desc, int port, const char *action)
Definition: plugutils.c:459
FILE * nasl_trace_fp
Definition: exec.c:386
void nasl_set_filename(const char *filename)
Definition: nasl_debug.c:71
void log_legacy_write(const char *format,...)
Legacy function to write a log message.
const char * nasl_get_function_name()
Definition: nasl_debug.c:65
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:165
tree_cell * script_name(lex_ctxt *lexic)
void nasl_perror(lex_ctxt *lexic, char *msg,...)
Definition: nasl_debug.c:94
void nasl_set_function_name(const char *funname)
Definition: nasl_debug.c:56
void nasl_set_function_filename(const char *function)
Definition: nasl_debug.c:82
struct arglist * script_infos
Definition: nasl_lex_ctxt.h:39
void * arg_get_value(struct arglist *args, const char *name)
Definition: arglists.c:252
struct struct_lex_ctxt * up_ctxt
Definition: nasl_lex_ctxt.h:33