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
|
/* $OpenBSD: ifstated.h,v 1.5 2007/10/25 06:03:31 pyr Exp $ */
/*
* Copyright (c) 2004 Ryan McBride
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/types.h>
#include <sys/queue.h>
struct ifsd_expression;
TAILQ_HEAD(ifsd_expression_list, ifsd_expression);
struct ifsd_ifstate {
TAILQ_ENTRY(ifsd_ifstate) entries;
struct ifsd_expression_list expressions;
int ifstate;
#define IFSD_LINKUNKNOWN 0 /* LINK_STATE_UNKNOWN */
#define IFSD_LINKDOWN 1 /* LINK_STATE_DOWN */
#define IFSD_LINKUP 2 /* LINK_STATE_UP */
int prevstate;
u_int32_t refcount;
u_short ifindex;
};
struct ifsd_external {
TAILQ_ENTRY(ifsd_external) entries;
struct event ev;
struct ifsd_expression_list expressions;
char *command;
int prevstatus;
u_int32_t frequency;
u_int32_t refcount;
u_int32_t lastexec;
pid_t pid;
};
struct ifsd_action;
TAILQ_HEAD(ifsd_action_list, ifsd_action);
struct ifsd_action {
TAILQ_ENTRY(ifsd_action) entries;
struct ifsd_action *parent;
union {
char *logmessage;
char *command;
struct ifsd_state *nextstate;
char *statename;
struct {
struct ifsd_action_list actions;
struct ifsd_expression *expression;
u_int8_t ignore_init;
} c;
} act;
u_int32_t type;
#define IFSD_ACTION_LOG 0
#define IFSD_ACTION_COMMAND 1
#define IFSD_ACTION_CHANGESTATE 2
#define IFSD_ACTION_CONDITION 3
};
struct ifsd_expression {
TAILQ_ENTRY(ifsd_expression) entries;
TAILQ_ENTRY(ifsd_expression) eval;
struct ifsd_expression *parent;
struct ifsd_action *action;
struct ifsd_expression *left;
struct ifsd_expression *right;
union {
struct ifsd_ifstate *ifstate;
struct ifsd_external *external;
} u;
int depth;
u_int32_t type;
#define IFSD_OPER_AND 1
#define IFSD_OPER_OR 2
#define IFSD_OPER_NOT 3
#define IFSD_OPER_EXTERNAL 4
#define IFSD_OPER_IFSTATE 5
u_int8_t truth;
};
TAILQ_HEAD(ifsd_ifstate_list, ifsd_ifstate);
TAILQ_HEAD(ifsd_external_list, ifsd_external);
struct ifsd_state {
struct event ev;
struct ifsd_ifstate_list interface_states;
struct ifsd_external_list external_tests;
TAILQ_ENTRY(ifsd_state) entries;
struct ifsd_action *init;
struct ifsd_action *always;
u_int32_t entered;
char *name;
};
TAILQ_HEAD(ifsd_state_list, ifsd_state);
struct ifsd_config {
struct ifsd_state always;
struct ifsd_state_list states;
struct ifsd_state *curstate;
struct ifsd_state *nextstate;
u_int32_t opts;
#define IFSD_OPT_VERBOSE 0x00000001
#define IFSD_OPT_VERBOSE2 0x00000002
#define IFSD_OPT_NOACTION 0x00000004
int maxdepth;
};
enum { IFSD_EVTIMER_ADD, IFSD_EVTIMER_DEL };
struct ifsd_config *parse_config(char *, int);
int cmdline_symset(char *);
void clear_config(struct ifsd_config *);
/* log.c */
void log_init(int);
void log_warn(const char *, ...);
void log_warnx(const char *, ...);
void log_info(const char *, ...);
void log_debug(const char *, ...);
__dead void fatal(const char *);
__dead void fatalx(const char *);
|