Greenbone Vulnerability Management Libraries  11.0.1
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 #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 
83 struct kb_item
84 {
85  enum kb_item_type type;
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 
100 struct kb_operations;
101 
105 struct kb
106 {
107  const struct kb_operations *kb_ops;
108 };
109 
113 typedef 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);
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);
220  int (*kb_lnk_reset) (kb_t);
221  int (*kb_flush) (kb_t, const char *);
223 };
224 
230 extern const struct kb_operations *KBDefaultOperations;
231 
235 void
236 kb_item_free (struct kb_item *);
237 
244 static inline int
245 kb_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 
262 static inline kb_t
263 kb_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 
277 static inline kb_t
278 kb_find (const char *kb_path, const char *key)
279 {
280  assert (KBDefaultOperations);
281  assert (KBDefaultOperations->kb_find);
282 
283  return KBDefaultOperations->kb_find (kb_path, key);
284 }
285 
291 static 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 
309 static 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 
326 static inline char *
327 kb_item_get_str (kb_t kb, const char *name)
328 {
329  assert (kb);
330  assert (kb->kb_ops);
331  assert (kb->kb_ops->kb_get_str);
332 
333  return kb->kb_ops->kb_get_str (kb, name);
334 }
335 
343 static inline int
344 kb_item_get_int (kb_t kb, const char *name)
345 {
346  assert (kb);
347  assert (kb->kb_ops);
348  assert (kb->kb_ops->kb_get_int);
349 
350  return kb->kb_ops->kb_get_int (kb, name);
351 }
352 
360 static inline struct kb_item *
361 kb_item_get_all (kb_t kb, const char *name)
362 {
363  assert (kb);
364  assert (kb->kb_ops);
365  assert (kb->kb_ops->kb_get_all);
366 
367  return kb->kb_ops->kb_get_all (kb, name);
368 }
369 
377 static inline struct kb_item *
378 kb_item_get_pattern (kb_t kb, const char *pattern)
379 {
380  assert (kb);
381  assert (kb->kb_ops);
382  assert (kb->kb_ops->kb_get_pattern);
383 
384  return kb->kb_ops->kb_get_pattern (kb, pattern);
385 }
386 
394 static inline int
395 kb_item_push_str (kb_t kb, const char *name, const char *value)
396 {
397  assert (kb);
398  assert (kb->kb_ops);
399  assert (kb->kb_ops->kb_push_str);
400 
401  return kb->kb_ops->kb_push_str (kb, name, value);
402 }
403 
411 static inline char *
412 kb_item_pop_str (kb_t kb, const char *name)
413 {
414  assert (kb);
415  assert (kb->kb_ops);
416  assert (kb->kb_ops->kb_pop_str);
417 
418  return kb->kb_ops->kb_pop_str (kb, name);
419 }
420 
429 static inline size_t
430 kb_item_count (kb_t kb, const char *pattern)
431 {
432  assert (kb);
433  assert (kb->kb_ops);
434  assert (kb->kb_ops->kb_count);
435 
436  return kb->kb_ops->kb_count (kb, pattern);
437 }
438 
447 static inline int
448 kb_item_add_str (kb_t kb, const char *name, const char *str, size_t len)
449 {
450  assert (kb);
451  assert (kb->kb_ops);
452  assert (kb->kb_ops->kb_add_str);
453 
454  return kb->kb_ops->kb_add_str (kb, name, str, len);
455 }
456 
465 static inline int
466 kb_item_add_str_unique (kb_t kb, const char *name, const char *str, size_t len)
467 {
468  assert (kb);
469  assert (kb->kb_ops);
470  assert (kb->kb_ops->kb_add_str_unique);
471 
472  return kb->kb_ops->kb_add_str_unique (kb, name, str, len);
473 }
474 
483 static inline int
484 kb_item_set_str (kb_t kb, const char *name, const char *str, size_t len)
485 {
486  assert (kb);
487  assert (kb->kb_ops);
488  assert (kb->kb_ops->kb_set_str);
489 
490  return kb->kb_ops->kb_set_str (kb, name, str, len);
491 }
492 
500 static inline int
501 kb_item_add_int (kb_t kb, const char *name, int val)
502 {
503  assert (kb);
504  assert (kb->kb_ops);
505  assert (kb->kb_ops->kb_add_int);
506 
507  return kb->kb_ops->kb_add_int (kb, name, val);
508 }
509 
517 static inline int
518 kb_item_add_int_unique (kb_t kb, const char *name, int val)
519 {
520  assert (kb);
521  assert (kb->kb_ops);
522  assert (kb->kb_ops->kb_add_int_unique);
523 
524  return kb->kb_ops->kb_add_int_unique (kb, name, val);
525 }
526 
534 static inline int
535 kb_item_set_int (kb_t kb, const char *name, int val)
536 {
537  assert (kb);
538  assert (kb->kb_ops);
539  assert (kb->kb_ops->kb_set_int);
540 
541  return kb->kb_ops->kb_set_int (kb, name, val);
542 }
543 
551 static inline int
552 kb_nvt_add (kb_t kb, const nvti_t *nvt, const char *filename)
553 {
554  assert (kb);
555  assert (kb->kb_ops);
556  assert (kb->kb_ops->kb_add_nvt);
557 
558  return kb->kb_ops->kb_add_nvt (kb, nvt, filename);
559 }
560 
568 static inline char *
569 kb_nvt_get (kb_t kb, const char *oid, enum kb_nvt_pos position)
570 {
571  assert (kb);
572  assert (kb->kb_ops);
573  assert (kb->kb_ops->kb_get_nvt);
574 
575  return kb->kb_ops->kb_get_nvt (kb, oid, position);
576 }
577 
584 static inline nvti_t *
585 kb_nvt_get_all (kb_t kb, const char *oid)
586 {
587  assert (kb);
588  assert (kb->kb_ops);
589  assert (kb->kb_ops->kb_get_nvt_all);
590 
591  return kb->kb_ops->kb_get_nvt_all (kb, oid);
592 }
593 
599 static inline GSList *
601 {
602  assert (kb);
603  assert (kb->kb_ops);
604  assert (kb->kb_ops->kb_get_nvt_oids);
605 
606  return kb->kb_ops->kb_get_nvt_oids (kb);
607 }
608 
615 static inline int
616 kb_del_items (kb_t kb, const char *name)
617 {
618  assert (kb);
619  assert (kb->kb_ops);
620  assert (kb->kb_ops->kb_del_items);
621 
622  return kb->kb_ops->kb_del_items (kb, name);
623 }
624 
630 static inline int
632 {
633  int rc = 0;
634 
635  assert (kb);
636  assert (kb->kb_ops);
637 
638  if (kb->kb_ops->kb_save != NULL)
639  rc = kb->kb_ops->kb_save (kb);
640 
641  return rc;
642 }
643 
650 static inline int
652 {
653  int rc = 0;
654 
655  assert (kb);
656  assert (kb->kb_ops);
657 
658  if (kb->kb_ops->kb_lnk_reset != NULL)
659  rc = kb->kb_ops->kb_lnk_reset (kb);
660 
661  return rc;
662 }
663 
670 static inline int
671 kb_flush (kb_t kb, const char *except)
672 {
673  int rc = 0;
674 
675  assert (kb);
676  assert (kb->kb_ops);
677 
678  if (kb->kb_ops->kb_flush != NULL)
679  rc = kb->kb_ops->kb_flush (kb, except);
680 
681  return rc;
682 }
683 
689 static inline int
691 {
692  assert (kb);
693  assert (kb->kb_ops);
694  assert (kb->kb_ops->kb_get_kb_index);
695 
696  return kb->kb_ops->kb_get_kb_index (kb);
697 }
698 
699 #endif
NVT_EXCLUDED_KEYS_POS
@ NVT_EXCLUDED_KEYS_POS
Definition: kb.h:63
NVT_BIDS_POS
@ NVT_BIDS_POS
Definition: kb.h:69
kb_operations::kb_get_single
struct kb_item *(* kb_get_single)(kb_t, const char *, enum kb_item_type)
Definition: kb.h:133
kb_item_push_str
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:395
kb_get_kb_index
static int kb_get_kb_index(kb_t kb)
Return the kb index.
Definition: kb.h:690
kb_find
static kb_t kb_find(const char *kb_path, const char *key)
Find an existing Knowledge Base object with key.
Definition: kb.h:278
kb_item_get_str
static char * kb_item_get_str(kb_t kb, const char *name)
Get a single KB string item.
Definition: kb.h:327
kb_operations::kb_lnk_reset
int(* kb_lnk_reset)(kb_t)
Definition: kb.h:220
kb_operations::kb_direct_conn
kb_t(* kb_direct_conn)(const char *, const int)
Definition: kb.h:127
NVT_NAME_POS
@ NVT_NAME_POS
Definition: kb.h:74
kb_direct_conn
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
kb_operations
KB interface. Functions provided by an implementation. All functions have to be provided,...
Definition: kb.h:122
kb_lnk_reset
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:651
kb_operations::kb_save
int(* kb_save)(kb_t)
Definition: kb.h:219
kb_operations::kb_get_kb_index
int(* kb_get_kb_index)(kb_t)
Definition: kb.h:222
kb_item::name
char name[0]
Definition: kb.h:97
kb_item_free
void kb_item_free(struct kb_item *)
Release a KB item (or a list).
Definition: kb.c:537
kb_save
static int kb_save(kb_t kb)
Save all the KB's content.
Definition: kb.h:631
kb_item::len
size_t len
Definition: kb.h:93
kb_item_get_single
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
kb_nvt_get_all
static nvti_t * kb_nvt_get_all(kb_t kb, const char *oid)
Get a full NVT.
Definition: kb.h:585
kb_operations::kb_add_int_unique
int(* kb_add_int_unique)(kb_t, const char *, int)
Definition: kb.h:201
kb_operations::kb_find
kb_t(* kb_find)(const char *, const char *)
Definition: kb.h:126
NVT_FILENAME_POS
@ NVT_FILENAME_POS
Definition: kb.h:60
kb_operations::kb_set_int
int(* kb_set_int)(kb_t, const char *, int)
Definition: kb.h:206
kb_operations::kb_flush
int(* kb_flush)(kb_t, const char *)
Definition: kb.h:221
kb_item_add_str_unique
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:466
NVT_TIMEOUT_POS
@ NVT_TIMEOUT_POS
Definition: kb.h:72
kb_nvt_get_oids
static GSList * kb_nvt_get_oids(kb_t kb)
Get list of NVT OIDs.
Definition: kb.h:600
kb_operations::kb_del_items
int(* kb_del_items)(kb_t, const char *)
Definition: kb.h:216
kb_item
Knowledge base item (defined by name, type (int/char*) and value). Implemented as a singly linked lis...
Definition: kb.h:84
kb_operations::kb_get_nvt_all
nvti_t *(* kb_get_nvt_all)(kb_t, const char *)
Definition: kb.h:149
kb_item_get_int
static int kb_item_get_int(kb_t kb, const char *name)
Get a single KB integer item.
Definition: kb.h:344
kb_operations::kb_add_int
int(* kb_add_int)(kb_t, const char *, int)
Definition: kb.h:196
kb_item_add_int_unique
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:518
nvti
The structure of a information record that corresponds to a NVT.
Definition: nvti.c:268
NVT_REQUIRED_UDP_PORTS_POS
@ NVT_REQUIRED_UDP_PORTS_POS
Definition: kb.h:64
kb_item_set_str
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:484
kb_item_add_str
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:448
kb_operations::kb_get_str
char *(* kb_get_str)(kb_t, const char *)
Definition: kb.h:137
NVT_TIMESTAMP_POS
@ NVT_TIMESTAMP_POS
Definition: kb.h:75
kb_item::v_int
int v_int
Definition: kb.h:90
kb_item::v_str
char * v_str
Definition: kb.h:89
NVT_OID_POS
@ NVT_OID_POS
Definition: kb.h:76
KB_TYPE_CNT
@ KB_TYPE_CNT
Definition: kb.h:52
kb_operations::kb_get_int
int(* kb_get_int)(kb_t, const char *)
Definition: kb.h:141
NVT_XREFS_POS
@ NVT_XREFS_POS
Definition: kb.h:70
kb_operations::kb_add_nvt
int(* kb_add_nvt)(kb_t, const nvti_t *, const char *)
Definition: kb.h:211
NVT_CATEGORY_POS
@ NVT_CATEGORY_POS
Definition: kb.h:71
NVT_DEPENDENCIES_POS
@ NVT_DEPENDENCIES_POS
Definition: kb.h:66
kb_operations::kb_pop_str
char *(* kb_pop_str)(kb_t, const char *)
Definition: kb.h:161
kb::kb_ops
const struct kb_operations * kb_ops
Definition: kb.h:107
KB_TYPE_STR
@ KB_TYPE_STR
Definition: kb.h:50
kb_item::next
struct kb_item * next
Definition: kb.h:94
kb_operations::kb_delete
int(* kb_delete)(kb_t)
Definition: kb.h:125
NVT_FAMILY_POS
@ NVT_FAMILY_POS
Definition: kb.h:73
kb_item_get_pattern
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:378
kb_flush
static int kb_flush(kb_t kb, const char *except)
Flush all the KB's content. Delete all namespaces.
Definition: kb.h:671
kb_operations::kb_get_all
struct kb_item *(* kb_get_all)(kb_t, const char *)
Definition: kb.h:166
kb_operations::kb_get_nvt_oids
GSList *(* kb_get_nvt_oids)(kb_t)
Definition: kb.h:153
kb
Top-level KB. This is to be inherited by KB implementations.
Definition: kb.h:106
kb_operations::kb_set_str
int(* kb_set_str)(kb_t, const char *, const char *, size_t)
Definition: kb.h:191
kb_del_items
static int kb_del_items(kb_t kb, const char *name)
Delete all entries under a given name.
Definition: kb.h:616
KBDefaultOperations
const struct kb_operations * KBDefaultOperations
Default KB operations. No selection mechanism is provided yet since there's only one implementation (...
Definition: kb.c:1614
kb_item_get_all
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:361
NVT_CVES_POS
@ NVT_CVES_POS
Definition: kb.h:68
kb_item_pop_str
static char * kb_item_pop_str(kb_t kb, const char *name)
Pop a single KB string item.
Definition: kb.h:412
NVT_MANDATORY_KEYS_POS
@ NVT_MANDATORY_KEYS_POS
Definition: kb.h:62
kb_operations::kb_push_str
int(* kb_push_str)(kb_t, const char *, const char *)
Definition: kb.h:157
kb_operations::kb_add_str_unique
int(* kb_add_str_unique)(kb_t, const char *, const char *, size_t)
Definition: kb.h:186
kb_item_type
kb_item_type
Possible type of a kb_item.
Definition: kb.h:47
kb_operations::kb_new
int(* kb_new)(kb_t *, const char *)
Definition: kb.h:124
kb_delete
static int kb_delete(kb_t kb)
Delete all entries and release ownership on the namespace.
Definition: kb.h:292
kb_nvt_add
static int kb_nvt_add(kb_t kb, const nvti_t *nvt, const char *filename)
Insert a new nvt.
Definition: kb.h:552
kb_item::namelen
size_t namelen
Definition: kb.h:96
kb_item_count
static size_t kb_item_count(kb_t kb, const char *pattern)
Count all items stored under a given pattern.
Definition: kb.h:430
NVT_REQUIRED_KEYS_POS
@ NVT_REQUIRED_KEYS_POS
Definition: kb.h:61
kb_operations::kb_get_pattern
struct kb_item *(* kb_get_pattern)(kb_t, const char *)
Definition: kb.h:171
kb_new
static int kb_new(kb_t *kb, const char *kb_path)
Initialize a new Knowledge Base object.
Definition: kb.h:245
kb_operations::kb_get_nvt
char *(* kb_get_nvt)(kb_t, const char *, enum kb_nvt_pos)
Definition: kb.h:145
NVT_TAGS_POS
@ NVT_TAGS_POS
Definition: kb.h:67
KB_TYPE_UNSPEC
@ KB_TYPE_UNSPEC
Definition: kb.h:48
kb_nvt_get
static char * kb_nvt_get(kb_t kb, const char *oid, enum kb_nvt_pos position)
Get field of a NVT.
Definition: kb.h:569
KB_TYPE_INT
@ KB_TYPE_INT
Definition: kb.h:49
kb_t
struct kb * kb_t
type abstraction to hide KB internals.
Definition: kb.h:113
NVT_REQUIRED_PORTS_POS
@ NVT_REQUIRED_PORTS_POS
Definition: kb.h:65
kb_item_set_int
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:535
kb_operations::kb_add_str
int(* kb_add_str)(kb_t, const char *, const char *, size_t)
Definition: kb.h:181
kb_nvt_pos
kb_nvt_pos
Possible positions of nvt values in cache list.
Definition: kb.h:59
kb_item::type
enum kb_item_type type
Definition: kb.h:85
kb_operations::kb_count
size_t(* kb_count)(kb_t, const char *)
Definition: kb.h:176
kb_item_add_int
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:501