Bug Summary

File:src/usr.sbin/snmpd/application_internal.c
Warning:line 442, column 22
Use of memory allocated with size zero

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.4 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name application_internal.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/usr.sbin/snmpd/obj -resource-dir /usr/local/llvm16/lib/clang/16 -I /usr/src/usr.sbin/snmpd -internal-isystem /usr/local/llvm16/lib/clang/16/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/usr.sbin/snmpd/obj -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fcf-protection=branch -fno-jump-tables -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/scan/2024-01-11-140451-98009-1 -x c /usr/src/usr.sbin/snmpd/application_internal.c
1/* $OpenBSD: application_internal.c,v 1.11 2023/12/21 12:43:31 martijn Exp $ */
2
3/*
4 * Copyright (c) 2023 Martijn van Duren <martijn@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <sys/tree.h>
20#include <sys/types.h>
21
22#include <stddef.h>
23
24#include <ber.h>
25#include <errno(*__errno()).h>
26#include <stdint.h>
27#include <stdlib.h>
28#include <string.h>
29
30#include "application.h"
31#include "log.h"
32#include "mib.h"
33#include "smi.h"
34#include "snmp.h"
35#include "snmpd.h"
36
37struct appl_internal_object {
38 struct ber_oid oid;
39 struct ber_element * (*get)(struct ber_oid *);
40 /* No getnext means the object is scalar */
41 struct ber_element * (*getnext)(int8_t, struct ber_oid *);
42
43 int32_t intval;
44 char *stringval;
45
46 RB_ENTRY(appl_internal_object)struct { struct appl_internal_object *rbe_left; struct appl_internal_object
*rbe_right; struct appl_internal_object *rbe_parent; int rbe_color
; }
entry;
47};
48
49void appl_internal_region(struct ber_oid *);
50void appl_internal_object(struct ber_oid *,
51 struct ber_element *(*)(struct ber_oid *),
52 struct ber_element *(*)(int8_t, struct ber_oid *));
53void appl_internal_get(struct appl_backend *, int32_t, int32_t, const char *,
54 struct appl_varbind *);
55void appl_internal_getnext(struct appl_backend *, int32_t, int32_t,
56 const char *, struct appl_varbind *);
57struct ber_element *appl_internal_snmp(struct ber_oid *);
58struct ber_element *appl_internal_engine(struct ber_oid *);
59struct ber_element *appl_internal_usmstats(struct ber_oid *);
60struct ber_element *appl_internal_system(struct ber_oid *);
61struct ber_element *appl_internal_get_int(struct ber_oid *);
62struct ber_element *appl_internal_get_string(struct ber_oid *);
63struct appl_internal_object *appl_internal_object_parent(struct ber_oid *);
64int appl_internal_object_cmp(struct appl_internal_object *,
65 struct appl_internal_object *);
66
67struct appl_backend_functions appl_internal_functions = {
68 .ab_get = appl_internal_get,
69 .ab_getnext = appl_internal_getnext,
70 .ab_getbulk = NULL((void *)0), /* getbulk is too complex */
71};
72
73struct appl_backend appl_internal = {
74 .ab_name = "internal",
75 .ab_cookie = NULL((void *)0),
76 .ab_retries = 0,
77 .ab_range = 1,
78 .ab_fn = &appl_internal_functions
79};
80
81struct appl_backend appl_config = {
82 .ab_name = "config",
83 .ab_cookie = NULL((void *)0),
84 .ab_retries = 0,
85 .ab_range = 1,
86 .ab_fn = &appl_internal_functions
87};
88
89static RB_HEAD(appl_internal_objects, appl_internal_object)struct appl_internal_objects { struct appl_internal_object *rbh_root
; }
90 appl_internal_objects = RB_INITIALIZER(&appl_internal_objects){ ((void *)0) },
91 appl_internal_objects_conf = RB_INITIALIZER(&appl_internal_objects_conf){ ((void *)0) };
92RB_PROTOTYPE_STATIC(appl_internal_objects, appl_internal_object, entry,__attribute__((__unused__)) static void appl_internal_objects_RB_INSERT_COLOR
(struct appl_internal_objects *, struct appl_internal_object *
); __attribute__((__unused__)) static void appl_internal_objects_RB_REMOVE_COLOR
(struct appl_internal_objects *, struct appl_internal_object *
, struct appl_internal_object *);__attribute__((__unused__)) static
struct appl_internal_object *appl_internal_objects_RB_REMOVE
(struct appl_internal_objects *, struct appl_internal_object *
); __attribute__((__unused__)) static struct appl_internal_object
*appl_internal_objects_RB_INSERT(struct appl_internal_objects
*, struct appl_internal_object *); __attribute__((__unused__
)) static struct appl_internal_object *appl_internal_objects_RB_FIND
(struct appl_internal_objects *, struct appl_internal_object *
); __attribute__((__unused__)) static struct appl_internal_object
*appl_internal_objects_RB_NFIND(struct appl_internal_objects
*, struct appl_internal_object *); __attribute__((__unused__
)) static struct appl_internal_object *appl_internal_objects_RB_NEXT
(struct appl_internal_object *); __attribute__((__unused__)) static
struct appl_internal_object *appl_internal_objects_RB_PREV(struct
appl_internal_object *); __attribute__((__unused__)) static struct
appl_internal_object *appl_internal_objects_RB_MINMAX(struct
appl_internal_objects *, int);
93 appl_internal_object_cmp)__attribute__((__unused__)) static void appl_internal_objects_RB_INSERT_COLOR
(struct appl_internal_objects *, struct appl_internal_object *
); __attribute__((__unused__)) static void appl_internal_objects_RB_REMOVE_COLOR
(struct appl_internal_objects *, struct appl_internal_object *
, struct appl_internal_object *);__attribute__((__unused__)) static
struct appl_internal_object *appl_internal_objects_RB_REMOVE
(struct appl_internal_objects *, struct appl_internal_object *
); __attribute__((__unused__)) static struct appl_internal_object
*appl_internal_objects_RB_INSERT(struct appl_internal_objects
*, struct appl_internal_object *); __attribute__((__unused__
)) static struct appl_internal_object *appl_internal_objects_RB_FIND
(struct appl_internal_objects *, struct appl_internal_object *
); __attribute__((__unused__)) static struct appl_internal_object
*appl_internal_objects_RB_NFIND(struct appl_internal_objects
*, struct appl_internal_object *); __attribute__((__unused__
)) static struct appl_internal_object *appl_internal_objects_RB_NEXT
(struct appl_internal_object *); __attribute__((__unused__)) static
struct appl_internal_object *appl_internal_objects_RB_PREV(struct
appl_internal_object *); __attribute__((__unused__)) static struct
appl_internal_object *appl_internal_objects_RB_MINMAX(struct
appl_internal_objects *, int);
;
94
95void
96appl_internal_init(void)
97{
98 struct appl_internal_object *obj;
99 struct ber_oid oid;
100
101 appl_internal_region(&OID(MIB_system)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1 }, (sizeof((uint32_t [
]) { 1, 3, 6, 1, 2, 1, 1 }) / sizeof(uint32_t)) }
);
102 appl_internal_object(&OID(MIB_sysDescr)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 1 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 1 }) / sizeof(uint32_t)) }
, appl_internal_system, NULL((void *)0));
103 appl_internal_object(&OID(MIB_sysOID)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 2 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 2 }) / sizeof(uint32_t)) }
, appl_internal_system, NULL((void *)0));
104 appl_internal_object(&OID(MIB_sysUpTime)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 3 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 3 }) / sizeof(uint32_t)) }
, appl_internal_system, NULL((void *)0));
105 appl_internal_object(&OID(MIB_sysContact)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 4 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 4 }) / sizeof(uint32_t)) }
, appl_internal_system, NULL((void *)0));
106 appl_internal_object(&OID(MIB_sysName)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 5 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 5 }) / sizeof(uint32_t)) }
, appl_internal_system, NULL((void *)0));
107 appl_internal_object(&OID(MIB_sysLocation)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 6 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 6 }) / sizeof(uint32_t)) }
, appl_internal_system, NULL((void *)0));
108 appl_internal_object(&OID(MIB_sysServices)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 7 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 7 }) / sizeof(uint32_t)) }
, appl_internal_system, NULL((void *)0));
109 appl_internal_object(&OID(MIB_sysORLastChange)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 8 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 8 }) / sizeof(uint32_t)) }
, appl_sysorlastchange,
110 NULL((void *)0));
111
112 appl_internal_object(&OID(MIB_sysORID)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 9, 1, 2 }, (sizeof((
uint32_t []) { 1, 3, 6, 1, 2, 1, 1, 9, 1, 2 }) / sizeof(uint32_t
)) }
, appl_sysortable,
113 appl_sysortable_getnext);
114 appl_internal_object(&OID(MIB_sysORDescr)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 9, 1, 3 }, (sizeof((
uint32_t []) { 1, 3, 6, 1, 2, 1, 1, 9, 1, 3 }) / sizeof(uint32_t
)) }
, appl_sysortable,
115 appl_sysortable_getnext);
116 appl_internal_object(&OID(MIB_sysORUpTime)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 9, 1, 4 }, (sizeof((
uint32_t []) { 1, 3, 6, 1, 2, 1, 1, 9, 1, 4 }) / sizeof(uint32_t
)) }
, appl_sysortable,
117 appl_sysortable_getnext);
118
119 appl_internal_region(&OID(MIB_snmp)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11 }) / sizeof(uint32_t)) }
);
120 appl_internal_object(&OID(MIB_snmpInPkts)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 1 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 1 }) / sizeof(uint32_t)) }
, appl_internal_snmp, NULL((void *)0));
121 appl_internal_object(&OID(MIB_snmpOutPkts)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 2 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 2 }) / sizeof(uint32_t)) }
, appl_internal_snmp, NULL((void *)0));
122 appl_internal_object(&OID(MIB_snmpInBadVersions)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 3 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 3 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
123 NULL((void *)0));
124 appl_internal_object(&OID(MIB_snmpInBadCommunityNames)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 4 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 4 }) / sizeof(uint32_t)) }
,
125 appl_internal_snmp, NULL((void *)0));
126 appl_internal_object(&OID(MIB_snmpInBadCommunityUses)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 5 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 5 }) / sizeof(uint32_t)) }
,
127 appl_internal_snmp, NULL((void *)0));
128 appl_internal_object(&OID(MIB_snmpInASNParseErrs)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 6 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 6 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
129 NULL((void *)0));
130 appl_internal_object(&OID(MIB_snmpInTooBigs)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 8 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 8 }) / sizeof(uint32_t)) }
, appl_internal_snmp, NULL((void *)0));
131 appl_internal_object(&OID(MIB_snmpInNoSuchNames)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 9 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 9 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
132 NULL((void *)0));
133 appl_internal_object(&OID(MIB_snmpInBadValues)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 10 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 10 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
134 NULL((void *)0));
135 appl_internal_object(&OID(MIB_snmpInReadOnlys)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 11 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 11 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
136 NULL((void *)0));
137 appl_internal_object(&OID(MIB_snmpInGenErrs)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 12 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 12 }) / sizeof(uint32_t)) }
, appl_internal_snmp, NULL((void *)0));
138 appl_internal_object(&OID(MIB_snmpInTotalReqVars)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 13 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 13 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
139 NULL((void *)0));
140 appl_internal_object(&OID(MIB_snmpInTotalSetVars)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 14 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 14 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
141 NULL((void *)0));
142 appl_internal_object(&OID(MIB_snmpInGetRequests)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 15 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 15 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
143 NULL((void *)0));
144 appl_internal_object(&OID(MIB_snmpInGetNexts)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 16 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 16 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
145 NULL((void *)0));
146 appl_internal_object(&OID(MIB_snmpInSetRequests)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 17 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 17 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
147 NULL((void *)0));
148 appl_internal_object(&OID(MIB_snmpInGetResponses)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 18 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 18 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
149 NULL((void *)0));
150 appl_internal_object(&OID(MIB_snmpInTraps)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 19 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 19 }) / sizeof(uint32_t)) }
, appl_internal_snmp, NULL((void *)0));
151 appl_internal_object(&OID(MIB_snmpOutTooBigs)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 20 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 20 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
152 NULL((void *)0));
153 appl_internal_object(&OID(MIB_snmpOutNoSuchNames)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 21 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 21 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
154 NULL((void *)0));
155 appl_internal_object(&OID(MIB_snmpOutBadValues)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 22 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 22 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
156 NULL((void *)0));
157 appl_internal_object(&OID(MIB_snmpOutGenErrs)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 24 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 24 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
158 NULL((void *)0));
159 appl_internal_object(&OID(MIB_snmpOutGetRequests)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 25 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 25 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
160 NULL((void *)0));
161 appl_internal_object(&OID(MIB_snmpOutGetNexts)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 26 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 26 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
162 NULL((void *)0));
163 appl_internal_object(&OID(MIB_snmpOutSetRequests)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 27 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 27 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
164 NULL((void *)0));
165 appl_internal_object(&OID(MIB_snmpOutGetResponses)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 28 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 28 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
166 NULL((void *)0));
167 appl_internal_object(&OID(MIB_snmpOutTraps)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 29 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 29 }) / sizeof(uint32_t)) }
, appl_internal_snmp, NULL((void *)0));
168 appl_internal_object(&OID(MIB_snmpEnableAuthenTraps)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 30 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 30 }) / sizeof(uint32_t)) }
,
169 appl_internal_snmp, NULL((void *)0));
170 appl_internal_object(&OID(MIB_snmpSilentDrops)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 31 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 31 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
171 NULL((void *)0));
172 appl_internal_object(&OID(MIB_snmpProxyDrops)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 32 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 32 }) / sizeof(uint32_t)) }
, appl_internal_snmp,
173 NULL((void *)0));
174
175 appl_internal_region(&OID(MIB_snmpV2)(struct ber_oid){ { 1, 3, 6, 1, 6 }, (sizeof((uint32_t []) { 1
, 3, 6, 1, 6 }) / sizeof(uint32_t)) }
);
176 appl_internal_object(&OID(MIB_snmpEngineID)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 10, 2, 1, 1 }, (sizeof(
(uint32_t []) { 1, 3, 6, 1, 6, 3, 10, 2, 1, 1 }) / sizeof(uint32_t
)) }
, appl_internal_engine,
177 NULL((void *)0));
178 appl_internal_object(&OID(MIB_snmpEngineBoots)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 10, 2, 1, 2 }, (sizeof(
(uint32_t []) { 1, 3, 6, 1, 6, 3, 10, 2, 1, 2 }) / sizeof(uint32_t
)) }
, appl_internal_engine,
179 NULL((void *)0));
180 appl_internal_object(&OID(MIB_snmpEngineTime)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 10, 2, 1, 3 }, (sizeof(
(uint32_t []) { 1, 3, 6, 1, 6, 3, 10, 2, 1, 3 }) / sizeof(uint32_t
)) }
, appl_internal_engine,
181 NULL((void *)0));
182 appl_internal_object(&OID(MIB_snmpEngineMaxMsgSize)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 10, 2, 1, 4 }, (sizeof(
(uint32_t []) { 1, 3, 6, 1, 6, 3, 10, 2, 1, 4 }) / sizeof(uint32_t
)) }
,
183 appl_internal_engine, NULL((void *)0));
184
185 appl_internal_object(&OID(MIB_snmpUnavailableContexts)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 12, 1, 4 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 6, 3, 12, 1, 4 }) / sizeof(uint32_t)) }
,
186 appl_targetmib, NULL((void *)0));
187 appl_internal_object(&OID(MIB_snmpUnknownContexts)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 12, 1, 5 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 6, 3, 12, 1, 5 }) / sizeof(uint32_t)) }
,
188 appl_targetmib, NULL((void *)0));
189
190 appl_internal_object(&OID(MIB_usmStatsUnsupportedSecLevels)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 1 }, (sizeof(
(uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 1 }) / sizeof(uint32_t
)) }
,
191 appl_internal_usmstats, NULL((void *)0));
192 appl_internal_object(&OID(MIB_usmStatsNotInTimeWindow)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 2 }, (sizeof(
(uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 2 }) / sizeof(uint32_t
)) }
,
193 appl_internal_usmstats, NULL((void *)0));
194 appl_internal_object(&OID(MIB_usmStatsUnknownUserNames)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 3 }, (sizeof(
(uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 3 }) / sizeof(uint32_t
)) }
,
195 appl_internal_usmstats, NULL((void *)0));
196 appl_internal_object(&OID(MIB_usmStatsUnknownEngineId)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 4 }, (sizeof(
(uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 4 }) / sizeof(uint32_t
)) }
,
197 appl_internal_usmstats, NULL((void *)0));
198 appl_internal_object(&OID(MIB_usmStatsWrongDigests)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 5 }, (sizeof(
(uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 5 }) / sizeof(uint32_t
)) }
,
199 appl_internal_usmstats, NULL((void *)0));
200 appl_internal_object(&OID(MIB_usmStatsDecryptionErrors)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 6 }, (sizeof(
(uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 6 }) / sizeof(uint32_t
)) }
,
201 appl_internal_usmstats, NULL((void *)0));
202
203 while ((obj = RB_MIN(appl_internal_objects,appl_internal_objects_RB_MINMAX(&appl_internal_objects_conf
, -1)
204 &appl_internal_objects_conf)appl_internal_objects_RB_MINMAX(&appl_internal_objects_conf
, -1)
) != NULL((void *)0)) {
205 RB_REMOVE(appl_internal_objects,appl_internal_objects_RB_REMOVE(&appl_internal_objects_conf
, obj)
206 &appl_internal_objects_conf, obj)appl_internal_objects_RB_REMOVE(&appl_internal_objects_conf
, obj)
;
207 oid = obj->oid;
208 oid.bo_id[oid.bo_n++] = 0;
209 if (appl_register(NULL((void *)0), 150, 1, &oid,
210 1, 1, 0, 0, &appl_config) != APPL_ERROR_NOERROR) {
211 free(obj->stringval);
212 free(obj);
213 } else
214 RB_INSERT(appl_internal_objects, &appl_internal_objects,appl_internal_objects_RB_INSERT(&appl_internal_objects, obj
)
215 obj)appl_internal_objects_RB_INSERT(&appl_internal_objects, obj
)
;
216 }
217}
218
219void
220appl_internal_shutdown(void)
221{
222 struct appl_internal_object *object;
223
224 while ((object = RB_ROOT(&appl_internal_objects)(&appl_internal_objects)->rbh_root) != NULL((void *)0)) {
225 RB_REMOVE(appl_internal_objects, &appl_internal_objects,appl_internal_objects_RB_REMOVE(&appl_internal_objects, object
)
226 object)appl_internal_objects_RB_REMOVE(&appl_internal_objects, object
)
;
227 free(object->stringval);
228 free(object);
229 }
230
231 appl_close(&appl_internal);
232 appl_close(&appl_config);
233}
234
235void
236appl_internal_region(struct ber_oid *oid)
237{
238 enum appl_error error;
239 char oidbuf[1024];
240
241 error = appl_register(NULL((void *)0), 150, 1, oid, 0, 1, 0, 0, &appl_internal);
242 /*
243 * Ignore requestDenied, duplicateRegistration, and unsupportedContext
244 */
245 if (error == APPL_ERROR_PROCESSINGERROR ||
246 error == APPL_ERROR_PARSEERROR) {
247 smi_oid2string(oid, oidbuf, sizeof(oidbuf), 0);
248 fatalx("internal: Failed to register %s", oidbuf);
249 }
250}
251
252void
253appl_internal_object(struct ber_oid *oid,
254 struct ber_element *(*get)(struct ber_oid *),
255 struct ber_element *(*getnext)(int8_t, struct ber_oid *))
256{
257 struct appl_internal_object *obj;
258 char buf[1024];
259
260 if ((obj = calloc(1, sizeof(*obj))) == NULL((void *)0))
261 fatal(NULL((void *)0));
262 obj->oid = *oid;
263 obj->get = get;
264 obj->getnext = getnext;
265 obj->stringval = NULL((void *)0);
266
267 if (RB_INSERT(appl_internal_objects,appl_internal_objects_RB_INSERT(&appl_internal_objects, obj
)
268 &appl_internal_objects, obj)appl_internal_objects_RB_INSERT(&appl_internal_objects, obj
)
!= NULL((void *)0))
269 fatalx("%s: %s already registered", __func__,
270 smi_oid2string(oid, buf, sizeof(buf), 0));
271}
272
273const char *
274appl_internal_object_int(struct ber_oid *oid, int32_t val)
275{
276 struct appl_internal_object *obj;
277
278 if ((obj = calloc(1, sizeof(*obj))) == NULL((void *)0))
279 return strerror(errno(*__errno()));
280 obj->oid = *oid;
281 obj->get = appl_internal_get_int;
282 obj->getnext = NULL((void *)0);
283 obj->intval = val;
284 obj->stringval = NULL((void *)0);
285
286 if (RB_INSERT(appl_internal_objects,appl_internal_objects_RB_INSERT(&appl_internal_objects_conf
, obj)
287 &appl_internal_objects_conf, obj)appl_internal_objects_RB_INSERT(&appl_internal_objects_conf
, obj)
!= NULL((void *)0)) {
288 free(obj);
289 return "OID already defined";
290 }
291 return NULL((void *)0);
292}
293
294const char *
295appl_internal_object_string(struct ber_oid *oid, char *val)
296{
297 struct appl_internal_object *obj;
298
299 if ((obj = calloc(1, sizeof(*obj))) == NULL((void *)0))
300 return strerror(errno(*__errno()));
301 obj->oid = *oid;
302 obj->get = appl_internal_get_string;
303 obj->getnext = NULL((void *)0);
304 obj->stringval = val;
305
306 if (RB_INSERT(appl_internal_objects,appl_internal_objects_RB_INSERT(&appl_internal_objects_conf
, obj)
307 &appl_internal_objects_conf, obj)appl_internal_objects_RB_INSERT(&appl_internal_objects_conf
, obj)
!= NULL((void *)0)) {
308 free(obj);
309 return "OID already defined";
310 }
311 return NULL((void *)0);
312}
313
314void
315appl_internal_get(struct appl_backend *backend, __unused__attribute__((__unused__)) int32_t transactionid,
316 int32_t requestid, __unused__attribute__((__unused__)) const char *ctx, struct appl_varbind *vblist)
317{
318 struct ber_oid oid;
319 struct appl_internal_object *object;
320 struct appl_varbind *vb, *resp;
321 size_t i;
322 int r;
323
324 for (i = 0, vb = vblist; vb != NULL((void *)0); vb = vb->av_next, i++)
325 continue;
326
327 if ((resp = calloc(i, sizeof(*resp))) == NULL((void *)0)) {
328 log_warn("%s", backend->ab_name);
329 appl_response(backend, requestid, APPL_ERROR_GENERR, 1, vblist);
330 return;
331 }
332
333 for (i = 0, vb = vblist; vb != NULL((void *)0); vb = vb->av_next, i++) {
334 resp[i].av_oid = vb->av_oid;
335 if ((object = appl_internal_object_parent(&vb->av_oid)) == NULL((void *)0))
336 resp[i].av_value =
337 appl_exception(APPL_EXC_NOSUCHOBJECT);
338 else {
339 oid = object->oid;
340 /* Add 0 element for scalar */
341 if (object->getnext == NULL((void *)0))
342 oid.bo_id[oid.bo_n++] = 0;
343 r = ober_oid_cmp(&vb->av_oid, &oid);
344 if ((r == 0 && object->getnext == NULL((void *)0)) ||
345 (r == 2 && object->getnext != NULL((void *)0)))
346 resp[i].av_value = object->get(&resp[i].av_oid);
347 else
348 resp[i].av_value =
349 appl_exception(APPL_EXC_NOSUCHINSTANCE);
350 }
351 if (resp[i].av_value == NULL((void *)0)) {
352 log_warnx("%s: Failed to get value", backend->ab_name);
353 goto fail;
354 }
355 resp[i].av_next = &resp[i + 1];
356 }
357 resp[i - 1].av_next = NULL((void *)0);
358
359 appl_response(backend, requestid, APPL_ERROR_NOERROR, 0, resp);
360
361 free(resp);
362 return;
363
364 fail:
365 for (vb = resp; vb != NULL((void *)0); vb = vb->av_next)
366 ober_free_elements(vb->av_value);
367 free(resp);
368 appl_response(backend, requestid, APPL_ERROR_GENERR, i + 1, vblist);
369}
370
371void
372appl_internal_getnext(struct appl_backend *backend,
373 __unused__attribute__((__unused__)) int32_t transactionid, int32_t requestid, __unused__attribute__((__unused__)) const char *ctx,
374 struct appl_varbind *vblist)
375{
376 struct ber_oid oid;
377 struct appl_internal_object *object, search;
378 struct appl_varbind *vb, *resp;
379 size_t i;
380 int r;
381 int8_t include;
382
383 for (i = 0, vb = vblist; vb != NULL((void *)0); vb = vb->av_next, i++)
1
Assuming 'vb' is equal to NULL
2
Loop condition is false. Execution continues on line 386
384 continue;
385
386 if ((resp = calloc(i, sizeof(*resp))) == NULL((void *)0)) {
3
Memory is allocated
4
Assuming the condition is false
5
Taking false branch
387 log_warn("%s", backend->ab_name);
388 appl_response(backend, requestid, APPL_ERROR_GENERR, 1, vblist);
389 return;
390 }
391
392 for (i = 0, vb = vblist; vb != NULL((void *)0); vb = vb->av_next, i++) {
6
Loop condition is false. Execution continues on line 442
393 resp[i].av_oid = vb->av_oid;
394 object = appl_internal_object_parent(&vb->av_oid);
395 if (object == NULL((void *)0)) {
396 search.oid = vb->av_oid;
397 object = RB_NFIND(appl_internal_objects,appl_internal_objects_RB_NFIND(&appl_internal_objects, &
search)
398 &appl_internal_objects, &search)appl_internal_objects_RB_NFIND(&appl_internal_objects, &
search)
;
399 }
400
401 include = vb->av_include;
402 for (; object != NULL((void *)0); object = RB_NEXT(appl_internal_objects,appl_internal_objects_RB_NEXT(object)
403 &appl_internal_objects, object)appl_internal_objects_RB_NEXT(object), include = 1) {
404 if (object->getnext == NULL((void *)0)) {
405 oid = object->oid;
406 oid.bo_id[oid.bo_n++] = 0;
407 r = ober_oid_cmp(&resp[i].av_oid, &oid);
408 if (r > 0 || (r == 0 && !include))
409 continue;
410 resp[i].av_oid = oid;
411 resp[i].av_value = object->get(&oid);
412 break;
413 }
414 /* non-scalar */
415 if (ober_oid_cmp(&object->oid, &resp[i].av_oid) > 0) {
416 include = 1;
417 resp[i].av_oid = object->oid;
418 }
419
420 resp[i].av_value =
421 object->getnext(include, &resp[i].av_oid);
422 if (resp[i].av_value == NULL((void *)0) ||
423 resp[i].av_value->be_class != BER_CLASS_CONTEXT0x2)
424 break;
425 /* endOfMibView */
426 ober_free_elements(resp[i].av_value);
427 resp[i].av_value = NULL((void *)0);
428 }
429 if (ober_oid_cmp(&resp[i].av_oid, &vb->av_oid_end) >= 0 ||
430 object == NULL((void *)0)) {
431 resp[i].av_oid = vb->av_oid;
432 ober_free_elements(resp[i].av_value);
433 resp[i].av_value =
434 appl_exception(APPL_EXC_ENDOFMIBVIEW);
435 }
436 if (resp[i].av_value == NULL((void *)0)) {
437 log_warnx("%s: Failed to get value", backend->ab_name);
438 goto fail;
439 }
440 resp[i].av_next = &resp[i + 1];
441 }
442 resp[i - 1].av_next = NULL((void *)0);
7
Use of memory allocated with size zero
443
444 appl_response(backend, requestid, APPL_ERROR_NOERROR, 0, resp);
445
446 free(resp);
447 return;
448
449 fail:
450 for (vb = resp; vb != NULL((void *)0); vb = vb->av_next)
451 ober_free_elements(vb->av_value);
452 free(resp);
453 appl_response(backend, requestid, APPL_ERROR_GENERR, i + 1, vblist);
454}
455
456struct ber_element *
457appl_internal_snmp(struct ber_oid *oid)
458{
459 struct snmp_stats *stats = &snmpd_env->sc_stats;
460 struct ber_element *value = NULL((void *)0);
461
462 if (ober_oid_cmp(oid, &OID(MIB_snmpEnableAuthenTraps, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 30, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 30, 0 }) / sizeof(uint32_t)) }
) == 0)
463 return ober_add_integer(NULL((void *)0),
464 stats->snmp_enableauthentraps ? 1 : 2);
465 if (ober_oid_cmp(&OID(MIB_snmpInPkts, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 1, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 1, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
466 value = ober_add_integer(NULL((void *)0), stats->snmp_inpkts);
467 else if (ober_oid_cmp(&OID(MIB_snmpOutPkts, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 2, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 2, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
468 value = ober_add_integer(NULL((void *)0), stats->snmp_outpkts);
469 else if (ober_oid_cmp(&OID(MIB_snmpInBadVersions, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 3, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 3, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
470 value = ober_add_integer(NULL((void *)0), stats->snmp_inbadversions);
471 else if (ober_oid_cmp(&OID(MIB_snmpInBadCommunityNames, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 4, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 4, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
472 value = ober_add_integer(NULL((void *)0), stats->snmp_inbadcommunitynames);
473 else if (ober_oid_cmp(&OID(MIB_snmpInBadCommunityUses, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 5, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 5, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
474 value = ober_add_integer(NULL((void *)0), stats->snmp_inbadcommunityuses);
475 else if (ober_oid_cmp(&OID(MIB_snmpInASNParseErrs, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 6, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 6, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
476 value = ober_add_integer(NULL((void *)0), stats->snmp_inasnparseerrs);
477 else if (ober_oid_cmp(&OID(MIB_snmpInTooBigs, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 8, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 8, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
478 value = ober_add_integer(NULL((void *)0), stats->snmp_intoobigs);
479 else if (ober_oid_cmp(&OID(MIB_snmpInNoSuchNames, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 9, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 9, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
480 value = ober_add_integer(NULL((void *)0), stats->snmp_innosuchnames);
481 else if (ober_oid_cmp(&OID(MIB_snmpInBadValues, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 10, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 10, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
482 value = ober_add_integer(NULL((void *)0), stats->snmp_inbadvalues);
483 else if (ober_oid_cmp(&OID(MIB_snmpInReadOnlys, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 11, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 11, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
484 value = ober_add_integer(NULL((void *)0), stats->snmp_inreadonlys);
485 else if (ober_oid_cmp(&OID(MIB_snmpInGenErrs, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 12, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 12, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
486 value = ober_add_integer(NULL((void *)0), stats->snmp_ingenerrs);
487 else if (ober_oid_cmp(&OID(MIB_snmpInTotalReqVars, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 13, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 13, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
488 value = ober_add_integer(NULL((void *)0), stats->snmp_intotalreqvars);
489 else if (ober_oid_cmp(&OID(MIB_snmpInTotalSetVars, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 14, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 14, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
490 value = ober_add_integer(NULL((void *)0), stats->snmp_intotalsetvars);
491 else if (ober_oid_cmp(&OID(MIB_snmpInGetRequests, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 15, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 15, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
492 value = ober_add_integer(NULL((void *)0), stats->snmp_ingetrequests);
493 else if (ober_oid_cmp(&OID(MIB_snmpInGetNexts, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 16, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 16, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
494 value = ober_add_integer(NULL((void *)0), stats->snmp_ingetnexts);
495 else if (ober_oid_cmp(&OID(MIB_snmpInSetRequests, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 17, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 17, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
496 value = ober_add_integer(NULL((void *)0), stats->snmp_insetrequests);
497 else if (ober_oid_cmp(&OID(MIB_snmpInGetResponses, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 18, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 18, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
498 value = ober_add_integer(NULL((void *)0), stats->snmp_ingetresponses);
499 else if (ober_oid_cmp(&OID(MIB_snmpInTraps, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 19, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 19, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
500 value = ober_add_integer(NULL((void *)0), stats->snmp_intraps);
501 else if (ober_oid_cmp(&OID(MIB_snmpOutTooBigs, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 20, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 20, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
502 value = ober_add_integer(NULL((void *)0), stats->snmp_outtoobigs);
503 else if (ober_oid_cmp(&OID(MIB_snmpOutNoSuchNames, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 21, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 21, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
504 value = ober_add_integer(NULL((void *)0), stats->snmp_outnosuchnames);
505 else if (ober_oid_cmp(&OID(MIB_snmpOutBadValues, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 22, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 22, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
506 value = ober_add_integer(NULL((void *)0), stats->snmp_outbadvalues);
507 else if (ober_oid_cmp(&OID(MIB_snmpOutGenErrs, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 24, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 24, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
508 value = ober_add_integer(NULL((void *)0), stats->snmp_outgenerrs);
509 else if (ober_oid_cmp(&OID(MIB_snmpOutGetRequests, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 25, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 25, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
510 value = ober_add_integer(NULL((void *)0), stats->snmp_outgetrequests);
511 else if (ober_oid_cmp(&OID(MIB_snmpOutGetNexts, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 26, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 26, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
512 value = ober_add_integer(NULL((void *)0), stats->snmp_outgetnexts);
513 else if (ober_oid_cmp(&OID(MIB_snmpOutSetRequests, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 27, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 27, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
514 value = ober_add_integer(NULL((void *)0), stats->snmp_outsetrequests);
515 else if (ober_oid_cmp(&OID(MIB_snmpOutGetResponses, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 28, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 28, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
516 value = ober_add_integer(NULL((void *)0), stats->snmp_outgetresponses);
517 else if (ober_oid_cmp(&OID(MIB_snmpOutTraps, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 29, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 29, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
518 value = ober_add_integer(NULL((void *)0), stats->snmp_outtraps);
519 else if (ober_oid_cmp(&OID(MIB_snmpSilentDrops, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 31, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 31, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
520 value = ober_add_integer(NULL((void *)0), stats->snmp_silentdrops);
521 else if (ober_oid_cmp(&OID(MIB_snmpProxyDrops, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 11, 32, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 11, 32, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
522 value = ober_add_integer(NULL((void *)0), stats->snmp_proxydrops);
523
524 if (value != NULL((void *)0))
525 ober_set_header(value, BER_CLASS_APPLICATION0x1, SNMP_T_COUNTER32);
526 return value;
527}
528
529struct ber_element *
530appl_internal_engine(struct ber_oid *oid)
531{
532 if (ober_oid_cmp(&OID(MIB_snmpEngineID, 0)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 10, 2, 1, 1, 0 }, (sizeof
((uint32_t []) { 1, 3, 6, 1, 6, 3, 10, 2, 1, 1, 0 }) / sizeof
(uint32_t)) }
, oid) == 0)
533 return ober_add_nstring(NULL((void *)0), snmpd_env->sc_engineid,
534 snmpd_env->sc_engineid_len);
535 else if (ober_oid_cmp(&OID(MIB_snmpEngineBoots, 0)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 10, 2, 1, 2, 0 }, (sizeof
((uint32_t []) { 1, 3, 6, 1, 6, 3, 10, 2, 1, 2, 0 }) / sizeof
(uint32_t)) }
, oid) == 0)
536 return ober_add_integer(NULL((void *)0), snmpd_env->sc_engine_boots);
537 else if (ober_oid_cmp(&OID(MIB_snmpEngineTime, 0)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 10, 2, 1, 3, 0 }, (sizeof
((uint32_t []) { 1, 3, 6, 1, 6, 3, 10, 2, 1, 3, 0 }) / sizeof
(uint32_t)) }
, oid) == 0)
538 return ober_add_integer(NULL((void *)0), snmpd_engine_time());
539 else if (ober_oid_cmp(&OID(MIB_snmpEngineMaxMsgSize, 0)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 10, 2, 1, 4, 0 }, (sizeof
((uint32_t []) { 1, 3, 6, 1, 6, 3, 10, 2, 1, 4, 0 }) / sizeof
(uint32_t)) }
, oid) == 0)
540 return ober_add_integer(NULL((void *)0), READ_BUF_SIZE65535);
541 return NULL((void *)0);
542}
543
544struct ber_element *
545appl_internal_usmstats(struct ber_oid *oid)
546{
547 struct snmp_stats *stats = &snmpd_env->sc_stats;
548 struct ber_element *value = NULL((void *)0);
549
550 if (ober_oid_cmp(&OID(MIB_usmStatsUnsupportedSecLevels, 0)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 1, 0 }, (sizeof
((uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 1, 0 }) / sizeof
(uint32_t)) }
, oid) == 0)
551 value = ober_add_integer(NULL((void *)0), stats->snmp_usmbadseclevel);
552 else if (ober_oid_cmp(&OID(MIB_usmStatsNotInTimeWindow, 0)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 2, 0 }, (sizeof
((uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 2, 0 }) / sizeof
(uint32_t)) }
, oid) == 0)
553 value = ober_add_integer(NULL((void *)0), stats->snmp_usmtimewindow);
554 else if (ober_oid_cmp(&OID(MIB_usmStatsUnknownUserNames, 0)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 3, 0 }, (sizeof
((uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 3, 0 }) / sizeof
(uint32_t)) }
, oid) == 0)
555 value = ober_add_integer(NULL((void *)0), stats->snmp_usmnosuchuser);
556 else if (ober_oid_cmp(&OID(MIB_usmStatsUnknownEngineId, 0)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 4, 0 }, (sizeof
((uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 4, 0 }) / sizeof
(uint32_t)) }
, oid) == 0)
557 value = ober_add_integer(NULL((void *)0), stats->snmp_usmnosuchengine);
558 else if (ober_oid_cmp(&OID(MIB_usmStatsWrongDigests, 0)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 5, 0 }, (sizeof
((uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 5, 0 }) / sizeof
(uint32_t)) }
, oid) == 0)
559 value = ober_add_integer(NULL((void *)0), stats->snmp_usmwrongdigest);
560 else if (ober_oid_cmp(&OID(MIB_usmStatsDecryptionErrors, 0)(struct ber_oid){ { 1, 3, 6, 1, 6, 3, 15, 1, 1, 6, 0 }, (sizeof
((uint32_t []) { 1, 3, 6, 1, 6, 3, 15, 1, 1, 6, 0 }) / sizeof
(uint32_t)) }
, oid) == 0)
561 value = ober_add_integer(NULL((void *)0), stats->snmp_usmdecrypterr);
562
563 if (value != NULL((void *)0))
564 ober_set_header(value, BER_CLASS_APPLICATION0x1, SNMP_T_COUNTER32);
565
566 return value;
567}
568
569struct ber_element *
570appl_internal_system(struct ber_oid *oid)
571{
572 struct snmp_system *s = &snmpd_env->sc_system;
573 struct ber_element *value = NULL((void *)0);
574
575 if (ober_oid_cmp(&OID(MIB_sysDescr, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 1, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 1, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
576 return ober_add_string(NULL((void *)0), s->sys_descr);
577 else if (ober_oid_cmp(&OID(MIB_sysOID, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 2, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 2, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
578 return ober_add_oid(NULL((void *)0), &s->sys_oid);
579 else if (ober_oid_cmp(&OID(MIB_sysUpTime, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 3, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 3, 0 }) / sizeof(uint32_t)) }
, oid) == 0) {
580 value = ober_add_integer(NULL((void *)0), smi_getticks());
581 ober_set_header(value, BER_CLASS_APPLICATION0x1, SNMP_T_TIMETICKS);
582 } else if (ober_oid_cmp(&OID(MIB_sysContact, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 4, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 4, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
583 return ober_add_string(NULL((void *)0), s->sys_contact);
584 else if (ober_oid_cmp(&OID(MIB_sysName, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 5, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 5, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
585 return ober_add_string(NULL((void *)0), s->sys_name);
586 else if (ober_oid_cmp(&OID(MIB_sysLocation, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 6, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 6, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
587 return ober_add_string(NULL((void *)0), s->sys_location);
588 else if (ober_oid_cmp(&OID(MIB_sysServices, 0)(struct ber_oid){ { 1, 3, 6, 1, 2, 1, 1, 7, 0 }, (sizeof((uint32_t
[]) { 1, 3, 6, 1, 2, 1, 1, 7, 0 }) / sizeof(uint32_t)) }
, oid) == 0)
589 return ober_add_integer(NULL((void *)0), s->sys_services);
590 return value;
591}
592
593struct ber_element *
594appl_internal_get_int(struct ber_oid *oid)
595{
596 struct appl_internal_object *obj;
597
598 obj = appl_internal_object_parent(oid);
599 return ober_add_integer(NULL((void *)0), obj->intval);
600}
601
602struct ber_element *
603appl_internal_get_string(struct ber_oid *oid)
604{
605 struct appl_internal_object *obj;
606
607 obj = appl_internal_object_parent(oid);
608 return ober_add_string(NULL((void *)0), obj->stringval);
609}
610
611struct appl_internal_object *
612appl_internal_object_parent(struct ber_oid *oid)
613{
614 struct appl_internal_object *object, search;
615
616 search.oid = *oid;
617 do {
618 if ((object = RB_FIND(appl_internal_objects,appl_internal_objects_RB_FIND(&appl_internal_objects, &
search)
619 &appl_internal_objects, &search)appl_internal_objects_RB_FIND(&appl_internal_objects, &
search)
) != NULL((void *)0))
620 return object;
621 } while (--search.oid.bo_n > 0);
622
623 return NULL((void *)0);
624}
625
626int
627appl_internal_object_cmp(struct appl_internal_object *o1,
628 struct appl_internal_object *o2)
629{
630 return ober_oid_cmp(&o1->oid, &o2->oid);
631}
632
633RB_GENERATE_STATIC(appl_internal_objects, appl_internal_object, entry,__attribute__((__unused__)) static void appl_internal_objects_RB_INSERT_COLOR
(struct appl_internal_objects *head, struct appl_internal_object
*elm) { struct appl_internal_object *parent, *gparent, *tmp;
while ((parent = (elm)->entry.rbe_parent) && (parent
)->entry.rbe_color == 1) { gparent = (parent)->entry.rbe_parent
; if (parent == (gparent)->entry.rbe_left) { tmp = (gparent
)->entry.rbe_right; if (tmp && (tmp)->entry.rbe_color
== 1) { (tmp)->entry.rbe_color = 0; do { (parent)->entry
.rbe_color = 0; (gparent)->entry.rbe_color = 1; } while (0
); elm = gparent; continue; } if ((parent)->entry.rbe_right
== elm) { do { (tmp) = (parent)->entry.rbe_right; if (((parent
)->entry.rbe_right = (tmp)->entry.rbe_left)) { ((tmp)->
entry.rbe_left)->entry.rbe_parent = (parent); } do {} while
(0); if (((tmp)->entry.rbe_parent = (parent)->entry.rbe_parent
)) { if ((parent) == ((parent)->entry.rbe_parent)->entry
.rbe_left) ((parent)->entry.rbe_parent)->entry.rbe_left
= (tmp); else ((parent)->entry.rbe_parent)->entry.rbe_right
= (tmp); } else (head)->rbh_root = (tmp); (tmp)->entry
.rbe_left = (parent); (parent)->entry.rbe_parent = (tmp); do
{} while (0); if (((tmp)->entry.rbe_parent)) do {} while (
0); } while (0); tmp = parent; parent = elm; elm = tmp; } do {
(parent)->entry.rbe_color = 0; (gparent)->entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->entry.rbe_left;
if (((gparent)->entry.rbe_left = (tmp)->entry.rbe_right
)) { ((tmp)->entry.rbe_right)->entry.rbe_parent = (gparent
); } do {} while (0); if (((tmp)->entry.rbe_parent = (gparent
)->entry.rbe_parent)) { if ((gparent) == ((gparent)->entry
.rbe_parent)->entry.rbe_left) ((gparent)->entry.rbe_parent
)->entry.rbe_left = (tmp); else ((gparent)->entry.rbe_parent
)->entry.rbe_right = (tmp); } else (head)->rbh_root = (
tmp); (tmp)->entry.rbe_right = (gparent); (gparent)->entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->entry.rbe_parent
)) do {} while (0); } while (0); } else { tmp = (gparent)->
entry.rbe_left; if (tmp && (tmp)->entry.rbe_color ==
1) { (tmp)->entry.rbe_color = 0; do { (parent)->entry.
rbe_color = 0; (gparent)->entry.rbe_color = 1; } while (0)
; elm = gparent; continue; } if ((parent)->entry.rbe_left ==
elm) { do { (tmp) = (parent)->entry.rbe_left; if (((parent
)->entry.rbe_left = (tmp)->entry.rbe_right)) { ((tmp)->
entry.rbe_right)->entry.rbe_parent = (parent); } do {} while
(0); if (((tmp)->entry.rbe_parent = (parent)->entry.rbe_parent
)) { if ((parent) == ((parent)->entry.rbe_parent)->entry
.rbe_left) ((parent)->entry.rbe_parent)->entry.rbe_left
= (tmp); else ((parent)->entry.rbe_parent)->entry.rbe_right
= (tmp); } else (head)->rbh_root = (tmp); (tmp)->entry
.rbe_right = (parent); (parent)->entry.rbe_parent = (tmp);
do {} while (0); if (((tmp)->entry.rbe_parent)) do {} while
(0); } while (0); tmp = parent; parent = elm; elm = tmp; } do
{ (parent)->entry.rbe_color = 0; (gparent)->entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->entry.rbe_right
; if (((gparent)->entry.rbe_right = (tmp)->entry.rbe_left
)) { ((tmp)->entry.rbe_left)->entry.rbe_parent = (gparent
); } do {} while (0); if (((tmp)->entry.rbe_parent = (gparent
)->entry.rbe_parent)) { if ((gparent) == ((gparent)->entry
.rbe_parent)->entry.rbe_left) ((gparent)->entry.rbe_parent
)->entry.rbe_left = (tmp); else ((gparent)->entry.rbe_parent
)->entry.rbe_right = (tmp); } else (head)->rbh_root = (
tmp); (tmp)->entry.rbe_left = (gparent); (gparent)->entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->entry.rbe_parent
)) do {} while (0); } while (0); } } (head->rbh_root)->
entry.rbe_color = 0; } __attribute__((__unused__)) static void
appl_internal_objects_RB_REMOVE_COLOR(struct appl_internal_objects
*head, struct appl_internal_object *parent, struct appl_internal_object
*elm) { struct appl_internal_object *tmp; while ((elm == ((void
*)0) || (elm)->entry.rbe_color == 0) && elm != (head
)->rbh_root) { if ((parent)->entry.rbe_left == elm) { tmp
= (parent)->entry.rbe_right; if ((tmp)->entry.rbe_color
== 1) { do { (tmp)->entry.rbe_color = 0; (parent)->entry
.rbe_color = 1; } while (0); do { (tmp) = (parent)->entry.
rbe_right; if (((parent)->entry.rbe_right = (tmp)->entry
.rbe_left)) { ((tmp)->entry.rbe_left)->entry.rbe_parent
= (parent); } do {} while (0); if (((tmp)->entry.rbe_parent
= (parent)->entry.rbe_parent)) { if ((parent) == ((parent
)->entry.rbe_parent)->entry.rbe_left) ((parent)->entry
.rbe_parent)->entry.rbe_left = (tmp); else ((parent)->entry
.rbe_parent)->entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->entry.rbe_left = (parent); (parent)->entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->entry.rbe_parent
)) do {} while (0); } while (0); tmp = (parent)->entry.rbe_right
; } if (((tmp)->entry.rbe_left == ((void *)0) || ((tmp)->
entry.rbe_left)->entry.rbe_color == 0) && ((tmp)->
entry.rbe_right == ((void *)0) || ((tmp)->entry.rbe_right)
->entry.rbe_color == 0)) { (tmp)->entry.rbe_color = 1; elm
= parent; parent = (elm)->entry.rbe_parent; } else { if (
(tmp)->entry.rbe_right == ((void *)0) || ((tmp)->entry.
rbe_right)->entry.rbe_color == 0) { struct appl_internal_object
*oleft; if ((oleft = (tmp)->entry.rbe_left)) (oleft)->
entry.rbe_color = 0; (tmp)->entry.rbe_color = 1; do { (oleft
) = (tmp)->entry.rbe_left; if (((tmp)->entry.rbe_left =
(oleft)->entry.rbe_right)) { ((oleft)->entry.rbe_right
)->entry.rbe_parent = (tmp); } do {} while (0); if (((oleft
)->entry.rbe_parent = (tmp)->entry.rbe_parent)) { if ((
tmp) == ((tmp)->entry.rbe_parent)->entry.rbe_left) ((tmp
)->entry.rbe_parent)->entry.rbe_left = (oleft); else ((
tmp)->entry.rbe_parent)->entry.rbe_right = (oleft); } else
(head)->rbh_root = (oleft); (oleft)->entry.rbe_right =
(tmp); (tmp)->entry.rbe_parent = (oleft); do {} while (0)
; if (((oleft)->entry.rbe_parent)) do {} while (0); } while
(0); tmp = (parent)->entry.rbe_right; } (tmp)->entry.rbe_color
= (parent)->entry.rbe_color; (parent)->entry.rbe_color
= 0; if ((tmp)->entry.rbe_right) ((tmp)->entry.rbe_right
)->entry.rbe_color = 0; do { (tmp) = (parent)->entry.rbe_right
; if (((parent)->entry.rbe_right = (tmp)->entry.rbe_left
)) { ((tmp)->entry.rbe_left)->entry.rbe_parent = (parent
); } do {} while (0); if (((tmp)->entry.rbe_parent = (parent
)->entry.rbe_parent)) { if ((parent) == ((parent)->entry
.rbe_parent)->entry.rbe_left) ((parent)->entry.rbe_parent
)->entry.rbe_left = (tmp); else ((parent)->entry.rbe_parent
)->entry.rbe_right = (tmp); } else (head)->rbh_root = (
tmp); (tmp)->entry.rbe_left = (parent); (parent)->entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->entry.rbe_parent
)) do {} while (0); } while (0); elm = (head)->rbh_root; break
; } } else { tmp = (parent)->entry.rbe_left; if ((tmp)->
entry.rbe_color == 1) { do { (tmp)->entry.rbe_color = 0; (
parent)->entry.rbe_color = 1; } while (0); do { (tmp) = (parent
)->entry.rbe_left; if (((parent)->entry.rbe_left = (tmp
)->entry.rbe_right)) { ((tmp)->entry.rbe_right)->entry
.rbe_parent = (parent); } do {} while (0); if (((tmp)->entry
.rbe_parent = (parent)->entry.rbe_parent)) { if ((parent) ==
((parent)->entry.rbe_parent)->entry.rbe_left) ((parent
)->entry.rbe_parent)->entry.rbe_left = (tmp); else ((parent
)->entry.rbe_parent)->entry.rbe_right = (tmp); } else (
head)->rbh_root = (tmp); (tmp)->entry.rbe_right = (parent
); (parent)->entry.rbe_parent = (tmp); do {} while (0); if
(((tmp)->entry.rbe_parent)) do {} while (0); } while (0);
tmp = (parent)->entry.rbe_left; } if (((tmp)->entry.rbe_left
== ((void *)0) || ((tmp)->entry.rbe_left)->entry.rbe_color
== 0) && ((tmp)->entry.rbe_right == ((void *)0) ||
((tmp)->entry.rbe_right)->entry.rbe_color == 0)) { (tmp
)->entry.rbe_color = 1; elm = parent; parent = (elm)->entry
.rbe_parent; } else { if ((tmp)->entry.rbe_left == ((void *
)0) || ((tmp)->entry.rbe_left)->entry.rbe_color == 0) {
struct appl_internal_object *oright; if ((oright = (tmp)->
entry.rbe_right)) (oright)->entry.rbe_color = 0; (tmp)->
entry.rbe_color = 1; do { (oright) = (tmp)->entry.rbe_right
; if (((tmp)->entry.rbe_right = (oright)->entry.rbe_left
)) { ((oright)->entry.rbe_left)->entry.rbe_parent = (tmp
); } do {} while (0); if (((oright)->entry.rbe_parent = (tmp
)->entry.rbe_parent)) { if ((tmp) == ((tmp)->entry.rbe_parent
)->entry.rbe_left) ((tmp)->entry.rbe_parent)->entry.
rbe_left = (oright); else ((tmp)->entry.rbe_parent)->entry
.rbe_right = (oright); } else (head)->rbh_root = (oright);
(oright)->entry.rbe_left = (tmp); (tmp)->entry.rbe_parent
= (oright); do {} while (0); if (((oright)->entry.rbe_parent
)) do {} while (0); } while (0); tmp = (parent)->entry.rbe_left
; } (tmp)->entry.rbe_color = (parent)->entry.rbe_color;
(parent)->entry.rbe_color = 0; if ((tmp)->entry.rbe_left
) ((tmp)->entry.rbe_left)->entry.rbe_color = 0; do { (tmp
) = (parent)->entry.rbe_left; if (((parent)->entry.rbe_left
= (tmp)->entry.rbe_right)) { ((tmp)->entry.rbe_right)->
entry.rbe_parent = (parent); } do {} while (0); if (((tmp)->
entry.rbe_parent = (parent)->entry.rbe_parent)) { if ((parent
) == ((parent)->entry.rbe_parent)->entry.rbe_left) ((parent
)->entry.rbe_parent)->entry.rbe_left = (tmp); else ((parent
)->entry.rbe_parent)->entry.rbe_right = (tmp); } else (
head)->rbh_root = (tmp); (tmp)->entry.rbe_right = (parent
); (parent)->entry.rbe_parent = (tmp); do {} while (0); if
(((tmp)->entry.rbe_parent)) do {} while (0); } while (0);
elm = (head)->rbh_root; break; } } } if (elm) (elm)->entry
.rbe_color = 0; } __attribute__((__unused__)) static struct appl_internal_object
* appl_internal_objects_RB_REMOVE(struct appl_internal_objects
*head, struct appl_internal_object *elm) { struct appl_internal_object
*child, *parent, *old = elm; int color; if ((elm)->entry.
rbe_left == ((void *)0)) child = (elm)->entry.rbe_right; else
if ((elm)->entry.rbe_right == ((void *)0)) child = (elm)->
entry.rbe_left; else { struct appl_internal_object *left; elm
= (elm)->entry.rbe_right; while ((left = (elm)->entry.
rbe_left)) elm = left; child = (elm)->entry.rbe_right; parent
= (elm)->entry.rbe_parent; color = (elm)->entry.rbe_color
; if (child) (child)->entry.rbe_parent = parent; if (parent
) { if ((parent)->entry.rbe_left == elm) (parent)->entry
.rbe_left = child; else (parent)->entry.rbe_right = child;
do {} while (0); } else (head)->rbh_root = child; if ((elm
)->entry.rbe_parent == old) parent = elm; (elm)->entry =
(old)->entry; if ((old)->entry.rbe_parent) { if (((old
)->entry.rbe_parent)->entry.rbe_left == old) ((old)->
entry.rbe_parent)->entry.rbe_left = elm; else ((old)->entry
.rbe_parent)->entry.rbe_right = elm; do {} while (0); } else
(head)->rbh_root = elm; ((old)->entry.rbe_left)->entry
.rbe_parent = elm; if ((old)->entry.rbe_right) ((old)->
entry.rbe_right)->entry.rbe_parent = elm; if (parent) { left
= parent; do { do {} while (0); } while ((left = (left)->
entry.rbe_parent)); } goto color; } parent = (elm)->entry.
rbe_parent; color = (elm)->entry.rbe_color; if (child) (child
)->entry.rbe_parent = parent; if (parent) { if ((parent)->
entry.rbe_left == elm) (parent)->entry.rbe_left = child; else
(parent)->entry.rbe_right = child; do {} while (0); } else
(head)->rbh_root = child; color: if (color == 0) appl_internal_objects_RB_REMOVE_COLOR
(head, parent, child); return (old); } __attribute__((__unused__
)) static struct appl_internal_object * appl_internal_objects_RB_INSERT
(struct appl_internal_objects *head, struct appl_internal_object
*elm) { struct appl_internal_object *tmp; struct appl_internal_object
*parent = ((void *)0); int comp = 0; tmp = (head)->rbh_root
; while (tmp) { parent = tmp; comp = (appl_internal_object_cmp
)(elm, parent); if (comp < 0) tmp = (tmp)->entry.rbe_left
; else if (comp > 0) tmp = (tmp)->entry.rbe_right; else
return (tmp); } do { (elm)->entry.rbe_parent = parent; (elm
)->entry.rbe_left = (elm)->entry.rbe_right = ((void *)0
); (elm)->entry.rbe_color = 1; } while (0); if (parent != (
(void *)0)) { if (comp < 0) (parent)->entry.rbe_left = elm
; else (parent)->entry.rbe_right = elm; do {} while (0); }
else (head)->rbh_root = elm; appl_internal_objects_RB_INSERT_COLOR
(head, elm); return (((void *)0)); } __attribute__((__unused__
)) static struct appl_internal_object * appl_internal_objects_RB_FIND
(struct appl_internal_objects *head, struct appl_internal_object
*elm) { struct appl_internal_object *tmp = (head)->rbh_root
; int comp; while (tmp) { comp = appl_internal_object_cmp(elm
, tmp); if (comp < 0) tmp = (tmp)->entry.rbe_left; else
if (comp > 0) tmp = (tmp)->entry.rbe_right; else return
(tmp); } return (((void *)0)); } __attribute__((__unused__))
static struct appl_internal_object * appl_internal_objects_RB_NFIND
(struct appl_internal_objects *head, struct appl_internal_object
*elm) { struct appl_internal_object *tmp = (head)->rbh_root
; struct appl_internal_object *res = ((void *)0); int comp; while
(tmp) { comp = appl_internal_object_cmp(elm, tmp); if (comp <
0) { res = tmp; tmp = (tmp)->entry.rbe_left; } else if (comp
> 0) tmp = (tmp)->entry.rbe_right; else return (tmp); }
return (res); } __attribute__((__unused__)) static struct appl_internal_object
* appl_internal_objects_RB_NEXT(struct appl_internal_object *
elm) { if ((elm)->entry.rbe_right) { elm = (elm)->entry
.rbe_right; while ((elm)->entry.rbe_left) elm = (elm)->
entry.rbe_left; } else { if ((elm)->entry.rbe_parent &&
(elm == ((elm)->entry.rbe_parent)->entry.rbe_left)) elm
= (elm)->entry.rbe_parent; else { while ((elm)->entry.
rbe_parent && (elm == ((elm)->entry.rbe_parent)->
entry.rbe_right)) elm = (elm)->entry.rbe_parent; elm = (elm
)->entry.rbe_parent; } } return (elm); } __attribute__((__unused__
)) static struct appl_internal_object * appl_internal_objects_RB_PREV
(struct appl_internal_object *elm) { if ((elm)->entry.rbe_left
) { elm = (elm)->entry.rbe_left; while ((elm)->entry.rbe_right
) elm = (elm)->entry.rbe_right; } else { if ((elm)->entry
.rbe_parent && (elm == ((elm)->entry.rbe_parent)->
entry.rbe_right)) elm = (elm)->entry.rbe_parent; else { while
((elm)->entry.rbe_parent && (elm == ((elm)->entry
.rbe_parent)->entry.rbe_left)) elm = (elm)->entry.rbe_parent
; elm = (elm)->entry.rbe_parent; } } return (elm); } __attribute__
((__unused__)) static struct appl_internal_object * appl_internal_objects_RB_MINMAX
(struct appl_internal_objects *head, int val) { struct appl_internal_object
*tmp = (head)->rbh_root; struct appl_internal_object *parent
= ((void *)0); while (tmp) { parent = tmp; if (val < 0) tmp
= (tmp)->entry.rbe_left; else tmp = (tmp)->entry.rbe_right
; } return (parent); }
634 appl_internal_object_cmp)__attribute__((__unused__)) static void appl_internal_objects_RB_INSERT_COLOR
(struct appl_internal_objects *head, struct appl_internal_object
*elm) { struct appl_internal_object *parent, *gparent, *tmp;
while ((parent = (elm)->entry.rbe_parent) && (parent
)->entry.rbe_color == 1) { gparent = (parent)->entry.rbe_parent
; if (parent == (gparent)->entry.rbe_left) { tmp = (gparent
)->entry.rbe_right; if (tmp && (tmp)->entry.rbe_color
== 1) { (tmp)->entry.rbe_color = 0; do { (parent)->entry
.rbe_color = 0; (gparent)->entry.rbe_color = 1; } while (0
); elm = gparent; continue; } if ((parent)->entry.rbe_right
== elm) { do { (tmp) = (parent)->entry.rbe_right; if (((parent
)->entry.rbe_right = (tmp)->entry.rbe_left)) { ((tmp)->
entry.rbe_left)->entry.rbe_parent = (parent); } do {} while
(0); if (((tmp)->entry.rbe_parent = (parent)->entry.rbe_parent
)) { if ((parent) == ((parent)->entry.rbe_parent)->entry
.rbe_left) ((parent)->entry.rbe_parent)->entry.rbe_left
= (tmp); else ((parent)->entry.rbe_parent)->entry.rbe_right
= (tmp); } else (head)->rbh_root = (tmp); (tmp)->entry
.rbe_left = (parent); (parent)->entry.rbe_parent = (tmp); do
{} while (0); if (((tmp)->entry.rbe_parent)) do {} while (
0); } while (0); tmp = parent; parent = elm; elm = tmp; } do {
(parent)->entry.rbe_color = 0; (gparent)->entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->entry.rbe_left;
if (((gparent)->entry.rbe_left = (tmp)->entry.rbe_right
)) { ((tmp)->entry.rbe_right)->entry.rbe_parent = (gparent
); } do {} while (0); if (((tmp)->entry.rbe_parent = (gparent
)->entry.rbe_parent)) { if ((gparent) == ((gparent)->entry
.rbe_parent)->entry.rbe_left) ((gparent)->entry.rbe_parent
)->entry.rbe_left = (tmp); else ((gparent)->entry.rbe_parent
)->entry.rbe_right = (tmp); } else (head)->rbh_root = (
tmp); (tmp)->entry.rbe_right = (gparent); (gparent)->entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->entry.rbe_parent
)) do {} while (0); } while (0); } else { tmp = (gparent)->
entry.rbe_left; if (tmp && (tmp)->entry.rbe_color ==
1) { (tmp)->entry.rbe_color = 0; do { (parent)->entry.
rbe_color = 0; (gparent)->entry.rbe_color = 1; } while (0)
; elm = gparent; continue; } if ((parent)->entry.rbe_left ==
elm) { do { (tmp) = (parent)->entry.rbe_left; if (((parent
)->entry.rbe_left = (tmp)->entry.rbe_right)) { ((tmp)->
entry.rbe_right)->entry.rbe_parent = (parent); } do {} while
(0); if (((tmp)->entry.rbe_parent = (parent)->entry.rbe_parent
)) { if ((parent) == ((parent)->entry.rbe_parent)->entry
.rbe_left) ((parent)->entry.rbe_parent)->entry.rbe_left
= (tmp); else ((parent)->entry.rbe_parent)->entry.rbe_right
= (tmp); } else (head)->rbh_root = (tmp); (tmp)->entry
.rbe_right = (parent); (parent)->entry.rbe_parent = (tmp);
do {} while (0); if (((tmp)->entry.rbe_parent)) do {} while
(0); } while (0); tmp = parent; parent = elm; elm = tmp; } do
{ (parent)->entry.rbe_color = 0; (gparent)->entry.rbe_color
= 1; } while (0); do { (tmp) = (gparent)->entry.rbe_right
; if (((gparent)->entry.rbe_right = (tmp)->entry.rbe_left
)) { ((tmp)->entry.rbe_left)->entry.rbe_parent = (gparent
); } do {} while (0); if (((tmp)->entry.rbe_parent = (gparent
)->entry.rbe_parent)) { if ((gparent) == ((gparent)->entry
.rbe_parent)->entry.rbe_left) ((gparent)->entry.rbe_parent
)->entry.rbe_left = (tmp); else ((gparent)->entry.rbe_parent
)->entry.rbe_right = (tmp); } else (head)->rbh_root = (
tmp); (tmp)->entry.rbe_left = (gparent); (gparent)->entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->entry.rbe_parent
)) do {} while (0); } while (0); } } (head->rbh_root)->
entry.rbe_color = 0; } __attribute__((__unused__)) static void
appl_internal_objects_RB_REMOVE_COLOR(struct appl_internal_objects
*head, struct appl_internal_object *parent, struct appl_internal_object
*elm) { struct appl_internal_object *tmp; while ((elm == ((void
*)0) || (elm)->entry.rbe_color == 0) && elm != (head
)->rbh_root) { if ((parent)->entry.rbe_left == elm) { tmp
= (parent)->entry.rbe_right; if ((tmp)->entry.rbe_color
== 1) { do { (tmp)->entry.rbe_color = 0; (parent)->entry
.rbe_color = 1; } while (0); do { (tmp) = (parent)->entry.
rbe_right; if (((parent)->entry.rbe_right = (tmp)->entry
.rbe_left)) { ((tmp)->entry.rbe_left)->entry.rbe_parent
= (parent); } do {} while (0); if (((tmp)->entry.rbe_parent
= (parent)->entry.rbe_parent)) { if ((parent) == ((parent
)->entry.rbe_parent)->entry.rbe_left) ((parent)->entry
.rbe_parent)->entry.rbe_left = (tmp); else ((parent)->entry
.rbe_parent)->entry.rbe_right = (tmp); } else (head)->rbh_root
= (tmp); (tmp)->entry.rbe_left = (parent); (parent)->entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->entry.rbe_parent
)) do {} while (0); } while (0); tmp = (parent)->entry.rbe_right
; } if (((tmp)->entry.rbe_left == ((void *)0) || ((tmp)->
entry.rbe_left)->entry.rbe_color == 0) && ((tmp)->
entry.rbe_right == ((void *)0) || ((tmp)->entry.rbe_right)
->entry.rbe_color == 0)) { (tmp)->entry.rbe_color = 1; elm
= parent; parent = (elm)->entry.rbe_parent; } else { if (
(tmp)->entry.rbe_right == ((void *)0) || ((tmp)->entry.
rbe_right)->entry.rbe_color == 0) { struct appl_internal_object
*oleft; if ((oleft = (tmp)->entry.rbe_left)) (oleft)->
entry.rbe_color = 0; (tmp)->entry.rbe_color = 1; do { (oleft
) = (tmp)->entry.rbe_left; if (((tmp)->entry.rbe_left =
(oleft)->entry.rbe_right)) { ((oleft)->entry.rbe_right
)->entry.rbe_parent = (tmp); } do {} while (0); if (((oleft
)->entry.rbe_parent = (tmp)->entry.rbe_parent)) { if ((
tmp) == ((tmp)->entry.rbe_parent)->entry.rbe_left) ((tmp
)->entry.rbe_parent)->entry.rbe_left = (oleft); else ((
tmp)->entry.rbe_parent)->entry.rbe_right = (oleft); } else
(head)->rbh_root = (oleft); (oleft)->entry.rbe_right =
(tmp); (tmp)->entry.rbe_parent = (oleft); do {} while (0)
; if (((oleft)->entry.rbe_parent)) do {} while (0); } while
(0); tmp = (parent)->entry.rbe_right; } (tmp)->entry.rbe_color
= (parent)->entry.rbe_color; (parent)->entry.rbe_color
= 0; if ((tmp)->entry.rbe_right) ((tmp)->entry.rbe_right
)->entry.rbe_color = 0; do { (tmp) = (parent)->entry.rbe_right
; if (((parent)->entry.rbe_right = (tmp)->entry.rbe_left
)) { ((tmp)->entry.rbe_left)->entry.rbe_parent = (parent
); } do {} while (0); if (((tmp)->entry.rbe_parent = (parent
)->entry.rbe_parent)) { if ((parent) == ((parent)->entry
.rbe_parent)->entry.rbe_left) ((parent)->entry.rbe_parent
)->entry.rbe_left = (tmp); else ((parent)->entry.rbe_parent
)->entry.rbe_right = (tmp); } else (head)->rbh_root = (
tmp); (tmp)->entry.rbe_left = (parent); (parent)->entry
.rbe_parent = (tmp); do {} while (0); if (((tmp)->entry.rbe_parent
)) do {} while (0); } while (0); elm = (head)->rbh_root; break
; } } else { tmp = (parent)->entry.rbe_left; if ((tmp)->
entry.rbe_color == 1) { do { (tmp)->entry.rbe_color = 0; (
parent)->entry.rbe_color = 1; } while (0); do { (tmp) = (parent
)->entry.rbe_left; if (((parent)->entry.rbe_left = (tmp
)->entry.rbe_right)) { ((tmp)->entry.rbe_right)->entry
.rbe_parent = (parent); } do {} while (0); if (((tmp)->entry
.rbe_parent = (parent)->entry.rbe_parent)) { if ((parent) ==
((parent)->entry.rbe_parent)->entry.rbe_left) ((parent
)->entry.rbe_parent)->entry.rbe_left = (tmp); else ((parent
)->entry.rbe_parent)->entry.rbe_right = (tmp); } else (
head)->rbh_root = (tmp); (tmp)->entry.rbe_right = (parent
); (parent)->entry.rbe_parent = (tmp); do {} while (0); if
(((tmp)->entry.rbe_parent)) do {} while (0); } while (0);
tmp = (parent)->entry.rbe_left; } if (((tmp)->entry.rbe_left
== ((void *)0) || ((tmp)->entry.rbe_left)->entry.rbe_color
== 0) && ((tmp)->entry.rbe_right == ((void *)0) ||
((tmp)->entry.rbe_right)->entry.rbe_color == 0)) { (tmp
)->entry.rbe_color = 1; elm = parent; parent = (elm)->entry
.rbe_parent; } else { if ((tmp)->entry.rbe_left == ((void *
)0) || ((tmp)->entry.rbe_left)->entry.rbe_color == 0) {
struct appl_internal_object *oright; if ((oright = (tmp)->
entry.rbe_right)) (oright)->entry.rbe_color = 0; (tmp)->
entry.rbe_color = 1; do { (oright) = (tmp)->entry.rbe_right
; if (((tmp)->entry.rbe_right = (oright)->entry.rbe_left
)) { ((oright)->entry.rbe_left)->entry.rbe_parent = (tmp
); } do {} while (0); if (((oright)->entry.rbe_parent = (tmp
)->entry.rbe_parent)) { if ((tmp) == ((tmp)->entry.rbe_parent
)->entry.rbe_left) ((tmp)->entry.rbe_parent)->entry.
rbe_left = (oright); else ((tmp)->entry.rbe_parent)->entry
.rbe_right = (oright); } else (head)->rbh_root = (oright);
(oright)->entry.rbe_left = (tmp); (tmp)->entry.rbe_parent
= (oright); do {} while (0); if (((oright)->entry.rbe_parent
)) do {} while (0); } while (0); tmp = (parent)->entry.rbe_left
; } (tmp)->entry.rbe_color = (parent)->entry.rbe_color;
(parent)->entry.rbe_color = 0; if ((tmp)->entry.rbe_left
) ((tmp)->entry.rbe_left)->entry.rbe_color = 0; do { (tmp
) = (parent)->entry.rbe_left; if (((parent)->entry.rbe_left
= (tmp)->entry.rbe_right)) { ((tmp)->entry.rbe_right)->
entry.rbe_parent = (parent); } do {} while (0); if (((tmp)->
entry.rbe_parent = (parent)->entry.rbe_parent)) { if ((parent
) == ((parent)->entry.rbe_parent)->entry.rbe_left) ((parent
)->entry.rbe_parent)->entry.rbe_left = (tmp); else ((parent
)->entry.rbe_parent)->entry.rbe_right = (tmp); } else (
head)->rbh_root = (tmp); (tmp)->entry.rbe_right = (parent
); (parent)->entry.rbe_parent = (tmp); do {} while (0); if
(((tmp)->entry.rbe_parent)) do {} while (0); } while (0);
elm = (head)->rbh_root; break; } } } if (elm) (elm)->entry
.rbe_color = 0; } __attribute__((__unused__)) static struct appl_internal_object
* appl_internal_objects_RB_REMOVE(struct appl_internal_objects
*head, struct appl_internal_object *elm) { struct appl_internal_object
*child, *parent, *old = elm; int color; if ((elm)->entry.
rbe_left == ((void *)0)) child = (elm)->entry.rbe_right; else
if ((elm)->entry.rbe_right == ((void *)0)) child = (elm)->
entry.rbe_left; else { struct appl_internal_object *left; elm
= (elm)->entry.rbe_right; while ((left = (elm)->entry.
rbe_left)) elm = left; child = (elm)->entry.rbe_right; parent
= (elm)->entry.rbe_parent; color = (elm)->entry.rbe_color
; if (child) (child)->entry.rbe_parent = parent; if (parent
) { if ((parent)->entry.rbe_left == elm) (parent)->entry
.rbe_left = child; else (parent)->entry.rbe_right = child;
do {} while (0); } else (head)->rbh_root = child; if ((elm
)->entry.rbe_parent == old) parent = elm; (elm)->entry =
(old)->entry; if ((old)->entry.rbe_parent) { if (((old
)->entry.rbe_parent)->entry.rbe_left == old) ((old)->
entry.rbe_parent)->entry.rbe_left = elm; else ((old)->entry
.rbe_parent)->entry.rbe_right = elm; do {} while (0); } else
(head)->rbh_root = elm; ((old)->entry.rbe_left)->entry
.rbe_parent = elm; if ((old)->entry.rbe_right) ((old)->
entry.rbe_right)->entry.rbe_parent = elm; if (parent) { left
= parent; do { do {} while (0); } while ((left = (left)->
entry.rbe_parent)); } goto color; } parent = (elm)->entry.
rbe_parent; color = (elm)->entry.rbe_color; if (child) (child
)->entry.rbe_parent = parent; if (parent) { if ((parent)->
entry.rbe_left == elm) (parent)->entry.rbe_left = child; else
(parent)->entry.rbe_right = child; do {} while (0); } else
(head)->rbh_root = child; color: if (color == 0) appl_internal_objects_RB_REMOVE_COLOR
(head, parent, child); return (old); } __attribute__((__unused__
)) static struct appl_internal_object * appl_internal_objects_RB_INSERT
(struct appl_internal_objects *head, struct appl_internal_object
*elm) { struct appl_internal_object *tmp; struct appl_internal_object
*parent = ((void *)0); int comp = 0; tmp = (head)->rbh_root
; while (tmp) { parent = tmp; comp = (appl_internal_object_cmp
)(elm, parent); if (comp < 0) tmp = (tmp)->entry.rbe_left
; else if (comp > 0) tmp = (tmp)->entry.rbe_right; else
return (tmp); } do { (elm)->entry.rbe_parent = parent; (elm
)->entry.rbe_left = (elm)->entry.rbe_right = ((void *)0
); (elm)->entry.rbe_color = 1; } while (0); if (parent != (
(void *)0)) { if (comp < 0) (parent)->entry.rbe_left = elm
; else (parent)->entry.rbe_right = elm; do {} while (0); }
else (head)->rbh_root = elm; appl_internal_objects_RB_INSERT_COLOR
(head, elm); return (((void *)0)); } __attribute__((__unused__
)) static struct appl_internal_object * appl_internal_objects_RB_FIND
(struct appl_internal_objects *head, struct appl_internal_object
*elm) { struct appl_internal_object *tmp = (head)->rbh_root
; int comp; while (tmp) { comp = appl_internal_object_cmp(elm
, tmp); if (comp < 0) tmp = (tmp)->entry.rbe_left; else
if (comp > 0) tmp = (tmp)->entry.rbe_right; else return
(tmp); } return (((void *)0)); } __attribute__((__unused__))
static struct appl_internal_object * appl_internal_objects_RB_NFIND
(struct appl_internal_objects *head, struct appl_internal_object
*elm) { struct appl_internal_object *tmp = (head)->rbh_root
; struct appl_internal_object *res = ((void *)0); int comp; while
(tmp) { comp = appl_internal_object_cmp(elm, tmp); if (comp <
0) { res = tmp; tmp = (tmp)->entry.rbe_left; } else if (comp
> 0) tmp = (tmp)->entry.rbe_right; else return (tmp); }
return (res); } __attribute__((__unused__)) static struct appl_internal_object
* appl_internal_objects_RB_NEXT(struct appl_internal_object *
elm) { if ((elm)->entry.rbe_right) { elm = (elm)->entry
.rbe_right; while ((elm)->entry.rbe_left) elm = (elm)->
entry.rbe_left; } else { if ((elm)->entry.rbe_parent &&
(elm == ((elm)->entry.rbe_parent)->entry.rbe_left)) elm
= (elm)->entry.rbe_parent; else { while ((elm)->entry.
rbe_parent && (elm == ((elm)->entry.rbe_parent)->
entry.rbe_right)) elm = (elm)->entry.rbe_parent; elm = (elm
)->entry.rbe_parent; } } return (elm); } __attribute__((__unused__
)) static struct appl_internal_object * appl_internal_objects_RB_PREV
(struct appl_internal_object *elm) { if ((elm)->entry.rbe_left
) { elm = (elm)->entry.rbe_left; while ((elm)->entry.rbe_right
) elm = (elm)->entry.rbe_right; } else { if ((elm)->entry
.rbe_parent && (elm == ((elm)->entry.rbe_parent)->
entry.rbe_right)) elm = (elm)->entry.rbe_parent; else { while
((elm)->entry.rbe_parent && (elm == ((elm)->entry
.rbe_parent)->entry.rbe_left)) elm = (elm)->entry.rbe_parent
; elm = (elm)->entry.rbe_parent; } } return (elm); } __attribute__
((__unused__)) static struct appl_internal_object * appl_internal_objects_RB_MINMAX
(struct appl_internal_objects *head, int val) { struct appl_internal_object
*tmp = (head)->rbh_root; struct appl_internal_object *parent
= ((void *)0); while (tmp) { parent = tmp; if (val < 0) tmp
= (tmp)->entry.rbe_left; else tmp = (tmp)->entry.rbe_right
; } return (parent); }
;