Greenbone Vulnerability Management Libraries  10.0.0
kb.h
Go to the documentation of this file.
1 /* Copyright (C) 2014-2019 Greenbone Networks GmbH
2  *
3  * SPDX-License-Identifier: GPL-2.0-or-later
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  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
25 #ifndef _GVM_KB_H
26 #define _GVM_KB_H
27 
28 #include "../base/nvti.h" /* for nvti_t */
29 
30 #include <assert.h>
31 #include <stddef.h> /* for NULL */
32 #include <sys/types.h> /* for size_t */
33 
37 #define KB_PATH_DEFAULT "/tmp/redis.sock"
38 
43 {
47  /* -- */
49 };
50 
55 {
73 };
74 
79 struct kb_item
80 {
83  union
84  {
85  char *v_str;
86  int v_int;
87  };
89  size_t len;
90  struct kb_item *next;
92  size_t namelen;
93  char name[0];
94 };
95 
96 struct kb_operations;
97 
101 struct kb
102 {
103  const struct kb_operations *kb_ops;
104 };
105 
109 typedef struct kb *kb_t;
110 
118 {
119  /* ctor/dtor */
120  int (*kb_new) (kb_t *, const char *);
121  int (*kb_delete) (kb_t);
122  kb_t (*kb_find) (const char *, const char *);
123  kb_t (*kb_direct_conn) (const char *, const int);
125  /* Actual kb operations */
129  struct kb_item *(*kb_get_single) (kb_t, const char *, enum kb_item_type);
133  char *(*kb_get_str) (kb_t, const char *);
137  int (*kb_get_int) (kb_t, const char *);
141  char *(*kb_get_nvt) (kb_t, const char *, enum kb_nvt_pos);
145  nvti_t *(*kb_get_nvt_all) (kb_t, const char *);
149  GSList *(*kb_get_nvt_oids) (kb_t);
153  int (*kb_push_str) (kb_t, const char *, const char *);
157  char *(*kb_pop_str) (kb_t, const char *);
162  struct kb_item *(*kb_get_all) (kb_t, const char *);
167  struct kb_item *(*kb_get_pattern) (kb_t, const char *);
172  size_t (*kb_count) (kb_t, const char *);
177  int (*kb_add_str) (kb_t, const char *, const char *, size_t);
182  int (*kb_add_str_unique) (kb_t, const char *, const char *, size_t);
187  int (*kb_set_str) (kb_t, const char *, const char *, size_t);
192  int (*kb_add_int) (kb_t, const char *, int);
197  int (*kb_add_int_unique) (kb_t, const char *, int);
202  int (*kb_set_int) (kb_t, const char *, int);
207  int (*kb_add_nvt) (kb_t, const nvti_t *, const char *);
212  int (*kb_del_items) (kb_t, const char *);
213 
214  /* Utils */
215  int (*kb_save) (kb_t);
216  int (*kb_lnk_reset) (kb_t);
217  int (*kb_flush) (kb_t, const char *);
219 };
220 
226 extern const struct kb_operations *KBDefaultOperations;
227 
231 void
232 kb_item_free (struct kb_item *);
233 
240 static inline int
241 kb_new (kb_t *kb, const char *kb_path)
242 {
243  assert (kb);
244  assert (KBDefaultOperations);
245  assert (KBDefaultOperations->kb_new);
246 
247  *kb = NULL;
248 
249  return KBDefaultOperations->kb_new (kb, kb_path);
250 }
251 
258 static inline kb_t
259 kb_direct_conn (const char *kb_path, const int kb_index)
260 {
261  assert (KBDefaultOperations);
263 
264  return KBDefaultOperations->kb_direct_conn (kb_path, kb_index);
265 }
266 
273 static inline kb_t
274 kb_find (const char *kb_path, const char *key)
275 {
276  assert (KBDefaultOperations);
277  assert (KBDefaultOperations->kb_find);
278 
279  return KBDefaultOperations->kb_find (kb_path, key);
280 }
281 
287 static inline int
289 {
290  assert (kb);
291  assert (kb->kb_ops);
292  assert (kb->kb_ops->kb_delete);
293 
294  return kb->kb_ops->kb_delete (kb);
295 }
296 
305 static inline struct kb_item *
307 {
308  assert (kb);
309  assert (kb->kb_ops);
310  assert (kb->kb_ops->kb_get_single);
311 
312  return kb->kb_ops->kb_get_single (kb, name, type);
313 }
314 
322 static inline char *
323 kb_item_get_str (kb_t kb, const char *name)
324 {
325  assert (kb);
326  assert (kb->kb_ops);
327  assert (kb->kb_ops->kb_get_str);
328 
329  return kb->kb_ops->kb_get_str (kb, name);
330 }
331 
339 static inline int
340 kb_item_get_int (kb_t kb, const char *name)
341 {
342  assert (kb);
343  assert (kb->kb_ops);
344  assert (kb->kb_ops->kb_get_int);
345 
346  return kb->kb_ops->kb_get_int (kb, name);
347 }
348 
356 static inline struct kb_item *
357 kb_item_get_all (kb_t kb, const char *name)
358 {
359  assert (kb);
360  assert (kb->kb_ops);
361  assert (kb->kb_ops->kb_get_all);
362 
363  return kb->kb_ops->kb_get_all (kb, name);
364 }
365 
373 static inline struct kb_item *
374 kb_item_get_pattern (kb_t kb, const char *pattern)
375 {
376  assert (kb);
377  assert (kb->kb_ops);
378  assert (kb->kb_ops->kb_get_pattern);
379 
380  return kb->kb_ops->kb_get_pattern (kb, pattern);
381 }
382 
390 static inline int
391 kb_item_push_str (kb_t kb, const char *name, const char *value)
392 {
393  assert (kb);
394  assert (kb->kb_ops);
395  assert (kb->kb_ops->kb_push_str);
396 
397  return kb->kb_ops->kb_push_str (kb, name, value);
398 }
399 
407 static inline char *
408 kb_item_pop_str (kb_t kb, const char *name)
409 {
410  assert (kb);
411  assert (kb->kb_ops);
412  assert (kb->kb_ops->kb_pop_str);
413 
414  return kb->kb_ops->kb_pop_str (kb, name);
415 }
416 
425 static inline size_t
426 kb_item_count (kb_t kb, const char *pattern)
427 {
428  assert (kb);
429  assert (kb->kb_ops);
430  assert (kb->kb_ops->kb_count);
431 
432  return kb->kb_ops->kb_count (kb, pattern);
433 }
434 
443 static inline int
444 kb_item_add_str (kb_t kb, const char *name, const char *str, size_t len)
445 {
446  assert (kb);
447  assert (kb->kb_ops);
448  assert (kb->kb_ops->kb_add_str);
449 
450  return kb->kb_ops->kb_add_str (kb, name, str, len);
451 }
452 
461 static inline int
462 kb_item_add_str_unique (kb_t kb, const char *name, const char *str, size_t len)
463 {
464  assert (kb);
465  assert (kb->kb_ops);
466  assert (kb->kb_ops->kb_add_str_unique);
467 
468  return kb->kb_ops->kb_add_str_unique (kb, name, str, len);
469 }
470 
479 static inline int
480 kb_item_set_str (kb_t kb, const char *name, const char *str, size_t len)
481 {
482  assert (kb);
483  assert (kb->kb_ops);
484  assert (kb->kb_ops->kb_set_str);
485 
486  return kb->kb_ops->kb_set_str (kb, name, str, len);
487 }
488 
496 static inline int
497 kb_item_add_int (kb_t kb, const char *name, int val)
498 {
499  assert (kb);
500  assert (kb->kb_ops);
501  assert (kb->kb_ops->kb_add_int);
502 
503  return kb->kb_ops->kb_add_int (kb, name, val);
504 }
505 
513 static inline int
514 kb_item_add_int_unique (kb_t kb, const char *name, int val)
515 {
516  assert (kb);
517  assert (kb->kb_ops);
518  assert (kb->kb_ops->kb_add_int_unique);
519 
520  return kb->kb_ops->kb_add_int_unique (kb, name, val);
521 }
522 
530 static inline int
531 kb_item_set_int (kb_t kb, const char *name, int val)
532 {
533  assert (kb);
534  assert (kb->kb_ops);
535  assert (kb->kb_ops->kb_set_int);
536 
537  return kb->kb_ops->kb_set_int (kb, name, val);
538 }
539 
547 static inline int
548 kb_nvt_add (kb_t kb, const nvti_t *nvt, const char *filename)
549 {
550  assert (kb);
551  assert (kb->kb_ops);
552  assert (kb->kb_ops->kb_add_nvt);
553 
554  return kb->kb_ops->kb_add_nvt (kb, nvt, filename);
555 }
556 
564 static inline char *
565 kb_nvt_get (kb_t kb, const char *oid, enum kb_nvt_pos position)
566 {
567  assert (kb);
568  assert (kb->kb_ops);
569  assert (kb->kb_ops->kb_get_nvt);
570 
571  return kb->kb_ops->kb_get_nvt (kb, oid, position);
572 }
573 
580 static inline nvti_t *
581 kb_nvt_get_all (kb_t kb, const char *oid)
582 {
583  assert (kb);
584  assert (kb->kb_ops);
585  assert (kb->kb_ops->kb_get_nvt_all);
586 
587  return kb->kb_ops->kb_get_nvt_all (kb, oid);
588 }
589 
595 static inline GSList *
597 {
598  assert (kb);
599  assert (kb->kb_ops);
600  assert (kb->kb_ops->kb_get_nvt_oids);
601 
602  return kb->kb_ops->kb_get_nvt_oids (kb);
603 }
604 
611 static inline int
612 kb_del_items (kb_t kb, const char *name)
613 {
614  assert (kb);
615  assert (kb->kb_ops);
616  assert (kb->kb_ops->kb_del_items);
617 
618  return kb->kb_ops->kb_del_items (kb, name);
619 }
620 
626 static inline int
628 {
629  int rc = 0;
630 
631  assert (kb);
632  assert (kb->kb_ops);
633 
634  if (kb->kb_ops->kb_save != NULL)
635  rc = kb->kb_ops->kb_save (kb);
636 
637  return rc;
638 }
639 
646 static inline int
648 {
649  int rc = 0;
650 
651  assert (kb);
652  assert (kb->kb_ops);
653 
654  if (kb->kb_ops->kb_lnk_reset != NULL)
655  rc = kb->kb_ops->kb_lnk_reset (kb);
656 
657  return rc;
658 }
659 
666 static inline int
667 kb_flush (kb_t kb, const char *except)
668 {
669  int rc = 0;
670 
671  assert (kb);
672  assert (kb->kb_ops);
673 
674  if (kb->kb_ops->kb_flush != NULL)
675  rc = kb->kb_ops->kb_flush (kb, except);
676 
677  return rc;
678 }
679 
685 static inline int
687 {
688  assert (kb);
689  assert (kb->kb_ops);
690  assert (kb->kb_ops->kb_get_kb_index);
691 
692  return kb->kb_ops->kb_get_kb_index (kb);
693 }
694 
695 #endif
static int kb_flush(kb_t kb, const char *except)
Flush all the KB's content. Delete all namespaces.
Definition: kb.h:667
kb_nvt_pos
Possible positions of nvt values in cache list.
Definition: kb.h:54
nvti_t *(* kb_get_nvt_all)(kb_t, const char *)
Definition: kb.h:145
static int kb_item_push_str(kb_t kb, const char *name, const char *value)
Push a new value under a given key.
Definition: kb.h:391
const struct kb_operations * KBDefaultOperations
Default KB operations. No selection mechanism is provided yet since there's only one implementation (...
Definition: kb.c:1623
struct kb_item *(* kb_get_all)(kb_t, const char *)
Definition: kb.h:162
Definition: kb.h:46
Definition: kb.h:48
void kb_item_free(struct kb_item *)
Release a KB item (or a list).
Definition: kb.c:608
static int kb_delete(kb_t kb)
Delete all entries and release ownership on the namespace.
Definition: kb.h:288
static int kb_item_set_int(kb_t kb, const char *name, int val)
Set (replace) a new entry under a given name.
Definition: kb.h:531
static int kb_item_get_int(kb_t kb, const char *name)
Get a single KB integer item.
Definition: kb.h:340
int(* kb_push_str)(kb_t, const char *, const char *)
Definition: kb.h:153
kb_t(* kb_direct_conn)(const char *, const int)
Definition: kb.h:123
The structure of a information record that corresponds to a NVT.
Definition: nvti.h:62
Knowledge base item (defined by name, type (int/char*) and value). Implemented as a singly linked lis...
Definition: kb.h:79
struct kb_item * next
Definition: kb.h:90
int(* kb_set_str)(kb_t, const char *, const char *, size_t)
Definition: kb.h:187
static int kb_item_add_int(kb_t kb, const char *name, int val)
Insert (append) a new entry under a given name.
Definition: kb.h:497
enum kb_item_type type
Definition: kb.h:81
KB interface. Functions provided by an implementation. All functions have to be provided,...
Definition: kb.h:117
static struct kb_item * kb_item_get_all(kb_t kb, const char *name)
Get all items stored under a given name.
Definition: kb.h:357
static nvti_t * kb_nvt_get_all(kb_t kb, const char *oid)
Get a full NVT.
Definition: kb.h:581
char *(* kb_pop_str)(kb_t, const char *)
Definition: kb.h:157
int(* kb_delete)(kb_t)
Definition: kb.h:121
struct kb_item *(* kb_get_single)(kb_t, const char *, enum kb_item_type)
Definition: kb.h:129
int(* kb_get_int)(kb_t, const char *)
Definition: kb.h:137
static int kb_get_kb_index(kb_t kb)
Return the kb index.
Definition: kb.h:686
int(* kb_lnk_reset)(kb_t)
Definition: kb.h:216
static int kb_new(kb_t *kb, const char *kb_path)
Initialize a new Knowledge Base object.
Definition: kb.h:241
int(* kb_del_items)(kb_t, const char *)
Definition: kb.h:212
int(* kb_add_str_unique)(kb_t, const char *, const char *, size_t)
Definition: kb.h:182
int(* kb_flush)(kb_t, const char *)
Definition: kb.h:217
Definition: kb.h:45
int(* kb_get_kb_index)(kb_t)
Definition: kb.h:218
Top-level KB. This is to be inherited by KB implementations.
Definition: kb.h:101
const struct kb_operations * kb_ops
Definition: kb.h:103
struct kb_item *(* kb_get_pattern)(kb_t, const char *)
Definition: kb.h:167
int(* kb_add_int)(kb_t, const char *, int)
Definition: kb.h:192
char *(* kb_get_nvt)(kb_t, const char *, enum kb_nvt_pos)
Definition: kb.h:141
static int kb_del_items(kb_t kb, const char *name)
Delete all entries under a given name.
Definition: kb.h:612
static int kb_nvt_add(kb_t kb, const nvti_t *nvt, const char *filename)
Insert a new nvt.
Definition: kb.h:548
static struct kb_item * kb_item_get_pattern(kb_t kb, const char *pattern)
Get all items stored under a given pattern.
Definition: kb.h:374
size_t len
Definition: kb.h:89
static int kb_item_add_int_unique(kb_t kb, const char *name, int val)
Insert (append) a new unique entry under a given name.
Definition: kb.h:514
static struct kb_item * kb_item_get_single(kb_t kb, const char *name, enum kb_item_type type)
Get a single KB element.
Definition: kb.h:306
static int kb_item_add_str(kb_t kb, const char *name, const char *str, size_t len)
Insert (append) a new entry under a given name.
Definition: kb.h:444
static GSList * kb_nvt_get_oids(kb_t kb)
Get list of NVT OIDs.
Definition: kb.h:596
int v_int
Definition: kb.h:86
kb_item_type
Possible type of a kb_item.
Definition: kb.h:42
static char * kb_item_get_str(kb_t kb, const char *name)
Get a single KB string item.
Definition: kb.h:323
static int kb_item_add_str_unique(kb_t kb, const char *name, const char *str, size_t len)
Insert (append) a new unique entry under a given name.
Definition: kb.h:462
size_t namelen
Definition: kb.h:92
static size_t kb_item_count(kb_t kb, const char *pattern)
Count all items stored under a given pattern.
Definition: kb.h:426
int(* kb_add_nvt)(kb_t, const nvti_t *, const char *)
Definition: kb.h:207
int(* kb_set_int)(kb_t, const char *, int)
Definition: kb.h:202
int(* kb_add_str)(kb_t, const char *, const char *, size_t)
Definition: kb.h:177
static char * kb_item_pop_str(kb_t kb, const char *name)
Pop a single KB string item.
Definition: kb.h:408
kb_t(* kb_find)(const char *, const char *)
Definition: kb.h:122
static kb_t kb_direct_conn(const char *kb_path, const int kb_index)
Connect to a Knowledge Base object which has the given kb_index.
Definition: kb.h:259
int(* kb_add_int_unique)(kb_t, const char *, int)
Definition: kb.h:197
struct kb * kb_t
type abstraction to hide KB internals.
Definition: kb.h:109
char name[0]
Definition: kb.h:93
static int kb_save(kb_t kb)
Save all the KB's content.
Definition: kb.h:627
static int kb_lnk_reset(kb_t kb)
Reset connection to the KB. This is called after each fork() to make sure connections aren't shared b...
Definition: kb.h:647
GSList *(* kb_get_nvt_oids)(kb_t)
Definition: kb.h:149
char *(* kb_get_str)(kb_t, const char *)
Definition: kb.h:133
static kb_t kb_find(const char *kb_path, const char *key)
Find an existing Knowledge Base object with key.
Definition: kb.h:274
static char * kb_nvt_get(kb_t kb, const char *oid, enum kb_nvt_pos position)
Get field of a NVT.
Definition: kb.h:565
Definition: kb.h:72
size_t(* kb_count)(kb_t, const char *)
Definition: kb.h:172
char * v_str
Definition: kb.h:85
static int kb_item_set_str(kb_t kb, const char *name, const char *str, size_t len)
Set (replace) a new entry under a given name.
Definition: kb.h:480
int(* kb_new)(kb_t *, const char *)
Definition: kb.h:120
int(* kb_save)(kb_t)
Definition: kb.h:215