Blame


1 6b5c4000 2026-03-02 rsadowski /* $OpenBSD: agentx_control.c,v 1.8 2026/03/02 19:28:01 rsadowski Exp $ */
2 04a2f953 2020-09-14 martijn
3 04a2f953 2020-09-14 martijn /*
4 04a2f953 2020-09-14 martijn * Copyright (c) 2020 Martijn van Duren <martijn@openbsd.org>
5 04a2f953 2020-09-14 martijn * Copyright (c) 2008 - 2014 Reyk Floeter <reyk@openbsd.org>
6 04a2f953 2020-09-14 martijn *
7 04a2f953 2020-09-14 martijn * Permission to use, copy, modify, and distribute this software for any
8 04a2f953 2020-09-14 martijn * purpose with or without fee is hereby granted, provided that the above
9 04a2f953 2020-09-14 martijn * copyright notice and this permission notice appear in all copies.
10 04a2f953 2020-09-14 martijn *
11 04a2f953 2020-09-14 martijn * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 04a2f953 2020-09-14 martijn * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 04a2f953 2020-09-14 martijn * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 04a2f953 2020-09-14 martijn * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 04a2f953 2020-09-14 martijn * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 04a2f953 2020-09-14 martijn * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 04a2f953 2020-09-14 martijn * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 04a2f953 2020-09-14 martijn */
19 04a2f953 2020-09-14 martijn
20 04a2f953 2020-09-14 martijn #include <sys/types.h>
21 04a2f953 2020-09-14 martijn #include <sys/socket.h>
22 04a2f953 2020-09-14 martijn #include <sys/queue.h>
23 04a2f953 2020-09-14 martijn #include <sys/time.h>
24 04a2f953 2020-09-14 martijn #include <sys/un.h>
25 04a2f953 2020-09-14 martijn
26 04a2f953 2020-09-14 martijn #include <netinet/in.h>
27 04a2f953 2020-09-14 martijn
28 189a2332 2020-10-26 martijn #include <agentx.h>
29 04a2f953 2020-09-14 martijn #include <limits.h>
30 04a2f953 2020-09-14 martijn #include <stdio.h>
31 04a2f953 2020-09-14 martijn #include <stdlib.h>
32 04a2f953 2020-09-14 martijn #include <stdint.h>
33 04a2f953 2020-09-14 martijn #include <errno.h>
34 04a2f953 2020-09-14 martijn #include <string.h>
35 04a2f953 2020-09-14 martijn #include <syslog.h>
36 04a2f953 2020-09-14 martijn #include <unistd.h>
37 04a2f953 2020-09-14 martijn #include <event.h>
38 04a2f953 2020-09-14 martijn #include <imsg.h>
39 04a2f953 2020-09-14 martijn
40 04a2f953 2020-09-14 martijn #include "relayd.h"
41 6b5c4000 2026-03-02 rsadowski #include "log.h"
42 04a2f953 2020-09-14 martijn
43 04a2f953 2020-09-14 martijn #define RELAYD_MIB "1.3.6.1.4.1.30155.3"
44 04a2f953 2020-09-14 martijn #define SNMP_ELEMENT(x...) do { \
45 04a2f953 2020-09-14 martijn if (snmp_element(RELAYD_MIB x) == -1) \
46 04a2f953 2020-09-14 martijn goto done; \
47 04a2f953 2020-09-14 martijn } while (0)
48 04a2f953 2020-09-14 martijn
49 04a2f953 2020-09-14 martijn /*
50 04a2f953 2020-09-14 martijn static struct snmp_oid hosttrapoid = {
51 04a2f953 2020-09-14 martijn { 1, 3, 6, 1, 4, 1, 30155, 3, 1, 0 },
52 04a2f953 2020-09-14 martijn 10
53 04a2f953 2020-09-14 martijn };
54 04a2f953 2020-09-14 martijn */
55 04a2f953 2020-09-14 martijn
56 189a2332 2020-10-26 martijn #define RELAYDINFO AGENTX_ENTERPRISES, 30155, 3, 2
57 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTS RELAYDINFO, 1
58 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTENTRY RELAYDREDIRECTS, 1
59 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTINDEX RELAYDREDIRECTENTRY, 1
60 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTSTATUS RELAYDREDIRECTENTRY, 2
61 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTNAME RELAYDREDIRECTENTRY, 3
62 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTCNT RELAYDREDIRECTENTRY, 4
63 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTAVG RELAYDREDIRECTENTRY, 5
64 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTLAST RELAYDREDIRECTENTRY, 6
65 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTAVGHOUR RELAYDREDIRECTENTRY, 7
66 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTLASTHOUR RELAYDREDIRECTENTRY, 8
67 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTAVGDAY RELAYDREDIRECTENTRY, 9
68 04a2f953 2020-09-14 martijn #define RELAYDREDIRECTLASTDAY RELAYDREDIRECTENTRY, 10
69 04a2f953 2020-09-14 martijn #define RELAYDRELAYS RELAYDINFO, 2
70 04a2f953 2020-09-14 martijn #define RELAYDRELAYENTRY RELAYDRELAYS, 1
71 04a2f953 2020-09-14 martijn #define RELAYDRELAYINDEX RELAYDRELAYENTRY, 1
72 04a2f953 2020-09-14 martijn #define RELAYDRELAYSTATUS RELAYDRELAYENTRY, 2
73 04a2f953 2020-09-14 martijn #define RELAYDRELAYNAME RELAYDRELAYENTRY, 3
74 04a2f953 2020-09-14 martijn #define RELAYDRELAYCNT RELAYDRELAYENTRY, 4
75 04a2f953 2020-09-14 martijn #define RELAYDRELAYAVG RELAYDRELAYENTRY, 5
76 04a2f953 2020-09-14 martijn #define RELAYDRELAYLAST RELAYDRELAYENTRY, 6
77 04a2f953 2020-09-14 martijn #define RELAYDRELAYAVGHOUR RELAYDRELAYENTRY, 7
78 04a2f953 2020-09-14 martijn #define RELAYDRELAYLASTHOUR RELAYDRELAYENTRY, 8
79 04a2f953 2020-09-14 martijn #define RELAYDRELAYAVGDAY RELAYDRELAYENTRY, 9
80 04a2f953 2020-09-14 martijn #define RELAYDRELAYLASTDAY RELAYDRELAYENTRY, 10
81 04a2f953 2020-09-14 martijn #define RELAYDROUTERS RELAYDINFO, 3
82 04a2f953 2020-09-14 martijn #define RELAYDROUTERENTRY RELAYDROUTERS, 1
83 04a2f953 2020-09-14 martijn #define RELAYDROUTERINDEX RELAYDROUTERENTRY, 1
84 04a2f953 2020-09-14 martijn #define RELAYDROUTERTABLEINDEX RELAYDROUTERENTRY, 2
85 04a2f953 2020-09-14 martijn #define RELAYDROUTERSTATUS RELAYDROUTERENTRY, 3
86 04a2f953 2020-09-14 martijn #define RELAYDROUTERNAME RELAYDROUTERENTRY, 4
87 04a2f953 2020-09-14 martijn #define RELAYDROUTERLABEL RELAYDROUTERENTRY, 5
88 04a2f953 2020-09-14 martijn #define RELAYDROUTERRTABLE RELAYDROUTERENTRY, 6
89 04a2f953 2020-09-14 martijn #define RELAYDNETROUTES RELAYDINFO, 4
90 04a2f953 2020-09-14 martijn #define RELAYDNETROUTEENTRY RELAYDNETROUTES, 1
91 04a2f953 2020-09-14 martijn #define RELAYDNETROUTEINDEX RELAYDNETROUTEENTRY, 1
92 04a2f953 2020-09-14 martijn #define RELAYDNETROUTEADDR RELAYDNETROUTEENTRY, 2
93 04a2f953 2020-09-14 martijn #define RELAYDNETROUTEADDRTYPE RELAYDNETROUTEENTRY, 3
94 04a2f953 2020-09-14 martijn #define RELAYDNETROUTEPREFIXLEN RELAYDNETROUTEENTRY, 4
95 04a2f953 2020-09-14 martijn #define RELAYDNETROUTEROUTERINDEX RELAYDNETROUTEENTRY, 5
96 04a2f953 2020-09-14 martijn #define RELAYDHOSTS RELAYDINFO, 5
97 04a2f953 2020-09-14 martijn #define RELAYDHOSTENTRY RELAYDHOSTS, 1
98 04a2f953 2020-09-14 martijn #define RELAYDHOSTINDEX RELAYDHOSTENTRY, 1
99 04a2f953 2020-09-14 martijn #define RELAYDHOSTPARENTINDEX RELAYDHOSTENTRY, 2
100 04a2f953 2020-09-14 martijn #define RELAYDHOSTTABLEINDEX RELAYDHOSTENTRY, 3
101 04a2f953 2020-09-14 martijn #define RELAYDHOSTNAME RELAYDHOSTENTRY, 4
102 04a2f953 2020-09-14 martijn #define RELAYDHOSTADDRESS RELAYDHOSTENTRY, 5
103 04a2f953 2020-09-14 martijn #define RELAYDHOSTADDRESSTYPE RELAYDHOSTENTRY, 6
104 04a2f953 2020-09-14 martijn #define RELAYDHOSTSTATUS RELAYDHOSTENTRY, 7
105 04a2f953 2020-09-14 martijn #define RELAYDHOSTCHECKCNT RELAYDHOSTENTRY, 8
106 04a2f953 2020-09-14 martijn #define RELAYDHOSTUPCNT RELAYDHOSTENTRY, 9
107 04a2f953 2020-09-14 martijn #define RELAYDHOSTERRNO RELAYDHOSTENTRY, 10
108 04a2f953 2020-09-14 martijn #define RELAYDSESSIONS RELAYDINFO, 6
109 04a2f953 2020-09-14 martijn #define RELAYDSESSIONENTRY RELAYDSESSIONS, 1
110 04a2f953 2020-09-14 martijn #define RELAYDSESSIONINDEX RELAYDSESSIONENTRY, 1
111 04a2f953 2020-09-14 martijn #define RELAYDSESSIONRELAYINDEX RELAYDSESSIONENTRY, 2
112 04a2f953 2020-09-14 martijn #define RELAYDSESSIONINADDR RELAYDSESSIONENTRY, 3
113 04a2f953 2020-09-14 martijn #define RELAYDSESSIONINADDRTYPE RELAYDSESSIONENTRY, 4
114 04a2f953 2020-09-14 martijn #define RELAYDSESSIONOUTADDR RELAYDSESSIONENTRY, 5
115 04a2f953 2020-09-14 martijn #define RELAYDSESSIONOUTADDRTYPE RELAYDSESSIONENTRY, 6
116 04a2f953 2020-09-14 martijn #define RELAYDSESSIONPORTIN RELAYDSESSIONENTRY, 7
117 04a2f953 2020-09-14 martijn #define RELAYDSESSIONPORTOUT RELAYDSESSIONENTRY, 8
118 04a2f953 2020-09-14 martijn #define RELAYDSESSIONAGE RELAYDSESSIONENTRY, 9
119 04a2f953 2020-09-14 martijn #define RELAYDSESSIONIDLE RELAYDSESSIONENTRY, 10
120 04a2f953 2020-09-14 martijn #define RELAYDSESSIONSTATUS RELAYDSESSIONENTRY, 11
121 04a2f953 2020-09-14 martijn #define RELAYDSESSIONPID RELAYDSESSIONENTRY, 12
122 04a2f953 2020-09-14 martijn #define RELAYDTABLES RELAYDINFO, 7
123 04a2f953 2020-09-14 martijn #define RELAYDTABLEENTRY RELAYDTABLES, 1
124 04a2f953 2020-09-14 martijn #define RELAYDTABLEINDEX RELAYDTABLEENTRY, 1
125 04a2f953 2020-09-14 martijn #define RELAYDTABLENAME RELAYDTABLEENTRY, 2
126 04a2f953 2020-09-14 martijn #define RELAYDTABLESTATUS RELAYDTABLEENTRY, 3
127 04a2f953 2020-09-14 martijn
128 3dbaa1b8 2021-08-31 martijn void agentx_nofd(struct agentx *, void *, int);
129 04a2f953 2020-09-14 martijn
130 04a2f953 2020-09-14 martijn struct relayd *env;
131 04a2f953 2020-09-14 martijn
132 189a2332 2020-10-26 martijn struct agentx *sa = NULL;
133 189a2332 2020-10-26 martijn struct agentx_index *relaydRedirectIdx, *relaydRelayIdx;
134 189a2332 2020-10-26 martijn struct agentx_index *relaydRouterIdx, *relaydNetRouteIdx;
135 189a2332 2020-10-26 martijn struct agentx_index *relaydHostIdx, *relaydSessionRelayIdx;
136 189a2332 2020-10-26 martijn struct agentx_index *relaydSessionIdx, *relaydTableIdx;
137 04a2f953 2020-09-14 martijn
138 189a2332 2020-10-26 martijn struct agentx_object *relaydRedirectIndex, *relaydRedirectStatus;
139 189a2332 2020-10-26 martijn struct agentx_object *relaydRedirectName, *relaydRedirectCnt;
140 189a2332 2020-10-26 martijn struct agentx_object *relaydRedirectAvg, *relaydRedirectLast;
141 189a2332 2020-10-26 martijn struct agentx_object *relaydRedirectAvgHour, *relaydRedirectLastHour;
142 189a2332 2020-10-26 martijn struct agentx_object *relaydRedirectAvgDay, *relaydRedirectLastDay;
143 04a2f953 2020-09-14 martijn
144 189a2332 2020-10-26 martijn struct agentx_object *relaydRelayIndex, *relaydRelayStatus;
145 189a2332 2020-10-26 martijn struct agentx_object *relaydRelayName, *relaydRelayCnt;
146 189a2332 2020-10-26 martijn struct agentx_object *relaydRelayAvg, *relaydRelayLast;
147 189a2332 2020-10-26 martijn struct agentx_object *relaydRelayAvgHour, *relaydRelayLastHour;
148 189a2332 2020-10-26 martijn struct agentx_object *relaydRelayAvgDay, *relaydRelayLastDay;
149 04a2f953 2020-09-14 martijn
150 189a2332 2020-10-26 martijn struct agentx_object *relaydRouterIndex, *relaydRouterTableIndex;
151 189a2332 2020-10-26 martijn struct agentx_object *relaydRouterStatus, *relaydRouterName;
152 189a2332 2020-10-26 martijn struct agentx_object *relaydRouterLabel, *relaydRouterRtable;
153 04a2f953 2020-09-14 martijn
154 189a2332 2020-10-26 martijn struct agentx_object *relaydNetRouteIndex, *relaydNetRouteAddr;
155 189a2332 2020-10-26 martijn struct agentx_object *relaydNetRouteAddrType, *relaydNetRoutePrefixLen;
156 189a2332 2020-10-26 martijn struct agentx_object *relaydNetRouteRouterIndex;
157 04a2f953 2020-09-14 martijn
158 189a2332 2020-10-26 martijn struct agentx_object *relaydHostIndex, *relaydHostParentIndex;
159 189a2332 2020-10-26 martijn struct agentx_object *relaydHostTableIndex, *relaydHostName;
160 189a2332 2020-10-26 martijn struct agentx_object *relaydHostAddress, *relaydHostAddressType;
161 189a2332 2020-10-26 martijn struct agentx_object *relaydHostStatus, *relaydHostCheckCnt;
162 189a2332 2020-10-26 martijn struct agentx_object *relaydHostUpCnt, *relaydHostErrno;
163 04a2f953 2020-09-14 martijn
164 189a2332 2020-10-26 martijn struct agentx_object *relaydSessionIndex, *relaydSessionRelayIndex;
165 189a2332 2020-10-26 martijn struct agentx_object *relaydSessionInAddr, *relaydSessionInAddrType;
166 189a2332 2020-10-26 martijn struct agentx_object *relaydSessionOutAddr, *relaydSessionOutAddrType;
167 189a2332 2020-10-26 martijn struct agentx_object *relaydSessionPortIn, *relaydSessionPortOut;
168 189a2332 2020-10-26 martijn struct agentx_object *relaydSessionAge, *relaydSessionIdle;
169 189a2332 2020-10-26 martijn struct agentx_object *relaydSessionStatus, *relaydSessionPid;
170 04a2f953 2020-09-14 martijn
171 189a2332 2020-10-26 martijn struct agentx_object *relaydTableIndex, *relaydTableName, *relaydTableStatus;
172 04a2f953 2020-09-14 martijn
173 04a2f953 2020-09-14 martijn void *sstodata(struct sockaddr_storage *);
174 04a2f953 2020-09-14 martijn size_t sstolen(struct sockaddr_storage *);
175 04a2f953 2020-09-14 martijn
176 189a2332 2020-10-26 martijn struct rdr *agentxctl_rdr_byidx(uint32_t, enum agentx_request_type);
177 189a2332 2020-10-26 martijn void agentxctl_redirect(struct agentx_varbind *);
178 189a2332 2020-10-26 martijn struct relay *agentxctl_relay_byidx(uint32_t, enum agentx_request_type);
179 189a2332 2020-10-26 martijn void agentxctl_relay(struct agentx_varbind *);
180 189a2332 2020-10-26 martijn struct router *agentxctl_router_byidx(uint32_t, enum agentx_request_type);
181 189a2332 2020-10-26 martijn void agentxctl_router(struct agentx_varbind *);
182 189a2332 2020-10-26 martijn struct netroute *agentxctl_netroute_byidx(uint32_t, enum agentx_request_type);
183 189a2332 2020-10-26 martijn void agentxctl_netroute(struct agentx_varbind *);
184 189a2332 2020-10-26 martijn struct host *agentxctl_host_byidx(uint32_t, enum agentx_request_type);
185 189a2332 2020-10-26 martijn void agentxctl_host(struct agentx_varbind *);
186 189a2332 2020-10-26 martijn struct rsession *agentxctl_session_byidx(uint32_t, uint32_t,
187 189a2332 2020-10-26 martijn enum agentx_request_type);
188 189a2332 2020-10-26 martijn void agentxctl_session(struct agentx_varbind *);
189 189a2332 2020-10-26 martijn struct table *agentxctl_table_byidx(uint32_t, enum agentx_request_type);
190 189a2332 2020-10-26 martijn void agentxctl_table(struct agentx_varbind *);
191 04a2f953 2020-09-14 martijn
192 04a2f953 2020-09-14 martijn void agentx_sock(int, short, void *);
193 04a2f953 2020-09-14 martijn #if 0
194 04a2f953 2020-09-14 martijn int snmp_element(const char *, enum snmp_type, void *, int64_t,
195 04a2f953 2020-09-14 martijn struct agentx_pdu *);
196 04a2f953 2020-09-14 martijn int snmp_string2oid(const char *, struct snmp_oid *);
197 04a2f953 2020-09-14 martijn #endif
198 04a2f953 2020-09-14 martijn
199 04a2f953 2020-09-14 martijn void
200 04a2f953 2020-09-14 martijn agentx_init(struct relayd *nenv)
201 04a2f953 2020-09-14 martijn {
202 189a2332 2020-10-26 martijn struct agentx_session *sas;
203 189a2332 2020-10-26 martijn struct agentx_context *sac;
204 189a2332 2020-10-26 martijn struct agentx_region *sar;
205 189a2332 2020-10-26 martijn struct agentx_index *session_idxs[2];
206 3dbaa1b8 2021-08-31 martijn static int freed;
207 04a2f953 2020-09-14 martijn
208 189a2332 2020-10-26 martijn agentx_log_fatal = fatalx;
209 189a2332 2020-10-26 martijn agentx_log_warn = log_warnx;
210 189a2332 2020-10-26 martijn agentx_log_info = log_info;
211 189a2332 2020-10-26 martijn agentx_log_debug = log_debug;
212 04a2f953 2020-09-14 martijn
213 04a2f953 2020-09-14 martijn env = nenv;
214 04a2f953 2020-09-14 martijn
215 04a2f953 2020-09-14 martijn if ((env->sc_conf.flags & F_AGENTX) == 0) {
216 3dbaa1b8 2021-08-31 martijn if (sa != NULL && !freed) {
217 189a2332 2020-10-26 martijn agentx_free(sa);
218 3dbaa1b8 2021-08-31 martijn freed = 1;
219 3dbaa1b8 2021-08-31 martijn }
220 04a2f953 2020-09-14 martijn return;
221 04a2f953 2020-09-14 martijn }
222 04a2f953 2020-09-14 martijn if (sa != NULL)
223 04a2f953 2020-09-14 martijn return;
224 04a2f953 2020-09-14 martijn
225 3dbaa1b8 2021-08-31 martijn freed = 0;
226 3dbaa1b8 2021-08-31 martijn if ((sa = agentx(agentx_nofd, NULL)) == NULL)
227 04a2f953 2020-09-14 martijn fatal("%s: agentx alloc", __func__);
228 189a2332 2020-10-26 martijn if ((sas = agentx_session(sa, NULL, 0, "relayd", 0)) == NULL)
229 04a2f953 2020-09-14 martijn fatal("%s: agentx session alloc", __func__);
230 189a2332 2020-10-26 martijn if ((sac = agentx_context(sas,
231 04a2f953 2020-09-14 martijn env->sc_conf.agentx_context[0] == '\0' ? NULL :
232 04a2f953 2020-09-14 martijn env->sc_conf.agentx_context)) == NULL)
233 04a2f953 2020-09-14 martijn fatal("%s: agentx context alloc", __func__);
234 189a2332 2020-10-26 martijn sar = agentx_region(sac, AGENTX_OID(RELAYDINFO), 0);
235 04a2f953 2020-09-14 martijn if (sar == NULL)
236 04a2f953 2020-09-14 martijn fatal("%s: agentx region alloc", __func__);
237 189a2332 2020-10-26 martijn if ((relaydRedirectIdx = agentx_index_integer_dynamic(sar,
238 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDREDIRECTINDEX))) == NULL ||
239 189a2332 2020-10-26 martijn (relaydRelayIdx = agentx_index_integer_dynamic(sar,
240 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDRELAYINDEX))) == NULL ||
241 189a2332 2020-10-26 martijn (relaydRouterIdx = agentx_index_integer_dynamic(sar,
242 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDROUTERINDEX))) == NULL ||
243 189a2332 2020-10-26 martijn (relaydNetRouteIdx = agentx_index_integer_dynamic(sar,
244 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDNETROUTEINDEX))) == NULL ||
245 189a2332 2020-10-26 martijn (relaydHostIdx = agentx_index_integer_dynamic(sar,
246 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDHOSTINDEX))) == NULL ||
247 189a2332 2020-10-26 martijn (relaydSessionIdx = agentx_index_integer_dynamic(sar,
248 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONINDEX))) == NULL ||
249 189a2332 2020-10-26 martijn (relaydSessionRelayIdx = agentx_index_integer_dynamic(sar,
250 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONRELAYINDEX))) == NULL ||
251 189a2332 2020-10-26 martijn (relaydTableIdx = agentx_index_integer_dynamic(sar,
252 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDTABLEINDEX))) == NULL)
253 04a2f953 2020-09-14 martijn fatal("%s: agentx index alloc", __func__);
254 04a2f953 2020-09-14 martijn session_idxs[0] = relaydSessionRelayIdx;
255 04a2f953 2020-09-14 martijn session_idxs[1] = relaydSessionIdx;
256 189a2332 2020-10-26 martijn if ((relaydRedirectIndex = agentx_object(sar,
257 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDREDIRECTINDEX), &relaydRedirectIdx, 1, 0,
258 189a2332 2020-10-26 martijn agentxctl_redirect)) == NULL ||
259 189a2332 2020-10-26 martijn (relaydRedirectStatus = agentx_object(sar,
260 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDREDIRECTSTATUS), &relaydRedirectIdx, 1, 0,
261 189a2332 2020-10-26 martijn agentxctl_redirect)) == NULL ||
262 189a2332 2020-10-26 martijn (relaydRedirectName = agentx_object(sar,
263 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDREDIRECTNAME), &relaydRedirectIdx, 1, 0,
264 189a2332 2020-10-26 martijn agentxctl_redirect)) == NULL ||
265 189a2332 2020-10-26 martijn (relaydRedirectCnt = agentx_object(sar,
266 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDREDIRECTCNT), &relaydRedirectIdx, 1, 0,
267 189a2332 2020-10-26 martijn agentxctl_redirect)) == NULL ||
268 189a2332 2020-10-26 martijn (relaydRedirectAvg = agentx_object(sar,
269 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDREDIRECTAVG), &relaydRedirectIdx, 1, 0,
270 189a2332 2020-10-26 martijn agentxctl_redirect)) == NULL ||
271 189a2332 2020-10-26 martijn (relaydRedirectLast = agentx_object(sar,
272 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDREDIRECTLAST), &relaydRedirectIdx, 1, 0,
273 189a2332 2020-10-26 martijn agentxctl_redirect)) == NULL ||
274 189a2332 2020-10-26 martijn (relaydRedirectAvgHour = agentx_object(sar,
275 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDREDIRECTAVGHOUR), &relaydRedirectIdx, 1, 0,
276 189a2332 2020-10-26 martijn agentxctl_redirect)) == NULL ||
277 189a2332 2020-10-26 martijn (relaydRedirectLastHour = agentx_object(sar,
278 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDREDIRECTLASTHOUR), &relaydRedirectIdx, 1, 0,
279 189a2332 2020-10-26 martijn agentxctl_redirect)) == NULL ||
280 189a2332 2020-10-26 martijn (relaydRedirectAvgDay = agentx_object(sar,
281 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDREDIRECTAVGDAY), &relaydRedirectIdx, 1, 0,
282 189a2332 2020-10-26 martijn agentxctl_redirect)) == NULL ||
283 189a2332 2020-10-26 martijn (relaydRedirectLastDay = agentx_object(sar,
284 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDREDIRECTLASTDAY), &relaydRedirectIdx, 1, 0,
285 189a2332 2020-10-26 martijn agentxctl_redirect)) == NULL ||
286 189a2332 2020-10-26 martijn (relaydRelayIndex = agentx_object(sar,
287 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDRELAYINDEX), &relaydRelayIdx, 1, 0,
288 189a2332 2020-10-26 martijn agentxctl_relay)) == NULL ||
289 189a2332 2020-10-26 martijn (relaydRelayStatus = agentx_object(sar,
290 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDRELAYSTATUS), &relaydRelayIdx, 1, 0,
291 189a2332 2020-10-26 martijn agentxctl_relay)) == NULL ||
292 189a2332 2020-10-26 martijn (relaydRelayName = agentx_object(sar,
293 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDRELAYNAME), &relaydRelayIdx, 1, 0,
294 189a2332 2020-10-26 martijn agentxctl_relay)) == NULL ||
295 189a2332 2020-10-26 martijn (relaydRelayCnt = agentx_object(sar,
296 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDRELAYCNT), &relaydRelayIdx, 1, 0,
297 189a2332 2020-10-26 martijn agentxctl_relay)) == NULL ||
298 189a2332 2020-10-26 martijn (relaydRelayAvg = agentx_object(sar,
299 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDRELAYAVG), &relaydRelayIdx, 1, 0,
300 189a2332 2020-10-26 martijn agentxctl_relay)) == NULL ||
301 189a2332 2020-10-26 martijn (relaydRelayLast = agentx_object(sar,
302 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDRELAYLAST), &relaydRelayIdx, 1, 0,
303 189a2332 2020-10-26 martijn agentxctl_relay)) == NULL ||
304 189a2332 2020-10-26 martijn (relaydRelayAvgHour = agentx_object(sar,
305 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDRELAYAVGHOUR), &relaydRelayIdx, 1, 0,
306 189a2332 2020-10-26 martijn agentxctl_relay)) == NULL ||
307 189a2332 2020-10-26 martijn (relaydRelayLastHour = agentx_object(sar,
308 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDRELAYLASTHOUR), &relaydRelayIdx, 1, 0,
309 189a2332 2020-10-26 martijn agentxctl_relay)) == NULL ||
310 189a2332 2020-10-26 martijn (relaydRelayAvgDay = agentx_object(sar,
311 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDRELAYAVGDAY), &relaydRelayIdx, 1, 0,
312 189a2332 2020-10-26 martijn agentxctl_relay)) == NULL ||
313 189a2332 2020-10-26 martijn (relaydRelayLastDay = agentx_object(sar,
314 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDRELAYLASTDAY), &relaydRelayIdx, 1, 0,
315 189a2332 2020-10-26 martijn agentxctl_relay)) == NULL ||
316 189a2332 2020-10-26 martijn (relaydRouterIndex = agentx_object(sar,
317 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDROUTERINDEX), &relaydRouterIdx, 1, 0,
318 189a2332 2020-10-26 martijn agentxctl_router)) == NULL ||
319 189a2332 2020-10-26 martijn (relaydRouterTableIndex = agentx_object(sar,
320 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDROUTERTABLEINDEX), &relaydRouterIdx, 1, 0,
321 189a2332 2020-10-26 martijn agentxctl_router)) == NULL ||
322 189a2332 2020-10-26 martijn (relaydRouterStatus = agentx_object(sar,
323 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDROUTERSTATUS), &relaydRouterIdx, 1, 0,
324 189a2332 2020-10-26 martijn agentxctl_router)) == NULL ||
325 189a2332 2020-10-26 martijn (relaydRouterName = agentx_object(sar,
326 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDROUTERNAME), &relaydRouterIdx, 1, 0,
327 189a2332 2020-10-26 martijn agentxctl_router)) == NULL ||
328 189a2332 2020-10-26 martijn (relaydRouterLabel = agentx_object(sar,
329 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDROUTERLABEL), &relaydRouterIdx, 1, 0,
330 189a2332 2020-10-26 martijn agentxctl_router)) == NULL ||
331 189a2332 2020-10-26 martijn (relaydRouterRtable = agentx_object(sar,
332 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDROUTERRTABLE), &relaydRouterIdx, 1, 0,
333 189a2332 2020-10-26 martijn agentxctl_router)) == NULL ||
334 189a2332 2020-10-26 martijn (relaydNetRouteIndex = agentx_object(sar,
335 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDNETROUTEINDEX), &relaydNetRouteIdx, 1, 0,
336 189a2332 2020-10-26 martijn agentxctl_netroute)) == NULL ||
337 189a2332 2020-10-26 martijn (relaydNetRouteAddr = agentx_object(sar,
338 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDNETROUTEADDR), &relaydNetRouteIdx, 1, 0,
339 189a2332 2020-10-26 martijn agentxctl_netroute)) == NULL ||
340 189a2332 2020-10-26 martijn (relaydNetRouteAddrType = agentx_object(sar,
341 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDNETROUTEADDRTYPE), &relaydNetRouteIdx, 1, 0,
342 189a2332 2020-10-26 martijn agentxctl_netroute)) == NULL ||
343 189a2332 2020-10-26 martijn (relaydNetRoutePrefixLen = agentx_object(sar,
344 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDNETROUTEPREFIXLEN), &relaydNetRouteIdx, 1, 0,
345 189a2332 2020-10-26 martijn agentxctl_netroute)) == NULL ||
346 189a2332 2020-10-26 martijn (relaydNetRouteRouterIndex = agentx_object(sar,
347 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDNETROUTEROUTERINDEX), &relaydNetRouteIdx, 1, 0,
348 189a2332 2020-10-26 martijn agentxctl_netroute)) == NULL ||
349 189a2332 2020-10-26 martijn (relaydHostIndex = agentx_object(sar,
350 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDHOSTINDEX), &relaydHostIdx, 1, 0,
351 189a2332 2020-10-26 martijn agentxctl_host)) == NULL ||
352 189a2332 2020-10-26 martijn (relaydHostParentIndex = agentx_object(sar,
353 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDHOSTPARENTINDEX), &relaydHostIdx, 1, 0,
354 189a2332 2020-10-26 martijn agentxctl_host)) == NULL ||
355 189a2332 2020-10-26 martijn (relaydHostTableIndex = agentx_object(sar,
356 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDHOSTTABLEINDEX), &relaydHostIdx, 1, 0,
357 189a2332 2020-10-26 martijn agentxctl_host)) == NULL ||
358 189a2332 2020-10-26 martijn (relaydHostName = agentx_object(sar,
359 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDHOSTNAME), &relaydHostIdx, 1, 0,
360 189a2332 2020-10-26 martijn agentxctl_host)) == NULL ||
361 189a2332 2020-10-26 martijn (relaydHostAddress = agentx_object(sar,
362 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDHOSTADDRESS), &relaydHostIdx, 1, 0,
363 189a2332 2020-10-26 martijn agentxctl_host)) == NULL ||
364 189a2332 2020-10-26 martijn (relaydHostAddressType = agentx_object(sar,
365 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDHOSTADDRESSTYPE), &relaydHostIdx, 1, 0,
366 189a2332 2020-10-26 martijn agentxctl_host)) == NULL ||
367 189a2332 2020-10-26 martijn (relaydHostStatus = agentx_object(sar,
368 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDHOSTSTATUS), &relaydHostIdx, 1, 0,
369 189a2332 2020-10-26 martijn agentxctl_host)) == NULL ||
370 189a2332 2020-10-26 martijn (relaydHostCheckCnt = agentx_object(sar,
371 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDHOSTCHECKCNT), &relaydHostIdx, 1, 0,
372 189a2332 2020-10-26 martijn agentxctl_host)) == NULL ||
373 189a2332 2020-10-26 martijn (relaydHostUpCnt = agentx_object(sar,
374 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDHOSTUPCNT), &relaydHostIdx, 1, 0,
375 189a2332 2020-10-26 martijn agentxctl_host)) == NULL ||
376 189a2332 2020-10-26 martijn (relaydHostErrno = agentx_object(sar,
377 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDHOSTERRNO), &relaydHostIdx, 1, 0,
378 189a2332 2020-10-26 martijn agentxctl_host)) == NULL ||
379 189a2332 2020-10-26 martijn (relaydSessionIndex = agentx_object(sar,
380 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONINDEX), session_idxs, 2, 0,
381 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
382 189a2332 2020-10-26 martijn (relaydSessionRelayIndex = agentx_object(sar,
383 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONRELAYINDEX), session_idxs, 2, 0,
384 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
385 189a2332 2020-10-26 martijn (relaydSessionInAddr = agentx_object(sar,
386 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONINADDR), session_idxs, 2, 0,
387 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
388 189a2332 2020-10-26 martijn (relaydSessionInAddrType = agentx_object(sar,
389 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONINADDRTYPE), session_idxs, 2, 0,
390 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
391 189a2332 2020-10-26 martijn (relaydSessionOutAddr = agentx_object(sar,
392 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONOUTADDR), session_idxs, 2, 0,
393 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
394 189a2332 2020-10-26 martijn (relaydSessionOutAddrType = agentx_object(sar,
395 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONOUTADDRTYPE), session_idxs, 2, 0,
396 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
397 189a2332 2020-10-26 martijn (relaydSessionPortIn = agentx_object(sar,
398 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONPORTIN), session_idxs, 2, 0,
399 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
400 189a2332 2020-10-26 martijn (relaydSessionPortOut = agentx_object(sar,
401 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONPORTOUT), session_idxs, 2, 0,
402 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
403 189a2332 2020-10-26 martijn (relaydSessionAge = agentx_object(sar,
404 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONAGE), session_idxs, 2, 0,
405 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
406 189a2332 2020-10-26 martijn (relaydSessionIdle = agentx_object(sar,
407 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONIDLE), session_idxs, 2, 0,
408 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
409 189a2332 2020-10-26 martijn (relaydSessionStatus = agentx_object(sar,
410 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONSTATUS), session_idxs, 2, 0,
411 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
412 189a2332 2020-10-26 martijn (relaydSessionPid = agentx_object(sar,
413 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDSESSIONPID), session_idxs, 2, 0,
414 189a2332 2020-10-26 martijn agentxctl_session)) == NULL ||
415 189a2332 2020-10-26 martijn (relaydTableIndex = agentx_object(sar,
416 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDTABLEINDEX), &relaydTableIdx, 1, 0,
417 189a2332 2020-10-26 martijn agentxctl_table)) == NULL ||
418 189a2332 2020-10-26 martijn (relaydTableName = agentx_object(sar,
419 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDTABLENAME), &relaydTableIdx, 1, 0,
420 189a2332 2020-10-26 martijn agentxctl_table)) == NULL ||
421 189a2332 2020-10-26 martijn (relaydTableStatus = agentx_object(sar,
422 189a2332 2020-10-26 martijn AGENTX_OID(RELAYDTABLESTATUS), &relaydTableIdx, 1, 0,
423 189a2332 2020-10-26 martijn agentxctl_table)) == NULL)
424 04a2f953 2020-09-14 martijn fatal("%s: agentx object alloc", __func__);
425 04a2f953 2020-09-14 martijn }
426 04a2f953 2020-09-14 martijn
427 04a2f953 2020-09-14 martijn void
428 3dbaa1b8 2021-08-31 martijn agentx_nofd(struct agentx *usa, void *cookie, int close)
429 04a2f953 2020-09-14 martijn {
430 3dbaa1b8 2021-08-31 martijn if (!close)
431 3dbaa1b8 2021-08-31 martijn proc_compose(env->sc_ps, PROC_PARENT, IMSG_AGENTXSOCK, NULL, 0);
432 3dbaa1b8 2021-08-31 martijn else {
433 3dbaa1b8 2021-08-31 martijn sa = NULL;
434 3dbaa1b8 2021-08-31 martijn agentx_init(env);
435 3dbaa1b8 2021-08-31 martijn event_del(&(env->sc_agentxev));
436 3dbaa1b8 2021-08-31 martijn }
437 04a2f953 2020-09-14 martijn }
438 04a2f953 2020-09-14 martijn
439 04a2f953 2020-09-14 martijn void
440 04a2f953 2020-09-14 martijn agentx_setsock(struct relayd *lenv, enum privsep_procid id)
441 04a2f953 2020-09-14 martijn {
442 04a2f953 2020-09-14 martijn struct sockaddr_un sun;
443 04a2f953 2020-09-14 martijn int s = -1;
444 04a2f953 2020-09-14 martijn
445 04a2f953 2020-09-14 martijn if ((s = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0)) == -1)
446 04a2f953 2020-09-14 martijn goto done;
447 04a2f953 2020-09-14 martijn
448 04a2f953 2020-09-14 martijn bzero(&sun, sizeof(sun));
449 04a2f953 2020-09-14 martijn sun.sun_family = AF_UNIX;
450 04a2f953 2020-09-14 martijn if (strlcpy(sun.sun_path, lenv->sc_conf.agentx_path,
451 04a2f953 2020-09-14 martijn sizeof(sun.sun_path)) >= sizeof(sun.sun_path))
452 04a2f953 2020-09-14 martijn fatalx("invalid socket path");
453 04a2f953 2020-09-14 martijn
454 04a2f953 2020-09-14 martijn if (connect(s, (struct sockaddr *)&sun, sizeof(sun)) == -1) {
455 04a2f953 2020-09-14 martijn close(s);
456 04a2f953 2020-09-14 martijn s = -1;
457 04a2f953 2020-09-14 martijn }
458 04a2f953 2020-09-14 martijn done:
459 04a2f953 2020-09-14 martijn proc_compose_imsg(lenv->sc_ps, id, -1, IMSG_AGENTXSOCK, -1, s, NULL, 0);
460 04a2f953 2020-09-14 martijn }
461 04a2f953 2020-09-14 martijn
462 6d9ea5e7 2022-08-31 dv void
463 04a2f953 2020-09-14 martijn agentx_getsock(struct imsg *imsg)
464 04a2f953 2020-09-14 martijn {
465 04a2f953 2020-09-14 martijn struct timeval tv = AGENTX_RECONNECT_TIMEOUT;
466 754759d6 2024-01-17 claudio int fd;
467 04a2f953 2020-09-14 martijn
468 754759d6 2024-01-17 claudio fd = imsg_get_fd(imsg);
469 754759d6 2024-01-17 claudio if (fd == -1)
470 04a2f953 2020-09-14 martijn goto retry;
471 04a2f953 2020-09-14 martijn
472 04a2f953 2020-09-14 martijn event_del(&(env->sc_agentxev));
473 754759d6 2024-01-17 claudio event_set(&(env->sc_agentxev), fd, EV_READ | EV_PERSIST,
474 04a2f953 2020-09-14 martijn agentx_sock, env);
475 04a2f953 2020-09-14 martijn event_add(&(env->sc_agentxev), NULL);
476 04a2f953 2020-09-14 martijn
477 754759d6 2024-01-17 claudio agentx_connect(sa, fd);
478 04a2f953 2020-09-14 martijn
479 04a2f953 2020-09-14 martijn retry:
480 04a2f953 2020-09-14 martijn evtimer_set(&env->sc_agentxev, agentx_sock, env);
481 04a2f953 2020-09-14 martijn evtimer_add(&env->sc_agentxev, &tv);
482 04a2f953 2020-09-14 martijn }
483 04a2f953 2020-09-14 martijn
484 04a2f953 2020-09-14 martijn void
485 04a2f953 2020-09-14 martijn agentx_sock(int fd, short event, void *arg)
486 04a2f953 2020-09-14 martijn {
487 04a2f953 2020-09-14 martijn if (event & EV_TIMEOUT) {
488 04a2f953 2020-09-14 martijn proc_compose(env->sc_ps, PROC_PARENT, IMSG_AGENTXSOCK, NULL, 0);
489 04a2f953 2020-09-14 martijn return;
490 04a2f953 2020-09-14 martijn }
491 04a2f953 2020-09-14 martijn if (event & EV_WRITE) {
492 04a2f953 2020-09-14 martijn event_del(&(env->sc_agentxev));
493 04a2f953 2020-09-14 martijn event_set(&(env->sc_agentxev), fd, EV_READ | EV_PERSIST,
494 04a2f953 2020-09-14 martijn agentx_sock, NULL);
495 04a2f953 2020-09-14 martijn event_add(&(env->sc_agentxev), NULL);
496 189a2332 2020-10-26 martijn agentx_write(sa);
497 04a2f953 2020-09-14 martijn }
498 04a2f953 2020-09-14 martijn if (event & EV_READ)
499 189a2332 2020-10-26 martijn agentx_read(sa);
500 04a2f953 2020-09-14 martijn return;
501 04a2f953 2020-09-14 martijn }
502 04a2f953 2020-09-14 martijn
503 04a2f953 2020-09-14 martijn void *
504 04a2f953 2020-09-14 martijn sstodata(struct sockaddr_storage *ss)
505 04a2f953 2020-09-14 martijn {
506 04a2f953 2020-09-14 martijn if (ss->ss_family == AF_INET)
507 04a2f953 2020-09-14 martijn return &((struct sockaddr_in *)ss)->sin_addr;
508 04a2f953 2020-09-14 martijn if (ss->ss_family == AF_INET6)
509 04a2f953 2020-09-14 martijn return &((struct sockaddr_in6 *)ss)->sin6_addr;
510 04a2f953 2020-09-14 martijn return NULL;
511 04a2f953 2020-09-14 martijn }
512 04a2f953 2020-09-14 martijn
513 04a2f953 2020-09-14 martijn size_t
514 04a2f953 2020-09-14 martijn sstolen(struct sockaddr_storage *ss)
515 04a2f953 2020-09-14 martijn {
516 04a2f953 2020-09-14 martijn if (ss->ss_family == AF_INET)
517 04a2f953 2020-09-14 martijn return sizeof(((struct sockaddr_in *)ss)->sin_addr);
518 04a2f953 2020-09-14 martijn if (ss->ss_family == AF_INET6)
519 04a2f953 2020-09-14 martijn return sizeof(((struct sockaddr_in6 *)ss)->sin6_addr);
520 04a2f953 2020-09-14 martijn return 0;
521 04a2f953 2020-09-14 martijn }
522 04a2f953 2020-09-14 martijn
523 04a2f953 2020-09-14 martijn struct rdr *
524 189a2332 2020-10-26 martijn agentxctl_rdr_byidx(uint32_t instanceidx, enum agentx_request_type type)
525 04a2f953 2020-09-14 martijn {
526 04a2f953 2020-09-14 martijn struct rdr *rdr;
527 04a2f953 2020-09-14 martijn
528 04a2f953 2020-09-14 martijn TAILQ_FOREACH(rdr, env->sc_rdrs, entry) {
529 04a2f953 2020-09-14 martijn if (rdr->conf.id == instanceidx) {
530 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET ||
531 189a2332 2020-10-26 martijn type == AGENTX_REQUEST_TYPE_GETNEXTINCLUSIVE)
532 04a2f953 2020-09-14 martijn return rdr;
533 04a2f953 2020-09-14 martijn else
534 04a2f953 2020-09-14 martijn return TAILQ_NEXT(rdr, entry);
535 04a2f953 2020-09-14 martijn } else if (rdr->conf.id > instanceidx) {
536 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET)
537 04a2f953 2020-09-14 martijn return NULL;
538 04a2f953 2020-09-14 martijn return rdr;
539 04a2f953 2020-09-14 martijn }
540 04a2f953 2020-09-14 martijn }
541 04a2f953 2020-09-14 martijn
542 04a2f953 2020-09-14 martijn return NULL;
543 04a2f953 2020-09-14 martijn }
544 04a2f953 2020-09-14 martijn
545 04a2f953 2020-09-14 martijn
546 04a2f953 2020-09-14 martijn void
547 189a2332 2020-10-26 martijn agentxctl_redirect(struct agentx_varbind *sav)
548 04a2f953 2020-09-14 martijn {
549 04a2f953 2020-09-14 martijn struct rdr *rdr;
550 04a2f953 2020-09-14 martijn
551 189a2332 2020-10-26 martijn rdr = agentxctl_rdr_byidx(agentx_varbind_get_index_integer(sav,
552 189a2332 2020-10-26 martijn relaydRedirectIdx), agentx_varbind_request(sav));
553 42c7a8a5 2020-10-27 martijn if (rdr == NULL || rdr->conf.id > INT32_MAX) {
554 189a2332 2020-10-26 martijn agentx_varbind_notfound(sav);
555 04a2f953 2020-09-14 martijn return;
556 04a2f953 2020-09-14 martijn }
557 189a2332 2020-10-26 martijn agentx_varbind_set_index_integer(sav, relaydRedirectIdx,
558 04a2f953 2020-09-14 martijn rdr->conf.id);
559 189a2332 2020-10-26 martijn if (agentx_varbind_get_object(sav) == relaydRedirectIndex)
560 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, rdr->conf.id);
561 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRedirectStatus) {
562 04a2f953 2020-09-14 martijn if (rdr->conf.flags & F_DISABLE)
563 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 1);
564 04a2f953 2020-09-14 martijn else if (rdr->conf.flags & F_DOWN)
565 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 2);
566 04a2f953 2020-09-14 martijn else if (rdr->conf.flags & F_BACKUP)
567 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 3);
568 04a2f953 2020-09-14 martijn else
569 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 0);
570 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydRedirectName)
571 189a2332 2020-10-26 martijn agentx_varbind_string(sav, rdr->conf.name);
572 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRedirectCnt)
573 189a2332 2020-10-26 martijn agentx_varbind_counter64(sav, rdr->stats.cnt);
574 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRedirectAvg)
575 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, rdr->stats.avg);
576 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRedirectLast)
577 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, rdr->stats.last);
578 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRedirectAvgHour)
579 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, rdr->stats.avg_hour);
580 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRedirectLastHour)
581 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, rdr->stats.last_hour);
582 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRedirectAvgDay)
583 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, rdr->stats.avg_day);
584 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRedirectLastDay)
585 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, rdr->stats.last_day);
586 04a2f953 2020-09-14 martijn }
587 04a2f953 2020-09-14 martijn
588 04a2f953 2020-09-14 martijn struct relay *
589 189a2332 2020-10-26 martijn agentxctl_relay_byidx(uint32_t instanceidx, enum agentx_request_type type)
590 04a2f953 2020-09-14 martijn {
591 04a2f953 2020-09-14 martijn struct relay *rly;
592 04a2f953 2020-09-14 martijn
593 04a2f953 2020-09-14 martijn TAILQ_FOREACH(rly, env->sc_relays, rl_entry) {
594 04a2f953 2020-09-14 martijn if (rly->rl_conf.id == instanceidx) {
595 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET ||
596 189a2332 2020-10-26 martijn type == AGENTX_REQUEST_TYPE_GETNEXTINCLUSIVE)
597 04a2f953 2020-09-14 martijn return rly;
598 04a2f953 2020-09-14 martijn else
599 04a2f953 2020-09-14 martijn return TAILQ_NEXT(rly, rl_entry);
600 04a2f953 2020-09-14 martijn } else if (rly->rl_conf.id > instanceidx) {
601 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET)
602 04a2f953 2020-09-14 martijn return NULL;
603 04a2f953 2020-09-14 martijn return rly;
604 04a2f953 2020-09-14 martijn }
605 04a2f953 2020-09-14 martijn }
606 04a2f953 2020-09-14 martijn
607 04a2f953 2020-09-14 martijn return NULL;
608 04a2f953 2020-09-14 martijn }
609 04a2f953 2020-09-14 martijn
610 04a2f953 2020-09-14 martijn void
611 189a2332 2020-10-26 martijn agentxctl_relay(struct agentx_varbind *sav)
612 04a2f953 2020-09-14 martijn {
613 04a2f953 2020-09-14 martijn struct relay *rly;
614 04a2f953 2020-09-14 martijn uint64_t value = 0;
615 04a2f953 2020-09-14 martijn int i, nrelay = env->sc_conf.prefork_relay;
616 04a2f953 2020-09-14 martijn
617 189a2332 2020-10-26 martijn rly = agentxctl_relay_byidx(agentx_varbind_get_index_integer(sav,
618 189a2332 2020-10-26 martijn relaydRelayIdx), agentx_varbind_request(sav));
619 42c7a8a5 2020-10-27 martijn if (rly == NULL || rly->rl_conf.id > INT32_MAX) {
620 189a2332 2020-10-26 martijn agentx_varbind_notfound(sav);
621 04a2f953 2020-09-14 martijn return;
622 04a2f953 2020-09-14 martijn }
623 189a2332 2020-10-26 martijn agentx_varbind_set_index_integer(sav, relaydRelayIdx,
624 04a2f953 2020-09-14 martijn rly->rl_conf.id);
625 189a2332 2020-10-26 martijn if (agentx_varbind_get_object(sav) == relaydRelayIndex)
626 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, rly->rl_conf.id);
627 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRelayStatus) {
628 04a2f953 2020-09-14 martijn if (rly->rl_up == HOST_UP)
629 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 1);
630 04a2f953 2020-09-14 martijn else
631 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 0);
632 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydRelayName)
633 189a2332 2020-10-26 martijn agentx_varbind_string(sav, rly->rl_conf.name);
634 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRelayCnt) {
635 04a2f953 2020-09-14 martijn for (i = 0; i < nrelay; i++)
636 04a2f953 2020-09-14 martijn value += rly->rl_stats[i].cnt;
637 189a2332 2020-10-26 martijn agentx_varbind_counter64(sav, value);
638 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydRelayAvg) {
639 04a2f953 2020-09-14 martijn for (i = 0; i < nrelay; i++)
640 04a2f953 2020-09-14 martijn value += rly->rl_stats[i].avg;
641 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, (uint32_t)value);
642 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydRelayLast) {
643 04a2f953 2020-09-14 martijn for (i = 0; i < nrelay; i++)
644 04a2f953 2020-09-14 martijn value += rly->rl_stats[i].last;
645 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, (uint32_t)value);
646 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydRelayAvgHour) {
647 04a2f953 2020-09-14 martijn for (i = 0; i < nrelay; i++)
648 04a2f953 2020-09-14 martijn value += rly->rl_stats[i].avg_hour;
649 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, (uint32_t)value);
650 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydRelayLastHour) {
651 04a2f953 2020-09-14 martijn for (i = 0; i < nrelay; i++)
652 04a2f953 2020-09-14 martijn value += rly->rl_stats[i].last_hour;
653 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, (uint32_t)value);
654 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydRelayAvgDay) {
655 04a2f953 2020-09-14 martijn for (i = 0; i < nrelay; i++)
656 04a2f953 2020-09-14 martijn value += rly->rl_stats[i].avg_day;
657 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, (uint32_t)value);
658 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydRelayLastDay) {
659 04a2f953 2020-09-14 martijn for (i = 0; i < nrelay; i++)
660 04a2f953 2020-09-14 martijn value += rly->rl_stats[i].last_day;
661 189a2332 2020-10-26 martijn agentx_varbind_gauge32(sav, (uint32_t)value);
662 04a2f953 2020-09-14 martijn }
663 04a2f953 2020-09-14 martijn }
664 04a2f953 2020-09-14 martijn
665 04a2f953 2020-09-14 martijn struct router *
666 189a2332 2020-10-26 martijn agentxctl_router_byidx(uint32_t instanceidx, enum agentx_request_type type)
667 04a2f953 2020-09-14 martijn {
668 04a2f953 2020-09-14 martijn struct router *router;
669 04a2f953 2020-09-14 martijn
670 04a2f953 2020-09-14 martijn TAILQ_FOREACH(router, env->sc_rts, rt_entry) {
671 04a2f953 2020-09-14 martijn if (router->rt_conf.id == instanceidx) {
672 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET ||
673 189a2332 2020-10-26 martijn type == AGENTX_REQUEST_TYPE_GETNEXTINCLUSIVE)
674 04a2f953 2020-09-14 martijn return router;
675 04a2f953 2020-09-14 martijn else
676 04a2f953 2020-09-14 martijn return TAILQ_NEXT(router, rt_entry);
677 04a2f953 2020-09-14 martijn } else if (router->rt_conf.id > instanceidx) {
678 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET)
679 04a2f953 2020-09-14 martijn return NULL;
680 04a2f953 2020-09-14 martijn return router;
681 04a2f953 2020-09-14 martijn }
682 04a2f953 2020-09-14 martijn }
683 04a2f953 2020-09-14 martijn
684 04a2f953 2020-09-14 martijn return NULL;
685 04a2f953 2020-09-14 martijn }
686 04a2f953 2020-09-14 martijn
687 04a2f953 2020-09-14 martijn void
688 189a2332 2020-10-26 martijn agentxctl_router(struct agentx_varbind *sav)
689 04a2f953 2020-09-14 martijn {
690 04a2f953 2020-09-14 martijn struct router *router;
691 04a2f953 2020-09-14 martijn
692 189a2332 2020-10-26 martijn router = agentxctl_router_byidx(agentx_varbind_get_index_integer(sav,
693 189a2332 2020-10-26 martijn relaydRouterIdx), agentx_varbind_request(sav));
694 42c7a8a5 2020-10-27 martijn if (router == NULL || router->rt_conf.id > INT32_MAX) {
695 189a2332 2020-10-26 martijn agentx_varbind_notfound(sav);
696 04a2f953 2020-09-14 martijn return;
697 04a2f953 2020-09-14 martijn }
698 189a2332 2020-10-26 martijn agentx_varbind_set_index_integer(sav, relaydRouterIdx,
699 04a2f953 2020-09-14 martijn router->rt_conf.id);
700 189a2332 2020-10-26 martijn if (agentx_varbind_get_object(sav) == relaydRouterIndex)
701 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, router->rt_conf.id);
702 42c7a8a5 2020-10-27 martijn else if (agentx_varbind_get_object(sav) == relaydRouterTableIndex) {
703 42c7a8a5 2020-10-27 martijn if (router->rt_conf.gwtable > INT32_MAX)
704 42c7a8a5 2020-10-27 martijn agentx_varbind_integer(sav, -1);
705 42c7a8a5 2020-10-27 martijn else
706 42c7a8a5 2020-10-27 martijn agentx_varbind_integer(sav, router->rt_conf.gwtable);
707 42c7a8a5 2020-10-27 martijn } else if (agentx_varbind_get_object(sav) == relaydRouterStatus) {
708 04a2f953 2020-09-14 martijn if (router->rt_conf.flags & F_DISABLE)
709 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 1);
710 04a2f953 2020-09-14 martijn else
711 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 0);
712 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydRouterName)
713 189a2332 2020-10-26 martijn agentx_varbind_string(sav, router->rt_conf.name);
714 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRouterLabel)
715 189a2332 2020-10-26 martijn agentx_varbind_string(sav, router->rt_conf.label);
716 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydRouterRtable)
717 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, router->rt_conf.rtable);
718 04a2f953 2020-09-14 martijn }
719 04a2f953 2020-09-14 martijn
720 04a2f953 2020-09-14 martijn struct netroute *
721 189a2332 2020-10-26 martijn agentxctl_netroute_byidx(uint32_t instanceidx, enum agentx_request_type type)
722 04a2f953 2020-09-14 martijn {
723 04a2f953 2020-09-14 martijn struct netroute *nr;
724 04a2f953 2020-09-14 martijn
725 04a2f953 2020-09-14 martijn TAILQ_FOREACH(nr, env->sc_routes, nr_route) {
726 04a2f953 2020-09-14 martijn if (nr->nr_conf.id == instanceidx) {
727 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET ||
728 189a2332 2020-10-26 martijn type == AGENTX_REQUEST_TYPE_GETNEXTINCLUSIVE)
729 04a2f953 2020-09-14 martijn return nr;
730 04a2f953 2020-09-14 martijn else
731 04a2f953 2020-09-14 martijn return TAILQ_NEXT(nr, nr_entry);
732 04a2f953 2020-09-14 martijn } else if (nr->nr_conf.id > instanceidx) {
733 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET)
734 04a2f953 2020-09-14 martijn return NULL;
735 04a2f953 2020-09-14 martijn return nr;
736 04a2f953 2020-09-14 martijn }
737 04a2f953 2020-09-14 martijn }
738 04a2f953 2020-09-14 martijn
739 04a2f953 2020-09-14 martijn return NULL;
740 04a2f953 2020-09-14 martijn }
741 04a2f953 2020-09-14 martijn
742 04a2f953 2020-09-14 martijn void
743 189a2332 2020-10-26 martijn agentxctl_netroute(struct agentx_varbind *sav)
744 04a2f953 2020-09-14 martijn {
745 04a2f953 2020-09-14 martijn struct netroute *nr;
746 04a2f953 2020-09-14 martijn
747 189a2332 2020-10-26 martijn nr = agentxctl_netroute_byidx(agentx_varbind_get_index_integer(sav,
748 189a2332 2020-10-26 martijn relaydNetRouteIdx), agentx_varbind_request(sav));
749 42c7a8a5 2020-10-27 martijn if (nr == NULL || nr->nr_conf.id > INT32_MAX) {
750 189a2332 2020-10-26 martijn agentx_varbind_notfound(sav);
751 04a2f953 2020-09-14 martijn return;
752 04a2f953 2020-09-14 martijn }
753 189a2332 2020-10-26 martijn agentx_varbind_set_index_integer(sav, relaydNetRouteIdx,
754 04a2f953 2020-09-14 martijn nr->nr_conf.id);
755 189a2332 2020-10-26 martijn if (agentx_varbind_get_object(sav) == relaydNetRouteIndex)
756 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, nr->nr_conf.id);
757 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydNetRouteAddr)
758 189a2332 2020-10-26 martijn agentx_varbind_nstring(sav, sstodata(&nr->nr_conf.ss),
759 04a2f953 2020-09-14 martijn sstolen(&nr->nr_conf.ss));
760 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydNetRouteAddrType) {
761 04a2f953 2020-09-14 martijn if (nr->nr_conf.ss.ss_family == AF_INET)
762 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 1);
763 04a2f953 2020-09-14 martijn else if (nr->nr_conf.ss.ss_family == AF_INET6)
764 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 2);
765 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydNetRoutePrefixLen)
766 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, nr->nr_conf.prefixlen);
767 42c7a8a5 2020-10-27 martijn else if (agentx_varbind_get_object(sav) == relaydNetRouteRouterIndex) {
768 42c7a8a5 2020-10-27 martijn if (nr->nr_conf.routerid > INT32_MAX)
769 42c7a8a5 2020-10-27 martijn agentx_varbind_integer(sav, -1);
770 42c7a8a5 2020-10-27 martijn else
771 42c7a8a5 2020-10-27 martijn agentx_varbind_integer(sav, nr->nr_conf.routerid);
772 42c7a8a5 2020-10-27 martijn }
773 04a2f953 2020-09-14 martijn }
774 04a2f953 2020-09-14 martijn
775 04a2f953 2020-09-14 martijn struct host *
776 189a2332 2020-10-26 martijn agentxctl_host_byidx(uint32_t instanceidx, enum agentx_request_type type)
777 04a2f953 2020-09-14 martijn {
778 04a2f953 2020-09-14 martijn struct host *host;
779 04a2f953 2020-09-14 martijn
780 04a2f953 2020-09-14 martijn TAILQ_FOREACH(host, &(env->sc_hosts), globalentry) {
781 04a2f953 2020-09-14 martijn if (host->conf.id == instanceidx) {
782 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET ||
783 189a2332 2020-10-26 martijn type == AGENTX_REQUEST_TYPE_GETNEXTINCLUSIVE)
784 04a2f953 2020-09-14 martijn return host;
785 04a2f953 2020-09-14 martijn else
786 04a2f953 2020-09-14 martijn return TAILQ_NEXT(host, globalentry);
787 04a2f953 2020-09-14 martijn } else if (host->conf.id > instanceidx) {
788 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET)
789 04a2f953 2020-09-14 martijn return NULL;
790 04a2f953 2020-09-14 martijn return host;
791 04a2f953 2020-09-14 martijn }
792 04a2f953 2020-09-14 martijn }
793 04a2f953 2020-09-14 martijn
794 04a2f953 2020-09-14 martijn return NULL;
795 04a2f953 2020-09-14 martijn }
796 04a2f953 2020-09-14 martijn
797 04a2f953 2020-09-14 martijn void
798 189a2332 2020-10-26 martijn agentxctl_host(struct agentx_varbind *sav)
799 04a2f953 2020-09-14 martijn {
800 04a2f953 2020-09-14 martijn struct host *host;
801 04a2f953 2020-09-14 martijn
802 189a2332 2020-10-26 martijn host = agentxctl_host_byidx(agentx_varbind_get_index_integer(sav,
803 189a2332 2020-10-26 martijn relaydHostIdx), agentx_varbind_request(sav));
804 42c7a8a5 2020-10-27 martijn if (host == NULL || host->conf.id > INT32_MAX) {
805 189a2332 2020-10-26 martijn agentx_varbind_notfound(sav);
806 04a2f953 2020-09-14 martijn return;
807 04a2f953 2020-09-14 martijn }
808 189a2332 2020-10-26 martijn agentx_varbind_set_index_integer(sav, relaydHostIdx,
809 04a2f953 2020-09-14 martijn host->conf.id);
810 189a2332 2020-10-26 martijn if (agentx_varbind_get_object(sav) == relaydHostIndex)
811 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, host->conf.id);
812 42c7a8a5 2020-10-27 martijn else if (agentx_varbind_get_object(sav) == relaydHostParentIndex) {
813 42c7a8a5 2020-10-27 martijn if (host->conf.parentid > INT32_MAX)
814 42c7a8a5 2020-10-27 martijn agentx_varbind_integer(sav, -1);
815 42c7a8a5 2020-10-27 martijn else
816 42c7a8a5 2020-10-27 martijn agentx_varbind_integer(sav, host->conf.parentid);
817 42c7a8a5 2020-10-27 martijn } else if (agentx_varbind_get_object(sav) == relaydHostTableIndex) {
818 42c7a8a5 2020-10-27 martijn if (host->conf.tableid > INT32_MAX)
819 42c7a8a5 2020-10-27 martijn agentx_varbind_integer(sav, -1);
820 42c7a8a5 2020-10-27 martijn else
821 42c7a8a5 2020-10-27 martijn agentx_varbind_integer(sav, host->conf.tableid);
822 42c7a8a5 2020-10-27 martijn } else if (agentx_varbind_get_object(sav) == relaydHostName)
823 189a2332 2020-10-26 martijn agentx_varbind_string(sav, host->conf.name);
824 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydHostAddress)
825 189a2332 2020-10-26 martijn agentx_varbind_nstring(sav, sstodata(&host->conf.ss),
826 04a2f953 2020-09-14 martijn sstolen(&host->conf.ss));
827 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydHostAddressType) {
828 04a2f953 2020-09-14 martijn if (host->conf.ss.ss_family == AF_INET)
829 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 1);
830 04a2f953 2020-09-14 martijn else if (host->conf.ss.ss_family == AF_INET6)
831 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 2);
832 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydHostStatus) {
833 04a2f953 2020-09-14 martijn if (host->flags & F_DISABLE)
834 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 1);
835 04a2f953 2020-09-14 martijn else if (host->up == HOST_UP)
836 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 0);
837 04a2f953 2020-09-14 martijn else if (host->up == HOST_DOWN)
838 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 2);
839 04a2f953 2020-09-14 martijn else
840 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 3);
841 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydHostCheckCnt)
842 189a2332 2020-10-26 martijn agentx_varbind_counter64(sav, host->check_cnt);
843 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydHostUpCnt)
844 189a2332 2020-10-26 martijn agentx_varbind_counter64(sav, host->up_cnt);
845 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydHostErrno)
846 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, host->he);
847 04a2f953 2020-09-14 martijn }
848 04a2f953 2020-09-14 martijn
849 04a2f953 2020-09-14 martijn /*
850 04a2f953 2020-09-14 martijn * Every session is spawned in one of multiple processes.
851 04a2f953 2020-09-14 martijn * However, there is no central session id registration, so not every session
852 04a2f953 2020-09-14 martijn * is shown here
853 04a2f953 2020-09-14 martijn */
854 04a2f953 2020-09-14 martijn struct rsession *
855 189a2332 2020-10-26 martijn agentxctl_session_byidx(uint32_t sessidx, uint32_t relayidx,
856 189a2332 2020-10-26 martijn enum agentx_request_type type)
857 04a2f953 2020-09-14 martijn {
858 04a2f953 2020-09-14 martijn struct rsession *session;
859 04a2f953 2020-09-14 martijn
860 04a2f953 2020-09-14 martijn TAILQ_FOREACH(session, &(env->sc_sessions), se_entry) {
861 04a2f953 2020-09-14 martijn if (session->se_id == sessidx) {
862 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET) {
863 04a2f953 2020-09-14 martijn if (relayidx != session->se_relayid)
864 04a2f953 2020-09-14 martijn return NULL;
865 04a2f953 2020-09-14 martijn return session;
866 04a2f953 2020-09-14 martijn }
867 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GETNEXTINCLUSIVE) {
868 04a2f953 2020-09-14 martijn if (relayidx <= session->se_relayid)
869 04a2f953 2020-09-14 martijn return session;
870 04a2f953 2020-09-14 martijn return TAILQ_NEXT(session, se_entry);
871 04a2f953 2020-09-14 martijn }
872 04a2f953 2020-09-14 martijn if (relayidx < session->se_relayid)
873 04a2f953 2020-09-14 martijn return session;
874 04a2f953 2020-09-14 martijn return TAILQ_NEXT(session, se_entry);
875 04a2f953 2020-09-14 martijn } else if (session->se_id > sessidx) {
876 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET)
877 04a2f953 2020-09-14 martijn return NULL;
878 04a2f953 2020-09-14 martijn return session;
879 04a2f953 2020-09-14 martijn }
880 04a2f953 2020-09-14 martijn }
881 04a2f953 2020-09-14 martijn
882 04a2f953 2020-09-14 martijn return NULL;
883 04a2f953 2020-09-14 martijn }
884 04a2f953 2020-09-14 martijn
885 04a2f953 2020-09-14 martijn void
886 189a2332 2020-10-26 martijn agentxctl_session(struct agentx_varbind *sav)
887 04a2f953 2020-09-14 martijn {
888 04a2f953 2020-09-14 martijn struct timeval tv, now;
889 04a2f953 2020-09-14 martijn struct rsession *session;
890 04a2f953 2020-09-14 martijn
891 189a2332 2020-10-26 martijn session = agentxctl_session_byidx(agentx_varbind_get_index_integer(sav,
892 189a2332 2020-10-26 martijn relaydSessionIdx), agentx_varbind_get_index_integer(sav,
893 189a2332 2020-10-26 martijn relaydSessionRelayIdx), agentx_varbind_request(sav));
894 42c7a8a5 2020-10-27 martijn if (session == NULL || session->se_id > INT32_MAX ||
895 42c7a8a5 2020-10-27 martijn session->se_relayid > INT32_MAX) {
896 189a2332 2020-10-26 martijn agentx_varbind_notfound(sav);
897 04a2f953 2020-09-14 martijn return;
898 04a2f953 2020-09-14 martijn }
899 04a2f953 2020-09-14 martijn
900 189a2332 2020-10-26 martijn agentx_varbind_set_index_integer(sav, relaydSessionIdx,
901 04a2f953 2020-09-14 martijn session->se_id);
902 189a2332 2020-10-26 martijn agentx_varbind_set_index_integer(sav, relaydSessionRelayIdx,
903 04a2f953 2020-09-14 martijn session->se_relayid);
904 189a2332 2020-10-26 martijn if (agentx_varbind_get_object(sav) == relaydSessionIndex)
905 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, session->se_id);
906 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydSessionRelayIndex)
907 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, session->se_relayid);
908 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydSessionInAddr)
909 189a2332 2020-10-26 martijn agentx_varbind_nstring(sav, sstodata(&(session->se_in.ss)),
910 04a2f953 2020-09-14 martijn sstolen(&(session->se_in.ss)));
911 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydSessionInAddrType) {
912 04a2f953 2020-09-14 martijn if (session->se_in.ss.ss_family == AF_INET)
913 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 1);
914 04a2f953 2020-09-14 martijn else if (session->se_in.ss.ss_family == AF_INET6)
915 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 2);
916 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydSessionOutAddr)
917 189a2332 2020-10-26 martijn agentx_varbind_nstring(sav, sstodata(&(session->se_out.ss)),
918 04a2f953 2020-09-14 martijn sstolen(&(session->se_out.ss)));
919 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydSessionOutAddrType) {
920 04a2f953 2020-09-14 martijn if (session->se_out.ss.ss_family == AF_INET)
921 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 1);
922 04a2f953 2020-09-14 martijn else if (session->se_out.ss.ss_family == AF_INET6)
923 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 2);
924 04a2f953 2020-09-14 martijn else
925 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 0);
926 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydSessionPortIn)
927 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, session->se_in.port);
928 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydSessionPortOut)
929 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, session->se_out.port);
930 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydSessionAge) {
931 04a2f953 2020-09-14 martijn getmonotime(&now);
932 04a2f953 2020-09-14 martijn timersub(&now, &session->se_tv_start, &tv);
933 189a2332 2020-10-26 martijn agentx_varbind_timeticks(sav,
934 04a2f953 2020-09-14 martijn tv.tv_sec * 100 + tv.tv_usec / 10000);
935 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydSessionIdle) {
936 04a2f953 2020-09-14 martijn getmonotime(&now);
937 04a2f953 2020-09-14 martijn timersub(&now, &session->se_tv_last, &tv);
938 189a2332 2020-10-26 martijn agentx_varbind_timeticks(sav,
939 04a2f953 2020-09-14 martijn tv.tv_sec * 100 + tv.tv_usec / 10000);
940 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydSessionStatus) {
941 04a2f953 2020-09-14 martijn if (session->se_done)
942 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 1);
943 04a2f953 2020-09-14 martijn else
944 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 0);
945 189a2332 2020-10-26 martijn } else if (agentx_varbind_get_object(sav) == relaydSessionPid)
946 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, session->se_pid);
947 04a2f953 2020-09-14 martijn }
948 04a2f953 2020-09-14 martijn
949 04a2f953 2020-09-14 martijn struct table *
950 189a2332 2020-10-26 martijn agentxctl_table_byidx(uint32_t instanceidx, enum agentx_request_type type)
951 04a2f953 2020-09-14 martijn {
952 04a2f953 2020-09-14 martijn struct table *table;
953 04a2f953 2020-09-14 martijn
954 04a2f953 2020-09-14 martijn TAILQ_FOREACH(table, env->sc_tables, entry) {
955 04a2f953 2020-09-14 martijn if (table->conf.id == instanceidx) {
956 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET ||
957 189a2332 2020-10-26 martijn type == AGENTX_REQUEST_TYPE_GETNEXTINCLUSIVE)
958 04a2f953 2020-09-14 martijn return table;
959 04a2f953 2020-09-14 martijn else
960 04a2f953 2020-09-14 martijn return TAILQ_NEXT(table, entry);
961 04a2f953 2020-09-14 martijn } else if (table->conf.id > instanceidx) {
962 189a2332 2020-10-26 martijn if (type == AGENTX_REQUEST_TYPE_GET)
963 04a2f953 2020-09-14 martijn return NULL;
964 04a2f953 2020-09-14 martijn return table;
965 04a2f953 2020-09-14 martijn }
966 04a2f953 2020-09-14 martijn }
967 04a2f953 2020-09-14 martijn
968 04a2f953 2020-09-14 martijn return NULL;
969 04a2f953 2020-09-14 martijn }
970 04a2f953 2020-09-14 martijn
971 04a2f953 2020-09-14 martijn void
972 189a2332 2020-10-26 martijn agentxctl_table(struct agentx_varbind *sav)
973 04a2f953 2020-09-14 martijn {
974 04a2f953 2020-09-14 martijn struct table *table;
975 04a2f953 2020-09-14 martijn
976 189a2332 2020-10-26 martijn table = agentxctl_table_byidx(agentx_varbind_get_index_integer(sav,
977 189a2332 2020-10-26 martijn relaydTableIdx), agentx_varbind_request(sav));
978 42c7a8a5 2020-10-27 martijn if (table == NULL || table->conf.id > INT32_MAX) {
979 189a2332 2020-10-26 martijn agentx_varbind_notfound(sav);
980 04a2f953 2020-09-14 martijn return;
981 04a2f953 2020-09-14 martijn }
982 189a2332 2020-10-26 martijn agentx_varbind_set_index_integer(sav, relaydTableIdx,
983 04a2f953 2020-09-14 martijn table->conf.id);
984 189a2332 2020-10-26 martijn if (agentx_varbind_get_object(sav) == relaydTableIndex)
985 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, table->conf.id);
986 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydTableName)
987 189a2332 2020-10-26 martijn agentx_varbind_string(sav, table->conf.name);
988 189a2332 2020-10-26 martijn else if (agentx_varbind_get_object(sav) == relaydTableStatus) {
989 04a2f953 2020-09-14 martijn if (TAILQ_EMPTY(&table->hosts))
990 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 1);
991 04a2f953 2020-09-14 martijn else if (table->conf.flags & F_DISABLE)
992 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 2);
993 04a2f953 2020-09-14 martijn else
994 189a2332 2020-10-26 martijn agentx_varbind_integer(sav, 0);
995 04a2f953 2020-09-14 martijn }
996 04a2f953 2020-09-14 martijn
997 04a2f953 2020-09-14 martijn }
998 04a2f953 2020-09-14 martijn #if 0
999 04a2f953 2020-09-14 martijn
1000 04a2f953 2020-09-14 martijn int
1001 04a2f953 2020-09-14 martijn snmp_element(const char *oidstr, enum snmp_type type, void *buf, int64_t val,
1002 04a2f953 2020-09-14 martijn struct agentx_pdu *pdu)
1003 04a2f953 2020-09-14 martijn {
1004 04a2f953 2020-09-14 martijn u_int32_t d;
1005 04a2f953 2020-09-14 martijn u_int64_t l;
1006 04a2f953 2020-09-14 martijn struct snmp_oid oid;
1007 04a2f953 2020-09-14 martijn
1008 04a2f953 2020-09-14 martijn DPRINTF("%s: oid %s type %d buf %p val %lld", __func__,
1009 04a2f953 2020-09-14 martijn oidstr, type, buf, val);
1010 04a2f953 2020-09-14 martijn
1011 04a2f953 2020-09-14 martijn if (snmp_string2oid(oidstr, &oid) == -1)
1012 04a2f953 2020-09-14 martijn return -1;
1013 04a2f953 2020-09-14 martijn
1014 04a2f953 2020-09-14 martijn switch (type) {
1015 04a2f953 2020-09-14 martijn case SNMP_GAUGE32:
1016 04a2f953 2020-09-14 martijn case SNMP_NSAPADDR:
1017 04a2f953 2020-09-14 martijn case SNMP_INTEGER32:
1018 04a2f953 2020-09-14 martijn case SNMP_UINTEGER32:
1019 04a2f953 2020-09-14 martijn d = (u_int32_t)val;
1020 04a2f953 2020-09-14 martijn if (snmp_agentx_varbind(pdu, &oid, AGENTX_INTEGER,
1021 04a2f953 2020-09-14 martijn &d, sizeof(d)) == -1)
1022 04a2f953 2020-09-14 martijn return -1;
1023 04a2f953 2020-09-14 martijn break;
1024 04a2f953 2020-09-14 martijn
1025 04a2f953 2020-09-14 martijn case SNMP_COUNTER32:
1026 04a2f953 2020-09-14 martijn d = (u_int32_t)val;
1027 04a2f953 2020-09-14 martijn if (snmp_agentx_varbind(pdu, &oid, AGENTX_COUNTER32,
1028 04a2f953 2020-09-14 martijn &d, sizeof(d)) == -1)
1029 04a2f953 2020-09-14 martijn return -1;
1030 04a2f953 2020-09-14 martijn break;
1031 04a2f953 2020-09-14 martijn
1032 04a2f953 2020-09-14 martijn case SNMP_TIMETICKS:
1033 04a2f953 2020-09-14 martijn d = (u_int32_t)val;
1034 04a2f953 2020-09-14 martijn if (snmp_agentx_varbind(pdu, &oid, AGENTX_TIME_TICKS,
1035 04a2f953 2020-09-14 martijn &d, sizeof(d)) == -1)
1036 04a2f953 2020-09-14 martijn return -1;
1037 04a2f953 2020-09-14 martijn break;
1038 04a2f953 2020-09-14 martijn
1039 04a2f953 2020-09-14 martijn case SNMP_COUNTER64:
1040 04a2f953 2020-09-14 martijn l = (u_int64_t)val;
1041 04a2f953 2020-09-14 martijn if (snmp_agentx_varbind(pdu, &oid, AGENTX_COUNTER64,
1042 04a2f953 2020-09-14 martijn &l, sizeof(l)) == -1)
1043 04a2f953 2020-09-14 martijn return -1;
1044 04a2f953 2020-09-14 martijn break;
1045 04a2f953 2020-09-14 martijn
1046 04a2f953 2020-09-14 martijn case SNMP_IPADDR:
1047 04a2f953 2020-09-14 martijn case SNMP_OPAQUE:
1048 04a2f953 2020-09-14 martijn d = (u_int32_t)val;
1049 04a2f953 2020-09-14 martijn if (snmp_agentx_varbind(pdu, &oid, AGENTX_OPAQUE,
1050 04a2f953 2020-09-14 martijn buf, strlen(buf)) == -1)
1051 04a2f953 2020-09-14 martijn return -1;
1052 04a2f953 2020-09-14 martijn break;
1053 04a2f953 2020-09-14 martijn
1054 04a2f953 2020-09-14 martijn case SNMP_OBJECT: {
1055 04a2f953 2020-09-14 martijn struct snmp_oid oid1;
1056 04a2f953 2020-09-14 martijn
1057 04a2f953 2020-09-14 martijn if (snmp_string2oid(buf, &oid1) == -1)
1058 04a2f953 2020-09-14 martijn return -1;
1059 04a2f953 2020-09-14 martijn if (snmp_agentx_varbind(pdu, &oid, AGENTX_OBJECT_IDENTIFIER,
1060 04a2f953 2020-09-14 martijn &oid1, sizeof(oid1)) == -1)
1061 04a2f953 2020-09-14 martijn return -1;
1062 04a2f953 2020-09-14 martijn }
1063 04a2f953 2020-09-14 martijn
1064 04a2f953 2020-09-14 martijn case SNMP_BITSTRING:
1065 04a2f953 2020-09-14 martijn case SNMP_OCTETSTRING:
1066 04a2f953 2020-09-14 martijn if (snmp_agentx_varbind(pdu, &oid, AGENTX_OCTET_STRING,
1067 04a2f953 2020-09-14 martijn buf, strlen(buf)) == -1)
1068 04a2f953 2020-09-14 martijn return -1;
1069 04a2f953 2020-09-14 martijn break;
1070 04a2f953 2020-09-14 martijn
1071 04a2f953 2020-09-14 martijn case SNMP_NULL:
1072 04a2f953 2020-09-14 martijn /* no data beyond the OID itself */
1073 04a2f953 2020-09-14 martijn if (snmp_agentx_varbind(pdu, &oid, AGENTX_NULL,
1074 04a2f953 2020-09-14 martijn NULL, 0) == -1)
1075 04a2f953 2020-09-14 martijn return -1;
1076 04a2f953 2020-09-14 martijn }
1077 04a2f953 2020-09-14 martijn
1078 04a2f953 2020-09-14 martijn return 0;
1079 04a2f953 2020-09-14 martijn }
1080 04a2f953 2020-09-14 martijn
1081 04a2f953 2020-09-14 martijn /*
1082 04a2f953 2020-09-14 martijn * SNMP traps for relayd
1083 04a2f953 2020-09-14 martijn */
1084 04a2f953 2020-09-14 martijn
1085 04a2f953 2020-09-14 martijn void
1086 04a2f953 2020-09-14 martijn snmp_hosttrap(struct relayd *env, struct table *table, struct host *host)
1087 04a2f953 2020-09-14 martijn {
1088 04a2f953 2020-09-14 martijn struct agentx_pdu *pdu;
1089 04a2f953 2020-09-14 martijn
1090 04a2f953 2020-09-14 martijn if (snmp_agentx == NULL || env->sc_snmp == -1)
1091 04a2f953 2020-09-14 martijn return;
1092 04a2f953 2020-09-14 martijn
1093 04a2f953 2020-09-14 martijn /*
1094 04a2f953 2020-09-14 martijn * OPENBSD-RELAYD-MIB host status trap
1095 04a2f953 2020-09-14 martijn * XXX The trap format needs some tweaks and other OIDs
1096 04a2f953 2020-09-14 martijn */
1097 04a2f953 2020-09-14 martijn
1098 04a2f953 2020-09-14 martijn if ((pdu = snmp_agentx_notify_pdu(&hosttrapoid)) == NULL)
1099 04a2f953 2020-09-14 martijn return;
1100 04a2f953 2020-09-14 martijn
1101 04a2f953 2020-09-14 martijn SNMP_ELEMENT(".1.0", SNMP_NULL, NULL, 0, pdu);
1102 04a2f953 2020-09-14 martijn SNMP_ELEMENT(".1.1.0", SNMP_OCTETSTRING, host->conf.name, 0, pdu);
1103 04a2f953 2020-09-14 martijn SNMP_ELEMENT(".1.2.0", SNMP_INTEGER32, NULL, host->up, pdu);
1104 04a2f953 2020-09-14 martijn SNMP_ELEMENT(".1.3.0", SNMP_INTEGER32, NULL, host->last_up, pdu);
1105 04a2f953 2020-09-14 martijn SNMP_ELEMENT(".1.4.0", SNMP_INTEGER32, NULL, host->up_cnt, pdu);
1106 04a2f953 2020-09-14 martijn SNMP_ELEMENT(".1.5.0", SNMP_INTEGER32, NULL, host->check_cnt, pdu);
1107 04a2f953 2020-09-14 martijn SNMP_ELEMENT(".1.6.0", SNMP_OCTETSTRING, table->conf.name, 0, pdu);
1108 04a2f953 2020-09-14 martijn SNMP_ELEMENT(".1.7.0", SNMP_INTEGER32, NULL, table->up, pdu);
1109 04a2f953 2020-09-14 martijn if (!host->conf.retry)
1110 04a2f953 2020-09-14 martijn goto done;
1111 04a2f953 2020-09-14 martijn SNMP_ELEMENT(".1.8.0", SNMP_INTEGER32, NULL, host->conf.retry, pdu);
1112 04a2f953 2020-09-14 martijn SNMP_ELEMENT(".1.9.0", SNMP_INTEGER32, NULL, host->retry_cnt, pdu);
1113 04a2f953 2020-09-14 martijn
1114 04a2f953 2020-09-14 martijn done:
1115 04a2f953 2020-09-14 martijn snmp_agentx_send(snmp_agentx, pdu);
1116 04a2f953 2020-09-14 martijn snmp_event_add(env, EV_WRITE);
1117 04a2f953 2020-09-14 martijn }
1118 04a2f953 2020-09-14 martijn
1119 04a2f953 2020-09-14 martijn int
1120 04a2f953 2020-09-14 martijn snmp_string2oid(const char *oidstr, struct snmp_oid *o)
1121 04a2f953 2020-09-14 martijn {
1122 04a2f953 2020-09-14 martijn char *sp, *p, str[BUFSIZ];
1123 04a2f953 2020-09-14 martijn const char *errstr;
1124 04a2f953 2020-09-14 martijn
1125 04a2f953 2020-09-14 martijn if (strlcpy(str, oidstr, sizeof(str)) >= sizeof(str))
1126 04a2f953 2020-09-14 martijn return -1;
1127 04a2f953 2020-09-14 martijn bzero(o, sizeof(*o));
1128 04a2f953 2020-09-14 martijn
1129 04a2f953 2020-09-14 martijn for (p = sp = str; p != NULL; sp = p) {
1130 04a2f953 2020-09-14 martijn if ((p = strpbrk(p, ".-")) != NULL)
1131 04a2f953 2020-09-14 martijn *p++ = '\0';
1132 04a2f953 2020-09-14 martijn o->o_id[o->o_n++] = strtonum(sp, 0, UINT_MAX, &errstr);
1133 04a2f953 2020-09-14 martijn if (errstr || o->o_n > SNMP_MAX_OID_LEN)
1134 04a2f953 2020-09-14 martijn return -1;
1135 04a2f953 2020-09-14 martijn }
1136 04a2f953 2020-09-14 martijn
1137 04a2f953 2020-09-14 martijn return 0;
1138 04a2f953 2020-09-14 martijn }
1139 04a2f953 2020-09-14 martijn #endif