File: parser.h

package info (click to toggle)
keepalived 1%3A2.3.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,928 kB
  • sloc: ansic: 68,122; sh: 1,868; makefile: 770; python: 35; xml: 13
file content (165 lines) | stat: -rw-r--r-- 5,999 bytes parent folder | download | duplicates (2)
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/*
 * Soft:        Keepalived is a failover program for the LVS project
 *              <www.linuxvirtualserver.org>. It monitor & manipulate
 *              a loadbalanced server pool using multi-layer checks.
 *
 * Part:        cfreader.c include file.
 *
 * Author:      Alexandre Cassen, <acassen@linux-vs.org>
 *
 *              This program is distributed in the hope that it will be useful,
 *              but WITHOUT ANY WARRANTY; without even the implied warranty of
 *              MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *              See the GNU General Public License for more details.
 *
 *              This program is free software; you can redistribute it and/or
 *              modify it under the terms of the GNU General Public License
 *              as published by the Free Software Foundation; either version
 *              2 of the License, or (at your option) any later version.
 *
 * Copyright (C) 2001-2017 Alexandre Cassen, <acassen@gmail.com>
 */

#ifndef _PARSER_H
#define _PARSER_H

/* system includes */
#include <sys/types.h>
#include <stdbool.h>
#include <stdint.h>
#include <string.h>

/* local includes */
#include "vector.h"
#include "memory.h"
#include "warnings.h"


/* Global definitions */

/* Maximum config line length */
#define MAXBUF	1024

/* Maximum time read_timer can read - in micro-seconds */
#define TIMER_MAXIMUM (ULONG_MAX - 1)

/* Special values for parameters when we want to know they haven't been set */
#define	TIME_T_PARAMETER_UNSET	LONG_MAX
#define	PARAMETER_UNSET		UINT_MAX

/* Configuration test errors. These should be in decreasing order of severity */
typedef enum {
	CONFIG_OK,

	/* The following mean keepalived cannot run the config */
	CONFIG_FILE_NOT_FOUND,
	CONFIG_BAD_IF,
	CONFIG_FATAL,

	/* The following are configuration errors, but keepalived will still run */
	CONFIG_MULTIPLE_FILES,
	CONFIG_UNKNOWN_KEYWORD,
	CONFIG_UNEXPECTED_BOB,	/* '{' */
	CONFIG_MISSING_BOB,	/* '{' */
	CONFIG_UNEXPECTED_EOB,	/* '}' */
	CONFIG_MISSING_EOB,	/* '}' */
	CONFIG_UNMATCHED_QUOTE,
	CONFIG_MISSING_PARAMETER,
	CONFIG_INVALID_NUMBER,
	CONFIG_GENERAL_ERROR,
	CONFIG_WARNING,
	CONFIG_DEPRECATED,

	/* The following is for script security not enabled when needed */
	CONFIG_SECURITY_ERROR,
} config_err_t;

/* keyword definition */
typedef void **vpp_t;
#define	VPP (vpp_t)
typedef struct _keyword {
	const char *string;
	void (*handler) (const vector_t *);
	vector_t *sub;
	void (*sub_close_handler) (void);
	bool active;
	bool allow_mismatched_quotes;
	vpp_t ptr;
	vpp_t sub_close_ptr;
} keyword_t;


/* global vars exported */
extern vector_t *keywords;
extern const char *config_id;
extern const char *WHITE_SPACE;

#ifdef _PARSER_DEBUG_
extern bool do_parser_debug;
#endif
#ifdef _DUMP_KEYWORDS_
extern bool do_dump_keywords;
#endif
#ifndef _ONE_PROCESS_DEBUG_
extern const char *config_save_dir;
#endif


static inline const char * __attribute__((malloc))
set_value_r(const vector_t *strvec)
{
	return STRDUP(strvec_slot(strvec, 1));
}

#ifdef _MEM_CHECK_
#define alloc_strvec(str, keyw)	(memcheck_log("alloc_strvec", str, (__FILE__), (__func__), (__LINE__)), \
				 alloc_strvec_r(str, keyw))

#define set_value(str)		(memcheck_log("set_value", strvec_slot(str,1), (__FILE__), (__func__), (__LINE__)), \
				 set_value_r(str))
#else
#define alloc_strvec(str, keyw)	(alloc_strvec_r(str, keyw))
#define set_value(str)		(set_value_r(str))
#endif

/* Prototypes */
extern void set_string(const char **, const vector_t *, const char *);
extern void report_config_error(config_err_t, const char *format, ...)
	__attribute__((format (printf, 2, 3)));
extern void use_disk_copy_for_config(const char *);
extern void clear_config_status(void);
extern config_err_t get_config_status(void) __attribute__ ((pure));
extern bool read_int(const char *, int *, int, int, bool);
extern bool read_unsigned(const char *, unsigned *, unsigned, unsigned, bool);
extern bool read_unsigned64(const char *, uint64_t *, uint64_t, uint64_t, bool);
extern bool read_decimal_unsigned(const char *, unsigned *, unsigned, unsigned, unsigned, bool);
extern bool read_int_strvec(const vector_t *, size_t, int *, int, int, bool);
extern bool read_unsigned_strvec(const vector_t *, size_t, unsigned *, unsigned, unsigned, bool);
extern bool read_unsigned64_strvec(const vector_t *, size_t, uint64_t *, uint64_t, uint64_t, bool);
extern bool read_unsigned_base_strvec(const vector_t *, size_t, int, unsigned *, unsigned, unsigned, bool);
extern bool read_decimal_unsigned_strvec(const vector_t *, size_t, unsigned *, unsigned, unsigned, unsigned, bool);
extern uint16_t read_hex_str(const char *, uint8_t **, uint8_t **);
extern void set_random_seed(unsigned int);
extern void install_keyword_root(const char *, void (*handler) (const vector_t *), bool, vpp_t);
extern vpp_t install_sublevel(vpp_t) WARN_UNUSED_RESULT;
extern void install_sublevel_end(vpp_t);
extern void install_level_end_handler(void (*handler) (void));
extern void install_keyword(const char *, void (*handler) (const vector_t *));
extern void install_keyword_quoted(const char *, void (*handler) (const vector_t *));
extern const vector_t *alloc_strvec_quoted_escaped(const char *);
extern const vector_t *alloc_strvec_quoted(const char *);
extern vector_t *alloc_strvec_r(const char *, const vector_t *);
extern bool check_conf_file(const char*);
extern const vector_t *read_value_block(const vector_t *);
extern void alloc_value_block(void (*alloc_func) (const vector_t *), const vector_t *);
extern bool read_timer(const vector_t *, size_t, unsigned long *, unsigned long, unsigned long, bool);
extern int check_true_false(const char *) __attribute__ ((pure));
extern void skip_block(bool);
extern void init_data(const char *, const vector_t * (*init_keywords) (void), bool);
extern int get_config_fd(void);
extern void set_config_fd(int);
void include_check_set(const vector_t *);
bool had_config_file_error(void) __attribute__((pure));
void separate_config_file(void);

#endif