OpenVAS Libraries  9.0.1
kb.h
Go to the documentation of this file.
1 /* OpenVAS Libraries
2  *
3  * Authors:
4  * Henri Doreau <henri.doreau@gmail.com>
5  *
6  * Copyright:
7  * Copyright (C) 2014 - Greenbone Networks GmbH.
8  *
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
23  *
24  * Knowledge base management API - Redis backend.
25  */
26 
27 #ifndef OPENVAS_KB_H
28 #define OPENVAS_KB_H
29 
30 #include <assert.h>
31 
38 #define KB_PATH_DEFAULT "/tmp/redis.sock"
39 
40 
48  /* -- */
50 };
51 
56 struct kb_item
57 {
60  union
61  {
62  char *v_str;
63  int v_int;
64  };
66  struct kb_item *next;
68  size_t namelen;
69  char name[0];
70 };
71 
72 struct kb_operations;
73 
77 struct kb
78 {
79  const struct kb_operations *kb_ops;
80 };
81 
85 typedef struct kb *kb_t;
86 
94 {
95  /* ctor/dtor */
96  int (*kb_new) (kb_t *, const char *);
97  int (*kb_delete) (kb_t);
98 
99  /* Actual kb operations */
100  struct kb_item *(*kb_get_single) (kb_t, const char *, enum kb_item_type);
101  char *(*kb_get_str) (kb_t, const char *);
102  int (*kb_get_int) (kb_t, const char *);
103  struct kb_item * (*kb_get_all) (kb_t, const char *);
104  struct kb_item * (*kb_get_pattern) (kb_t, const char *);
105  int (*kb_add_str) (kb_t, const char *, const char *);
106  int (*kb_set_str) (kb_t, const char *, const char *);
107  int (*kb_add_int) (kb_t, const char *, int);
108  int (*kb_set_int) (kb_t, const char *, int);
109  int (*kb_del_items) (kb_t, const char *);
110 
111  /* Utils */
112  int (*kb_lnk_reset) (kb_t);
113  int (*kb_flush) (kb_t);
114 };
115 
121 extern const struct kb_operations *KBDefaultOperations;
122 
126 void kb_item_free (struct kb_item *);
127 
128 
134 static inline int kb_new (kb_t *kb, const char *kb_path)
135 {
136  assert (kb);
137  assert (KBDefaultOperations);
138  assert (KBDefaultOperations->kb_new);
139 
140  *kb = NULL;
141 
142  return KBDefaultOperations->kb_new (kb, kb_path);
143 }
144 
150 static inline int kb_delete (kb_t kb)
151 {
152  assert (kb);
153  assert (kb->kb_ops);
154  assert (kb->kb_ops->kb_delete);
155 
156  return kb->kb_ops->kb_delete (kb);
157 }
158 
167 static inline struct kb_item *
168 kb_item_get_single (kb_t kb, const char *name, enum kb_item_type type)
169 {
170  assert (kb);
171  assert (kb->kb_ops);
172  assert (kb->kb_ops->kb_get_single);
173 
174  return kb->kb_ops->kb_get_single (kb, name, type);
175 }
176 
184 static inline char *
185 kb_item_get_str (kb_t kb, const char *name)
186 {
187  assert (kb);
188  assert (kb->kb_ops);
189  assert (kb->kb_ops->kb_get_str);
190 
191  return kb->kb_ops->kb_get_str (kb, name);
192 }
193 
201 static inline int
202 kb_item_get_int (kb_t kb, const char *name)
203 {
204  assert (kb);
205  assert (kb->kb_ops);
206  assert (kb->kb_ops->kb_get_int);
207 
208  return kb->kb_ops->kb_get_int (kb, name);
209 }
210 
218 static inline struct kb_item *
219 kb_item_get_all (kb_t kb, const char *name)
220 {
221  assert (kb);
222  assert (kb->kb_ops);
223  assert (kb->kb_ops->kb_get_all);
224 
225  return kb->kb_ops->kb_get_all (kb, name);
226 }
227 
235 static inline struct kb_item *
236 kb_item_get_pattern (kb_t kb, const char *pattern)
237 {
238  assert (kb);
239  assert (kb->kb_ops);
240  assert (kb->kb_ops->kb_get_pattern);
241 
242  return kb->kb_ops->kb_get_pattern (kb, pattern);
243 }
244 
252 static inline int
253 kb_item_add_str (kb_t kb, const char *name, const char *str)
254 {
255  assert (kb);
256  assert (kb->kb_ops);
257  assert (kb->kb_ops->kb_add_str);
258 
259  return kb->kb_ops->kb_add_str (kb, name, str);
260 }
261 
269 static inline int
270 kb_item_set_str (kb_t kb, const char *name, const char *str)
271 {
272  assert (kb);
273  assert (kb->kb_ops);
274  assert (kb->kb_ops->kb_set_str);
275 
276  return kb->kb_ops->kb_set_str (kb, name, str);
277 }
278 
286 static inline int
287 kb_item_add_int (kb_t kb, const char *name, int val)
288 {
289  assert (kb);
290  assert (kb->kb_ops);
291  assert (kb->kb_ops->kb_add_int);
292 
293  return kb->kb_ops->kb_add_int (kb, name, val);
294 }
295 
303 static inline int
304 kb_item_set_int (kb_t kb, const char *name, int val)
305 {
306  assert (kb);
307  assert (kb->kb_ops);
308  assert (kb->kb_ops->kb_set_int);
309 
310  return kb->kb_ops->kb_set_int (kb, name, val);
311 }
312 
319 static inline int
320 kb_del_items (kb_t kb, const char *name)
321 {
322  assert (kb);
323  assert (kb->kb_ops);
324  assert (kb->kb_ops->kb_del_items);
325 
326  return kb->kb_ops->kb_del_items (kb, name);
327 }
328 
335 static inline int kb_lnk_reset (kb_t kb)
336 {
337  int rc = 0;
338 
339  assert (kb);
340  assert (kb->kb_ops);
341 
342  if (kb->kb_ops->kb_lnk_reset != NULL)
343  rc = kb->kb_ops->kb_lnk_reset (kb);
344 
345  return rc;
346 }
347 
353 static inline int kb_flush (kb_t kb)
354 {
355  int rc = 0;
356 
357  assert (kb);
358  assert (kb->kb_ops);
359 
360  if (kb->kb_ops->kb_flush != NULL)
361  rc = kb->kb_ops->kb_flush (kb);
362 
363  return rc;
364 }
365 
366 #endif
const struct kb_operations * KBDefaultOperations
Default KB operations. No selection mechanism is provided yet since there&#39;s only one implementation (...
Definition: kb_redis.c:1039
struct kb_item *(* kb_get_all)(kb_t, const char *)
Definition: kb.h:103
Definition: kb.h:47
Definition: kb.h:49
void kb_item_free(struct kb_item *)
Release a KB item (or a list).
Definition: kb_redis.c:447
const char * val
Definition: nasl_init.c:514
Knowledge base item (defined by name, type (int/char*) and value). Implemented as a singly linked lis...
Definition: kb.h:56
struct kb_item * next
Definition: kb.h:66
enum kb_item_type type
Definition: kb.h:58
KB interface. Functions provided by an implementation. All functions have to be provided, there is no default/fallback. These functions should be called via the corresponding static inline wrappers below. See the wrappers for the documentation.
Definition: kb.h:93
Definition: kb.h:45
int(* kb_delete)(kb_t)
Definition: kb.h:97
struct kb_item *(* kb_get_single)(kb_t, const char *, enum kb_item_type)
Definition: kb.h:100
int(* kb_get_int)(kb_t, const char *)
Definition: kb.h:102
int(* kb_set_str)(kb_t, const char *, const char *)
Definition: kb.h:106
int(* kb_lnk_reset)(kb_t)
Definition: kb.h:112
int(* kb_del_items)(kb_t, const char *)
Definition: kb.h:109
Definition: kb.h:46
Top-level KB. This is to be inherited by KB implementations.
Definition: kb.h:77
const struct kb_operations * kb_ops
Definition: kb.h:79
struct kb_item *(* kb_get_pattern)(kb_t, const char *)
Definition: kb.h:104
int(* kb_add_int)(kb_t, const char *, int)
Definition: kb.h:107
int v_int
Definition: kb.h:63
kb_item_type
Possible type of a kb_item.
Definition: kb.h:44
size_t namelen
Definition: kb.h:68
int(* kb_flush)(kb_t)
Definition: kb.h:113
int(* kb_set_int)(kb_t, const char *, int)
Definition: kb.h:108
struct kb * kb_t
type abstraction to hide KB internals.
Definition: kb.h:85
char name[0]
Definition: kb.h:69
char *(* kb_get_str)(kb_t, const char *)
Definition: kb.h:101
int(* kb_add_str)(kb_t, const char *, const char *)
Definition: kb.h:105
char * v_str
Definition: kb.h:62
int(* kb_new)(kb_t *, const char *)
Definition: kb.h:96