Greenbone Vulnerability Management Libraries 21.4.3
kb.h
Go to the documentation of this file.
1/* Copyright (C) 2014-2021 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#ifdef REDIS_SOCKET_PATH
38#define KB_PATH_DEFAULT REDIS_SOCKET_PATH
39#else
40#define KB_PATH_DEFAULT "/run/redis/redis.sock"
41#endif
42
47{
51 /* -- */
53};
54
59{
77};
78
83struct kb_item
84{
87 union
88 {
89 char *v_str;
90 int v_int;
91 };
93 size_t len;
94 struct kb_item *next;
96 size_t namelen;
97 char name[0];
98};
99
100struct kb_operations;
101
105struct kb
106{
107 const struct kb_operations *kb_ops;
108};
109
113typedef struct kb *kb_t;
114
122{
123 /* ctor/dtor */
124 int (*kb_new) (kb_t *, const char *);
125 int (*kb_delete) (kb_t);
126 kb_t (*kb_find) (const char *, const char *);
127 kb_t (*kb_direct_conn) (const char *, const int);
129 /* Actual kb operations */
133 struct kb_item *(*kb_get_single) (kb_t, const char *, enum kb_item_type);
137 char *(*kb_get_str) (kb_t, const char *);
141 int (*kb_get_int) (kb_t, const char *);
145 char *(*kb_get_nvt) (kb_t, const char *, enum kb_nvt_pos);
149 nvti_t *(*kb_get_nvt_all) (kb_t, const char *);
153 GSList *(*kb_get_nvt_oids) (kb_t);
157 int (*kb_push_str) (kb_t, const char *, const char *);
161 char *(*kb_pop_str) (kb_t, const char *);
166 struct kb_item *(*kb_get_all) (kb_t, const char *);
171 struct kb_item *(*kb_get_pattern) (kb_t, const char *);
176 size_t (*kb_count) (kb_t, const char *);
181 int (*kb_add_str) (kb_t, const char *, const char *, size_t);
186 int (*kb_add_str_unique) (kb_t, const char *, const char *, size_t, int);
191 int (*kb_set_str) (kb_t, const char *, const char *, size_t);
196 int (*kb_add_int) (kb_t, const char *, int);
201 int (*kb_add_int_unique) (kb_t, const char *, int);
206 int (*kb_set_int) (kb_t, const char *, int);
211 int (*kb_add_nvt) (kb_t, const nvti_t *, const char *);
216 int (*kb_del_items) (kb_t, const char *);
217
218 /* Utils */
219 int (*kb_save) (kb_t);
221 int (*kb_flush) (kb_t, const char *);
223};
224
230extern const struct kb_operations *KBDefaultOperations;
231
235void
236kb_item_free (struct kb_item *);
237
244static inline int
245kb_new (kb_t *kb, const char *kb_path)
246{
247 assert (kb);
248 assert (KBDefaultOperations);
249 assert (KBDefaultOperations->kb_new);
250
251 *kb = NULL;
252
253 return KBDefaultOperations->kb_new (kb, kb_path);
254}
255
262static inline kb_t
263kb_direct_conn (const char *kb_path, const int kb_index)
264{
265 assert (KBDefaultOperations);
267
268 return KBDefaultOperations->kb_direct_conn (kb_path, kb_index);
269}
270
277static inline kb_t
278kb_find (const char *kb_path, const char *key)
279{
280 assert (KBDefaultOperations);
282
283 return KBDefaultOperations->kb_find (kb_path, key);
284}
285
291static inline int
293{
294 assert (kb);
295 assert (kb->kb_ops);
296 assert (kb->kb_ops->kb_delete);
297
298 return kb->kb_ops->kb_delete (kb);
299}
300
309static inline struct kb_item *
311{
312 assert (kb);
313 assert (kb->kb_ops);
314 assert (kb->kb_ops->kb_get_single);
315
316 return kb->kb_ops->kb_get_single (kb, name, type);
317}
318
325static inline char *
327{
328 assert (kb);
329 assert (kb->kb_ops);
330 assert (kb->kb_ops->kb_get_str);
331
332 return kb->kb_ops->kb_get_str (kb, name);
333}
334
341static inline int
343{
344 assert (kb);
345 assert (kb->kb_ops);
346 assert (kb->kb_ops->kb_get_int);
347
348 return kb->kb_ops->kb_get_int (kb, name);
349}
350
358static inline struct kb_item *
360{
361 assert (kb);
362 assert (kb->kb_ops);
363 assert (kb->kb_ops->kb_get_all);
364
365 return kb->kb_ops->kb_get_all (kb, name);
366}
367
375static inline struct kb_item *
376kb_item_get_pattern (kb_t kb, const char *pattern)
377{
378 assert (kb);
379 assert (kb->kb_ops);
380 assert (kb->kb_ops->kb_get_pattern);
381
382 return kb->kb_ops->kb_get_pattern (kb, pattern);
383}
384
392static inline int
393kb_item_push_str (kb_t kb, const char *name, const char *value)
394{
395 assert (kb);
396 assert (kb->kb_ops);
397 assert (kb->kb_ops->kb_push_str);
398
399 return kb->kb_ops->kb_push_str (kb, name, value);
400}
401
409static inline char *
411{
412 assert (kb);
413 assert (kb->kb_ops);
414 assert (kb->kb_ops->kb_pop_str);
415
416 return kb->kb_ops->kb_pop_str (kb, name);
417}
418
427static inline size_t
428kb_item_count (kb_t kb, const char *pattern)
429{
430 assert (kb);
431 assert (kb->kb_ops);
432 assert (kb->kb_ops->kb_count);
433
434 return kb->kb_ops->kb_count (kb, pattern);
435}
436
445static inline int
446kb_item_add_str (kb_t kb, const char *name, const char *str, size_t len)
447{
448 assert (kb);
449 assert (kb->kb_ops);
450 assert (kb->kb_ops->kb_add_str);
451
452 return kb->kb_ops->kb_add_str (kb, name, str, len);
453}
454
465static inline int
466kb_item_add_str_unique (kb_t kb, const char *name, const char *str, size_t len,
467 int pos)
468{
469 assert (kb);
470 assert (kb->kb_ops);
471 assert (kb->kb_ops->kb_add_str_unique);
472
473 return kb->kb_ops->kb_add_str_unique (kb, name, str, len, pos);
474}
475
484static inline int
485kb_item_set_str (kb_t kb, const char *name, const char *str, size_t len)
486{
487 assert (kb);
488 assert (kb->kb_ops);
489 assert (kb->kb_ops->kb_set_str);
490
491 return kb->kb_ops->kb_set_str (kb, name, str, len);
492}
493
501static inline int
502kb_item_add_int (kb_t kb, const char *name, int val)
503{
504 assert (kb);
505 assert (kb->kb_ops);
506 assert (kb->kb_ops->kb_add_int);
507
508 return kb->kb_ops->kb_add_int (kb, name, val);
509}
510
518static inline int
519kb_item_add_int_unique (kb_t kb, const char *name, int val)
520{
521 assert (kb);
522 assert (kb->kb_ops);
523 assert (kb->kb_ops->kb_add_int_unique);
524
525 return kb->kb_ops->kb_add_int_unique (kb, name, val);
526}
527
535static inline int
536kb_item_set_int (kb_t kb, const char *name, int val)
537{
538 assert (kb);
539 assert (kb->kb_ops);
540 assert (kb->kb_ops->kb_set_int);
541
542 return kb->kb_ops->kb_set_int (kb, name, val);
543}
544
552static inline int
553kb_nvt_add (kb_t kb, const nvti_t *nvt, const char *filename)
554{
555 assert (kb);
556 assert (kb->kb_ops);
557 assert (kb->kb_ops->kb_add_nvt);
558
559 return kb->kb_ops->kb_add_nvt (kb, nvt, filename);
560}
561
569static inline char *
570kb_nvt_get (kb_t kb, const char *oid, enum kb_nvt_pos position)
571{
572 assert (kb);
573 assert (kb->kb_ops);
574 assert (kb->kb_ops->kb_get_nvt);
575
576 return kb->kb_ops->kb_get_nvt (kb, oid, position);
577}
578
585static inline nvti_t *
586kb_nvt_get_all (kb_t kb, const char *oid)
587{
588 assert (kb);
589 assert (kb->kb_ops);
590 assert (kb->kb_ops->kb_get_nvt_all);
591
592 return kb->kb_ops->kb_get_nvt_all (kb, oid);
593}
594
600static inline GSList *
602{
603 assert (kb);
604 assert (kb->kb_ops);
605 assert (kb->kb_ops->kb_get_nvt_oids);
606
607 return kb->kb_ops->kb_get_nvt_oids (kb);
608}
609
616static inline int
617kb_del_items (kb_t kb, const char *name)
618{
619 assert (kb);
620 assert (kb->kb_ops);
621 assert (kb->kb_ops->kb_del_items);
622
623 return kb->kb_ops->kb_del_items (kb, name);
624}
625
631static inline int
633{
634 int rc = 0;
635
636 assert (kb);
637 assert (kb->kb_ops);
638
639 if (kb->kb_ops->kb_save != NULL)
640 rc = kb->kb_ops->kb_save (kb);
641
642 return rc;
643}
644
651static inline int
653{
654 int rc = 0;
655
656 assert (kb);
657 assert (kb->kb_ops);
658
659 if (kb->kb_ops->kb_lnk_reset != NULL)
660 rc = kb->kb_ops->kb_lnk_reset (kb);
661
662 return rc;
663}
664
671static inline int
672kb_flush (kb_t kb, const char *except)
673{
674 int rc = 0;
675
676 assert (kb);
677 assert (kb->kb_ops);
678
679 if (kb->kb_ops->kb_flush != NULL)
680 rc = kb->kb_ops->kb_flush (kb, except);
681
682 return rc;
683}
684
690static inline int
692{
693 assert (kb);
694 assert (kb->kb_ops);
695 assert (kb->kb_ops->kb_get_kb_index);
696
697 return kb->kb_ops->kb_get_kb_index (kb);
698}
699
700#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:536
static int kb_del_items(kb_t kb, const char *name)
Delete all entries under a given name.
Definition: kb.h:617
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:466
static int kb_nvt_add(kb_t kb, const nvti_t *nvt, const char *filename)
Insert a new nvt.
Definition: kb.h:553
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:446
kb_nvt_pos
Possible positions of nvt values in cache list.
Definition: kb.h:59
@ NVT_FAMILY_POS
Definition: kb.h:73
@ NVT_CATEGORY_POS
Definition: kb.h:71
@ NVT_TIMESTAMP_POS
Definition: kb.h:75
@ NVT_NAME_POS
Definition: kb.h:74
@ NVT_TAGS_POS
Definition: kb.h:67
@ NVT_BIDS_POS
Definition: kb.h:69
@ NVT_TIMEOUT_POS
Definition: kb.h:72
@ NVT_EXCLUDED_KEYS_POS
Definition: kb.h:63
@ NVT_REQUIRED_PORTS_POS
Definition: kb.h:65
@ NVT_REQUIRED_UDP_PORTS_POS
Definition: kb.h:64
@ NVT_FILENAME_POS
Definition: kb.h:60
@ NVT_OID_POS
Definition: kb.h:76
@ NVT_DEPENDENCIES_POS
Definition: kb.h:66
@ NVT_CVES_POS
Definition: kb.h:68
@ NVT_REQUIRED_KEYS_POS
Definition: kb.h:61
@ NVT_XREFS_POS
Definition: kb.h:70
@ NVT_MANDATORY_KEYS_POS
Definition: kb.h:62
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:393
static int kb_new(kb_t *kb, const char *kb_path)
Initialize a new Knowledge Base object.
Definition: kb.h:245
static size_t kb_item_count(kb_t kb, const char *pattern)
Count all items stored under a given pattern.
Definition: kb.h:428
static int kb_delete(kb_t kb)
Delete all entries and release ownership on the namespace.
Definition: kb.h:292
static int kb_item_get_int(kb_t kb, const char *name)
Get a single KB integer item.
Definition: kb.h:342
struct kb * kb_t
type abstraction to hide KB internals.
Definition: kb.h:113
static nvti_t * kb_nvt_get_all(kb_t kb, const char *oid)
Get a full NVT.
Definition: kb.h:586
static kb_t kb_find(const char *kb_path, const char *key)
Find an existing Knowledge Base object with key.
Definition: kb.h:278
static GSList * kb_nvt_get_oids(kb_t kb)
Get list of NVT OIDs.
Definition: kb.h:601
static char * kb_item_pop_str(kb_t kb, const char *name)
Pop a single KB string item.
Definition: kb.h:410
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:485
static char * kb_nvt_get(kb_t kb, const char *oid, enum kb_nvt_pos position)
Get field of a NVT.
Definition: kb.h:570
void kb_item_free(struct kb_item *)
Release a KB item (or a list).
Definition: kb.c:584
static int kb_save(kb_t kb)
Save all the KB's content.
Definition: kb.h:632
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:310
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:502
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:652
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:376
const struct kb_operations * KBDefaultOperations
Default KB operations. No selection mechanism is provided yet since there's only one implementation (...
Definition: kb.c:1666
kb_item_type
Possible type of a kb_item.
Definition: kb.h:47
@ KB_TYPE_INT
Definition: kb.h:49
@ KB_TYPE_CNT
Definition: kb.h:52
@ KB_TYPE_UNSPEC
Definition: kb.h:48
@ KB_TYPE_STR
Definition: kb.h:50
static int kb_flush(kb_t kb, const char *except)
Flush all the KB's content. Delete all namespaces.
Definition: kb.h:672
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:359
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:519
static char * kb_item_get_str(kb_t kb, const char *name)
Get a single KB string item.
Definition: kb.h:326
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:263
static int kb_get_kb_index(kb_t kb)
Return the kb index.
Definition: kb.h:691
Knowledge base item (defined by name, type (int/char*) and value). Implemented as a singly linked lis...
Definition: kb.h:84
int v_int
Definition: kb.h:90
enum kb_item_type type
Definition: kb.h:85
char * v_str
Definition: kb.h:89
struct kb_item * next
Definition: kb.h:94
char name[0]
Definition: kb.h:97
size_t len
Definition: kb.h:93
size_t namelen
Definition: kb.h:96
KB interface. Functions provided by an implementation. All functions have to be provided,...
Definition: kb.h:122
struct kb_item *(* kb_get_single)(kb_t, const char *, enum kb_item_type)
Definition: kb.h:133
int(* kb_set_int)(kb_t, const char *, int)
Definition: kb.h:206
int(* kb_flush)(kb_t, const char *)
Definition: kb.h:221
int(* kb_get_int)(kb_t, const char *)
Definition: kb.h:141
int(* kb_add_str)(kb_t, const char *, const char *, size_t)
Definition: kb.h:181
nvti_t *(* kb_get_nvt_all)(kb_t, const char *)
Definition: kb.h:149
char *(* kb_get_nvt)(kb_t, const char *, enum kb_nvt_pos)
Definition: kb.h:145
GSList *(* kb_get_nvt_oids)(kb_t)
Definition: kb.h:153
int(* kb_add_nvt)(kb_t, const nvti_t *, const char *)
Definition: kb.h:211
struct kb_item *(* kb_get_pattern)(kb_t, const char *)
Definition: kb.h:171
int(* kb_lnk_reset)(kb_t)
Definition: kb.h:220
int(* kb_new)(kb_t *, const char *)
Definition: kb.h:124
int(* kb_push_str)(kb_t, const char *, const char *)
Definition: kb.h:157
int(* kb_delete)(kb_t)
Definition: kb.h:125
char *(* kb_get_str)(kb_t, const char *)
Definition: kb.h:137
size_t(* kb_count)(kb_t, const char *)
Definition: kb.h:176
char *(* kb_pop_str)(kb_t, const char *)
Definition: kb.h:161
int(* kb_add_int_unique)(kb_t, const char *, int)
Definition: kb.h:201
int(* kb_add_str_unique)(kb_t, const char *, const char *, size_t, int)
Definition: kb.h:186
int(* kb_get_kb_index)(kb_t)
Definition: kb.h:222
int(* kb_add_int)(kb_t, const char *, int)
Definition: kb.h:196
kb_t(* kb_direct_conn)(const char *, const int)
Definition: kb.h:127
int(* kb_save)(kb_t)
Definition: kb.h:219
kb_t(* kb_find)(const char *, const char *)
Definition: kb.h:126
int(* kb_set_str)(kb_t, const char *, const char *, size_t)
Definition: kb.h:191
int(* kb_del_items)(kb_t, const char *)
Definition: kb.h:216
struct kb_item *(* kb_get_all)(kb_t, const char *)
Definition: kb.h:166
Top-level KB. This is to be inherited by KB implementations.
Definition: kb.h:106
const struct kb_operations * kb_ops
Definition: kb.h:107
The structure of a information record that corresponds to a NVT.
Definition: nvti.c:405