Greenbone Vulnerability Management Libraries 22.7.3
kb.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2014-2023 Greenbone AG
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later
4 */
5
11#ifndef _GVM_KB_H
12#define _GVM_KB_H
13
14#include "../base/nvti.h" /* for nvti_t */
15
16#include <assert.h>
17#include <stddef.h> /* for NULL */
18#include <sys/types.h> /* for size_t */
19
23#ifdef REDIS_SOCKET_PATH
24#define KB_PATH_DEFAULT REDIS_SOCKET_PATH
25#else
26#define KB_PATH_DEFAULT "/run/redis/redis.sock"
27#endif
28
33{
37 /* -- */
39};
40
45{
62};
63
68struct kb_item
69{
72 union
73 {
74 char *v_str;
75 int v_int;
76 };
78 size_t len;
79 struct kb_item *next;
81 size_t namelen;
82 char name[];
83};
84
85struct kb_operations;
86
90struct kb
91{
92 const struct kb_operations *kb_ops;
93};
94
98typedef struct kb *kb_t;
99
107{
108 /* ctor/dtor */
109 int (*kb_new) (kb_t *, const char *);
110 int (*kb_delete) (kb_t);
111 kb_t (*kb_find) (const char *, const char *);
112 kb_t (*kb_direct_conn) (const char *, const int);
114 /* Actual kb operations */
118 struct kb_item *(*kb_get_single) (kb_t, const char *, enum kb_item_type);
122 char *(*kb_get_str) (kb_t, const char *);
126 int (*kb_get_int) (kb_t, const char *);
130 char *(*kb_get_nvt) (kb_t, const char *, enum kb_nvt_pos);
134 nvti_t *(*kb_get_nvt_all) (kb_t, const char *);
138 GSList *(*kb_get_nvt_oids) (kb_t);
142 int (*kb_push_str) (kb_t, const char *, const char *);
146 char *(*kb_pop_str) (kb_t, const char *);
151 struct kb_item *(*kb_get_all) (kb_t, const char *);
156 struct kb_item *(*kb_get_pattern) (kb_t, const char *);
161 size_t (*kb_count) (kb_t, const char *);
166 int (*kb_add_str) (kb_t, const char *, const char *, size_t);
171 int (*kb_add_str_unique) (kb_t, const char *, const char *, size_t, int);
176 int (*kb_add_str_unique_volatile) (kb_t, const char *, const char *, int,
177 size_t, int);
182 int (*kb_set_str) (kb_t, const char *, const char *, size_t);
187 int (*kb_add_int) (kb_t, const char *, int);
192 int (*kb_add_int_unique) (kb_t, const char *, int);
197 int (*kb_add_int_unique_volatile) (kb_t, const char *, int, 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);
217 int (*kb_flush) (kb_t, const char *);
219};
220
226extern const struct kb_operations *KBDefaultOperations;
227
231void
232kb_item_free (struct kb_item *);
233
240static inline int
241kb_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
258static inline kb_t
259kb_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
273static inline kb_t
274kb_find (const char *kb_path, const char *key)
275{
276 assert (KBDefaultOperations);
278
279 return KBDefaultOperations->kb_find (kb_path, key);
280}
281
287static 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
305static 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
321static inline char *
323{
324 assert (kb);
325 assert (kb->kb_ops);
326 assert (kb->kb_ops->kb_get_str);
327
328 return kb->kb_ops->kb_get_str (kb, name);
329}
330
337static inline int
339{
340 assert (kb);
341 assert (kb->kb_ops);
342 assert (kb->kb_ops->kb_get_int);
343
344 return kb->kb_ops->kb_get_int (kb, name);
345}
346
354static inline struct kb_item *
356{
357 assert (kb);
358 assert (kb->kb_ops);
359 assert (kb->kb_ops->kb_get_all);
360
361 return kb->kb_ops->kb_get_all (kb, name);
362}
363
371static inline struct kb_item *
372kb_item_get_pattern (kb_t kb, const char *pattern)
373{
374 assert (kb);
375 assert (kb->kb_ops);
376 assert (kb->kb_ops->kb_get_pattern);
377
378 return kb->kb_ops->kb_get_pattern (kb, pattern);
379}
380
388static inline int
389kb_item_push_str (kb_t kb, const char *name, const char *value)
390{
391 assert (kb);
392 assert (kb->kb_ops);
393 assert (kb->kb_ops->kb_push_str);
394
395 return kb->kb_ops->kb_push_str (kb, name, value);
396}
397
405static inline char *
407{
408 assert (kb);
409 assert (kb->kb_ops);
410 assert (kb->kb_ops->kb_pop_str);
411
412 return kb->kb_ops->kb_pop_str (kb, name);
413}
414
423static inline size_t
424kb_item_count (kb_t kb, const char *pattern)
425{
426 assert (kb);
427 assert (kb->kb_ops);
428 assert (kb->kb_ops->kb_count);
429
430 return kb->kb_ops->kb_count (kb, pattern);
431}
432
441static inline int
442kb_item_add_str (kb_t kb, const char *name, const char *str, size_t len)
443{
444 assert (kb);
445 assert (kb->kb_ops);
446 assert (kb->kb_ops->kb_add_str);
447
448 return kb->kb_ops->kb_add_str (kb, name, str, len);
449}
450
461static inline int
462kb_item_add_str_unique (kb_t kb, const char *name, const char *str, size_t len,
463 int pos)
464{
465 assert (kb);
466 assert (kb->kb_ops);
467 assert (kb->kb_ops->kb_add_str_unique);
468
469 return kb->kb_ops->kb_add_str_unique (kb, name, str, len, pos);
470}
471
483static inline int
484kb_add_str_unique_volatile (kb_t kb, const char *name, const char *str,
485 int expire, size_t len, int pos)
486{
487 assert (kb);
488 assert (KBDefaultOperations);
490
492 len, pos);
493}
494
503static inline int
504kb_item_set_str (kb_t kb, const char *name, const char *str, size_t len)
505{
506 assert (kb);
507 assert (kb->kb_ops);
508 assert (kb->kb_ops->kb_set_str);
509
510 return kb->kb_ops->kb_set_str (kb, name, str, len);
511}
512
520static inline int
521kb_item_add_int (kb_t kb, const char *name, int val)
522{
523 assert (kb);
524 assert (kb->kb_ops);
525 assert (kb->kb_ops->kb_add_int);
526
527 return kb->kb_ops->kb_add_int (kb, name, val);
528}
529
537static inline int
538kb_item_add_int_unique (kb_t kb, const char *name, int val)
539{
540 assert (kb);
541 assert (kb->kb_ops);
542 assert (kb->kb_ops->kb_add_int_unique);
543
544 return kb->kb_ops->kb_add_int_unique (kb, name, val);
545}
546
556static inline int
557kb_add_int_unique_volatile (kb_t kb, const char *name, int val, int expire)
558{
559 assert (kb);
560 assert (KBDefaultOperations);
562
564 expire);
565}
566
574static inline int
575kb_item_set_int (kb_t kb, const char *name, int val)
576{
577 assert (kb);
578 assert (kb->kb_ops);
579 assert (kb->kb_ops->kb_set_int);
580
581 return kb->kb_ops->kb_set_int (kb, name, val);
582}
583
591static inline int
592kb_nvt_add (kb_t kb, const nvti_t *nvt, const char *filename)
593{
594 assert (kb);
595 assert (kb->kb_ops);
596 assert (kb->kb_ops->kb_add_nvt);
597
598 return kb->kb_ops->kb_add_nvt (kb, nvt, filename);
599}
600
608static inline char *
609kb_nvt_get (kb_t kb, const char *oid, enum kb_nvt_pos position)
610{
611 assert (kb);
612 assert (kb->kb_ops);
613 assert (kb->kb_ops->kb_get_nvt);
614
615 return kb->kb_ops->kb_get_nvt (kb, oid, position);
616}
617
624static inline nvti_t *
625kb_nvt_get_all (kb_t kb, const char *oid)
626{
627 assert (kb);
628 assert (kb->kb_ops);
629 assert (kb->kb_ops->kb_get_nvt_all);
630
631 return kb->kb_ops->kb_get_nvt_all (kb, oid);
632}
633
639static inline GSList *
641{
642 assert (kb);
643 assert (kb->kb_ops);
644 assert (kb->kb_ops->kb_get_nvt_oids);
645
646 return kb->kb_ops->kb_get_nvt_oids (kb);
647}
648
655static inline int
656kb_del_items (kb_t kb, const char *name)
657{
658 assert (kb);
659 assert (kb->kb_ops);
660 assert (kb->kb_ops->kb_del_items);
661
662 return kb->kb_ops->kb_del_items (kb, name);
663}
664
670static inline int
672{
673 int rc = 0;
674
675 assert (kb);
676 assert (kb->kb_ops);
677
678 if (kb->kb_ops->kb_save != NULL)
679 rc = kb->kb_ops->kb_save (kb);
680
681 return rc;
682}
683
690static inline int
692{
693 int rc = 0;
694
695 assert (kb);
696 assert (kb->kb_ops);
697
698 if (kb->kb_ops->kb_lnk_reset != NULL)
699 rc = kb->kb_ops->kb_lnk_reset (kb);
700
701 return rc;
702}
703
710static inline int
711kb_flush (kb_t kb, const char *except)
712{
713 int rc = 0;
714
715 assert (kb);
716 assert (kb->kb_ops);
717
718 if (kb->kb_ops->kb_flush != NULL)
719 rc = kb->kb_ops->kb_flush (kb, except);
720
721 return rc;
722}
723
729static inline int
731{
732 assert (kb);
733 assert (kb->kb_ops);
734 assert (kb->kb_ops->kb_get_kb_index);
735
736 return kb->kb_ops->kb_get_kb_index (kb);
737}
738
739#endif
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:575
static int kb_del_items(kb_t kb, const char *name)
Delete all entries under a given name.
Definition: kb.h:656
static int kb_item_add_str_unique(kb_t kb, const char *name, const char *str, size_t len, int pos)
Insert (append) a new unique entry under a given name.
Definition: kb.h:462
static int kb_nvt_add(kb_t kb, const nvti_t *nvt, const char *filename)
Insert a new nvt.
Definition: kb.h:592
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:442
kb_nvt_pos
Possible positions of nvt values in cache list.
Definition: kb.h:45
@ NVT_FAMILY_POS
Definition: kb.h:58
@ NVT_CATEGORY_POS
Definition: kb.h:57
@ NVT_TIMESTAMP_POS
Definition: kb.h:60
@ NVT_NAME_POS
Definition: kb.h:59
@ NVT_TAGS_POS
Definition: kb.h:53
@ NVT_BIDS_POS
Definition: kb.h:55
@ NVT_EXCLUDED_KEYS_POS
Definition: kb.h:49
@ NVT_REQUIRED_PORTS_POS
Definition: kb.h:51
@ NVT_REQUIRED_UDP_PORTS_POS
Definition: kb.h:50
@ NVT_FILENAME_POS
Definition: kb.h:46
@ NVT_OID_POS
Definition: kb.h:61
@ NVT_DEPENDENCIES_POS
Definition: kb.h:52
@ NVT_CVES_POS
Definition: kb.h:54
@ NVT_REQUIRED_KEYS_POS
Definition: kb.h:47
@ NVT_XREFS_POS
Definition: kb.h:56
@ NVT_MANDATORY_KEYS_POS
Definition: kb.h:48
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:389
static int kb_new(kb_t *kb, const char *kb_path)
Initialize a new Knowledge Base object.
Definition: kb.h:241
static size_t kb_item_count(kb_t kb, const char *pattern)
Count all items stored under a given pattern.
Definition: kb.h:424
static int kb_delete(kb_t kb)
Delete all entries and release ownership on the namespace.
Definition: kb.h:288
static int kb_item_get_int(kb_t kb, const char *name)
Get a single KB integer item.
Definition: kb.h:338
struct kb * kb_t
type abstraction to hide KB internals.
Definition: kb.h:98
static nvti_t * kb_nvt_get_all(kb_t kb, const char *oid)
Get a full NVT.
Definition: kb.h:625
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 GSList * kb_nvt_get_oids(kb_t kb)
Get list of NVT OIDs.
Definition: kb.h:640
static char * kb_item_pop_str(kb_t kb, const char *name)
Pop a single KB string item.
Definition: kb.h:406
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:504
static int kb_add_int_unique_volatile(kb_t kb, const char *name, int val, int expire)
Insert (append) a new unique and volatile entry under a given name.
Definition: kb.h:557
static char * kb_nvt_get(kb_t kb, const char *oid, enum kb_nvt_pos position)
Get field of a NVT.
Definition: kb.h:609
void kb_item_free(struct kb_item *)
Release a KB item (or a list).
Definition: kb.c:639
static int kb_save(kb_t kb)
Save all the KB's content.
Definition: kb.h:671
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_add_str_unique_volatile(kb_t kb, const char *name, const char *str, int expire, size_t len, int pos)
Insert (append) a new unique and volatile entry under a given name.
Definition: kb.h:484
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:521
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:691
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:372
const struct kb_operations * KBDefaultOperations
Default KB operations. No selection mechanism is provided yet since there's only one implementation (...
Definition: kb.c:1877
kb_item_type
Possible type of a kb_item.
Definition: kb.h:33
@ KB_TYPE_INT
Definition: kb.h:35
@ KB_TYPE_CNT
Definition: kb.h:38
@ KB_TYPE_UNSPEC
Definition: kb.h:34
@ KB_TYPE_STR
Definition: kb.h:36
static int kb_flush(kb_t kb, const char *except)
Flush all the KB's content. Delete all namespaces.
Definition: kb.h:711
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:355
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:538
static char * kb_item_get_str(kb_t kb, const char *name)
Get a single KB string item.
Definition: kb.h:322
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
static int kb_get_kb_index(kb_t kb)
Return the kb index.
Definition: kb.h:730
Knowledge base item (defined by name, type (int/char*) and value). Implemented as a singly linked lis...
Definition: kb.h:69
char name[]
Definition: kb.h:82
int v_int
Definition: kb.h:75
enum kb_item_type type
Definition: kb.h:70
char * v_str
Definition: kb.h:74
struct kb_item * next
Definition: kb.h:79
size_t len
Definition: kb.h:78
size_t namelen
Definition: kb.h:81
KB interface. Functions provided by an implementation. All functions have to be provided,...
Definition: kb.h:107
struct kb_item *(* kb_get_single)(kb_t, const char *, enum kb_item_type)
Definition: kb.h:118
int(* kb_set_int)(kb_t, const char *, int)
Definition: kb.h:202
int(* kb_flush)(kb_t, const char *)
Definition: kb.h:217
int(* kb_get_int)(kb_t, const char *)
Definition: kb.h:126
int(* kb_add_str)(kb_t, const char *, const char *, size_t)
Definition: kb.h:166
nvti_t *(* kb_get_nvt_all)(kb_t, const char *)
Definition: kb.h:134
int(* kb_add_str_unique_volatile)(kb_t, const char *, const char *, int, size_t, int)
Definition: kb.h:176
char *(* kb_get_nvt)(kb_t, const char *, enum kb_nvt_pos)
Definition: kb.h:130
GSList *(* kb_get_nvt_oids)(kb_t)
Definition: kb.h:138
int(* kb_add_nvt)(kb_t, const nvti_t *, const char *)
Definition: kb.h:207
struct kb_item *(* kb_get_pattern)(kb_t, const char *)
Definition: kb.h:156
int(* kb_lnk_reset)(kb_t)
Definition: kb.h:216
int(* kb_new)(kb_t *, const char *)
Definition: kb.h:109
int(* kb_push_str)(kb_t, const char *, const char *)
Definition: kb.h:142
int(* kb_delete)(kb_t)
Definition: kb.h:110
char *(* kb_get_str)(kb_t, const char *)
Definition: kb.h:122
size_t(* kb_count)(kb_t, const char *)
Definition: kb.h:161
char *(* kb_pop_str)(kb_t, const char *)
Definition: kb.h:146
int(* kb_add_int_unique)(kb_t, const char *, int)
Definition: kb.h:192
int(* kb_add_str_unique)(kb_t, const char *, const char *, size_t, int)
Definition: kb.h:171
int(* kb_get_kb_index)(kb_t)
Definition: kb.h:218
int(* kb_add_int)(kb_t, const char *, int)
Definition: kb.h:187
kb_t(* kb_direct_conn)(const char *, const int)
Definition: kb.h:112
int(* kb_save)(kb_t)
Definition: kb.h:215
kb_t(* kb_find)(const char *, const char *)
Definition: kb.h:111
int(* kb_set_str)(kb_t, const char *, const char *, size_t)
Definition: kb.h:182
int(* kb_del_items)(kb_t, const char *)
Definition: kb.h:212
int(* kb_add_int_unique_volatile)(kb_t, const char *, int, int)
Definition: kb.h:197
struct kb_item *(* kb_get_all)(kb_t, const char *)
Definition: kb.h:151
Top-level KB. This is to be inherited by KB implementations.
Definition: kb.h:91
const struct kb_operations * kb_ops
Definition: kb.h:92
The structure of a information record that corresponds to a NVT.
Definition: nvti.c:394