aboutsummaryrefslogtreecommitdiff
path: root/src/lib/encoding/confline.h
blob: 3d9ae8a6629c671d6f491f88060db5c5bf8b3bf2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* Copyright (c) 2001 Matej Pfajfar.
 * Copyright (c) 2001-2004, Roger Dingledine.
 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
 * Copyright (c) 2007-2019, The Tor Project, Inc. */
/* See LICENSE for licensing information */

/**
 * \file confline.h
 *
 * \brief Header for confline.c
 **/

#ifndef TOR_CONFLINE_H
#define TOR_CONFLINE_H

struct smartlist_t;

/** Ordinary configuration line. */
#define CONFIG_LINE_NORMAL 0
/** Appends to previous configuration for the same option, even if we
 * would ordinary replace it. */
#define CONFIG_LINE_APPEND 1
/* Removes all previous configuration for an option. */
#define CONFIG_LINE_CLEAR 2

#define MAX_INCLUDE_RECURSION_LEVEL 31

/** A linked list of lines in a config file, or elsewhere */
typedef struct config_line_t {
  char *key;
  char *value;
  struct config_line_t *next;

  /** What special treatment (if any) does this line require? */
  unsigned int command:2;
  /** If true, subsequent assignments to this linelist should replace
   * it, not extend it.  Set only on the first item in a linelist in an
   * or_options_t. */
  unsigned int fragile:1;
} config_line_t;

void config_line_append(config_line_t **lst,
                        const char *key, const char *val);
void config_line_prepend(config_line_t **lst,
                         const char *key, const char *val);
config_line_t *config_lines_dup(const config_line_t *inp);
config_line_t *config_lines_dup_and_filter(const config_line_t *inp,
                                           const char *key);
const config_line_t *config_line_find(const config_line_t *lines,
                                      const char *key);
int config_lines_eq(config_line_t *a, config_line_t *b);
int config_count_key(const config_line_t *a, const char *key);
void config_free_lines_(config_line_t *front);
#define config_free_lines(front) \
  do {                           \
    config_free_lines_(front);   \
    (front) = NULL;              \
  } while (0)
const char *parse_config_line_from_str_verbose(const char *line,
                                       char **key_out, char **value_out,
                                       const char **err_out);

int config_get_lines(const char *string, struct config_line_t **result,
                     int extended);

typedef int (*include_handler_fn)(const char *, int, int,
                                  struct config_line_t **,
                                  struct config_line_t **,
                                  struct smartlist_t *);

int config_get_lines_aux(const char *string, struct config_line_t **result,
                         int extended,
                         int allow_include, int *has_include,
                         struct smartlist_t *opened_lst, int recursion_level,
                         config_line_t **last,
                         include_handler_fn handle_include);

#endif /* !defined(TOR_CONFLINE_H) */