1 |
27 |
unneback |
# mib2c.storage.conf:
|
2 |
|
|
#
|
3 |
|
|
# This is a special mib2c.conf file that assumes that you want to do
|
4 |
|
|
# all storage of information locally rather than pulling the
|
5 |
|
|
# information from another source outside the agent (EG, the
|
6 |
|
|
# kernel). To accomplish this, it defines a structure for the
|
7 |
|
|
# storage of tables and assumes you want to use the header_complex
|
8 |
|
|
# functions for retrieving and storing that data in a local data
|
9 |
|
|
# store. It even writes a .conf file parser for you and sets you up
|
10 |
|
|
# for being able to do persistant storage fairly simply.
|
11 |
|
|
#
|
12 |
|
|
# In short: it trys to do almost all of the work for you... Almost...
|
13 |
|
|
|
14 |
|
|
#
|
15 |
|
|
# Define types of data by mib type, and translate into needed C code.
|
16 |
|
|
#
|
17 |
|
|
|
18 |
|
|
# We need to get some extra stuff into the variable declarations
|
19 |
|
|
# before sourcing the main mib2c.vartypes.conf file below.
|
20 |
|
|
type: OCTETSTR
|
21 |
|
|
storage: char *${name};
|
22 |
|
|
storage: size_t ${name}Len;
|
23 |
|
|
varlenname: StorageTmp->${name}Len
|
24 |
|
|
vartest: if (StorageTmp->${name} == NULL) {
|
25 |
|
|
vartest: config_perror(\"invalid specification for ${name}\");
|
26 |
|
|
vartest: return;
|
27 |
|
|
vartest: }
|
28 |
|
|
vartest:
|
29 |
|
|
action: tmpvar = StorageTmp->$name;
|
30 |
|
|
action: tmplen = StorageTmp->${name}Len;
|
31 |
|
|
action: memdup((u_char **) &StorageTmp->$name, var_val, var_val_len);
|
32 |
|
|
action: StorageTmp->${name}Len = var_val_len;
|
33 |
|
|
undo: SNMP_FREE(StorageTmp->${name});
|
34 |
|
|
undo: StorageTmp->${name} = tmpvar;
|
35 |
|
|
undo: StorageTmp->${name}Len = tmplen;
|
36 |
|
|
commit: SNMP_FREE(tmpvar);
|
37 |
|
|
sizeofstart:
|
38 |
|
|
sizeofend: Len
|
39 |
|
|
tmpvar: char *
|
40 |
|
|
casttmp: strdup((char *) tmpvar);
|
41 |
|
|
#
|
42 |
|
|
type: INTEGER
|
43 |
|
|
storage: long $name;
|
44 |
|
|
storageret: &
|
45 |
|
|
varlenname: tmpint
|
46 |
|
|
sizeofstart: sizeof(
|
47 |
|
|
sizeofend: )
|
48 |
|
|
tmpvar: int
|
49 |
|
|
action: tmpvar = StorageTmp->$name;
|
50 |
|
|
action: StorageTmp->${name} = *((long *) var_val);
|
51 |
|
|
undo: StorageTmp->${name} = tmpvar;
|
52 |
|
|
casttmp: tmpvar;
|
53 |
|
|
#
|
54 |
|
|
type: OBJECTID
|
55 |
|
|
storage: oid *$name;
|
56 |
|
|
storage: size_t ${name}Len
|
57 |
|
|
varlenname: StorageTmp->${name}Len
|
58 |
|
|
vartest: if (StorageTmp->${name} == NULL) {
|
59 |
|
|
vartest: config_perror(\"invalid specification for ${name}\");
|
60 |
|
|
vartest: return;
|
61 |
|
|
vartest: }
|
62 |
|
|
vartest:
|
63 |
|
|
action: tmpvar = StorageTmp->$name;
|
64 |
|
|
action: tmplen = StorageTmp->${name}Len;
|
65 |
|
|
action: memdup((u_char **) &StorageTmp->$name, var_val, var_val_len);
|
66 |
|
|
action: StorageTmp->${name}Len = var_val_len/sizeof(oid);
|
67 |
|
|
undo: SNMP_FREE(StorageTmp->${name});
|
68 |
|
|
undo: StorageTmp->${name} = tmpvar;
|
69 |
|
|
undo: StorageTmp->${name}Len = tmplen;
|
70 |
|
|
commit: SNMP_FREE(tmpvar);
|
71 |
|
|
sizeofstart:
|
72 |
|
|
sizeofend: Len
|
73 |
|
|
tmpvar: oid *
|
74 |
|
|
casttmp: (oid *) tmpvar;
|
75 |
|
|
freetmp: SNMP_FREE(tmpvar);
|
76 |
|
|
#
|
77 |
|
|
type: COUNTER64
|
78 |
|
|
storage: struct counter64 $name;
|
79 |
|
|
varlenname: tmpint
|
80 |
|
|
sizeofstart: sizeof(
|
81 |
|
|
sizeofend: )
|
82 |
|
|
tmpvar: struct counter64 *
|
83 |
|
|
casttmp: (struct counter64 *) tmpvar;
|
84 |
|
|
|
85 |
|
|
############################################################################
|
86 |
|
|
# source variable typing information:
|
87 |
|
|
include: mib2c.vartypes.conf
|
88 |
|
|
|
89 |
|
|
############################################################################
|
90 |
|
|
# The .h file
|
91 |
|
|
############################################################################
|
92 |
|
|
type: code-dot-h
|
93 |
|
|
code: /* This file was generated by mib2c and is intended for use as a mib module
|
94 |
|
|
code: for the ucd-snmp snmpd agent. */
|
95 |
|
|
code:
|
96 |
|
|
code: #ifndef _MIBGROUP_${OUTPUTNAME}_H
|
97 |
|
|
code: #define _MIBGROUP_${OUTPUTNAME}_H
|
98 |
|
|
code:
|
99 |
|
|
code: /* we may use header_complex from the header_complex module */
|
100 |
|
|
code:
|
101 |
|
|
code: config_require(header_complex)
|
102 |
|
|
code:
|
103 |
|
|
code: /* our storage structure(s) */
|
104 |
|
|
code: $variables{'code-structure-per-table'}{'processed'}
|
105 |
|
|
code:
|
106 |
|
|
code: /* enum definitions from the covered mib sections */
|
107 |
|
|
code:
|
108 |
|
|
code: $variables{'code-enums'}{'processed'}
|
109 |
|
|
code:
|
110 |
|
|
code: /* function prototypes */
|
111 |
|
|
code:
|
112 |
|
|
code: void init_$outputName(void);
|
113 |
|
|
code: $variables{'code-var-table-decl'}{'processed'}
|
114 |
|
|
code: $variables{'code-write-func-decl'}{'processed'}
|
115 |
|
|
code: $variables{'code-write-rowstatus-decl'}{'processed'}
|
116 |
|
|
code:
|
117 |
|
|
code: #endif /* _MIBGROUP_${OUTPUTNAME}_H */
|
118 |
|
|
|
119 |
|
|
#
|
120 |
|
|
# Structure definition, one per table
|
121 |
|
|
#
|
122 |
|
|
type: code-structure-per-table
|
123 |
|
|
processtable: code-structure-per-table
|
124 |
|
|
|
125 |
|
|
code: struct ${vtable}_data {
|
126 |
|
|
code: $variables{$vtable}{'code-structure'}{'processed'}
|
127 |
|
|
code: };
|
128 |
|
|
|
129 |
|
|
#
|
130 |
|
|
# Structure storage arrays, one per table
|
131 |
|
|
#
|
132 |
|
|
type: code-structure-storage
|
133 |
|
|
processtable: code-structure-storage
|
134 |
|
|
|
135 |
|
|
code: static struct header_complex_index *${vtable}Storage = NULL;
|
136 |
|
|
|
137 |
|
|
#
|
138 |
|
|
# Structure definition line.
|
139 |
|
|
#
|
140 |
|
|
type: code-structure
|
141 |
|
|
process: code-structure
|
142 |
|
|
|
143 |
|
|
code: " . eval ("\"$variables{$mib->{'type'}}{'storage'}\"") . "
|
144 |
|
|
#$variables{$i}{'code'}\""evalstr(
|
145 |
|
|
#
|
146 |
|
|
# ENUM definitions
|
147 |
|
|
#
|
148 |
|
|
type: code-enums
|
149 |
|
|
process: code-enums
|
150 |
|
|
skipif: $mib->{'textualConvention'} eq "RowStatus" || $mib->{'textualConvention'} eq "StorageType"
|
151 |
|
|
|
152 |
|
|
code: " . eval{ my ($i, $x); foreach $i (sort {$mib->{'enums'}{$a} <=> $mib->{'enums'}{$b}} keys(%{$mib->{'enums'}})) { $x .= sprintf("#define %-40s %d\n","${NAME}_" . uc($i),$mib->{'enums'}{$i}); } $x; } . "
|
153 |
|
|
|
154 |
|
|
############################################################################
|
155 |
|
|
# The .c file, top
|
156 |
|
|
############################################################################
|
157 |
|
|
type: code-main-part
|
158 |
|
|
code: /* This file was generated by mib2c and is intended for use as
|
159 |
|
|
code: a mib module for the ucd-snmp snmpd agent. */
|
160 |
|
|
code:
|
161 |
|
|
code: /* This should always be included first before anything else */
|
162 |
|
|
code: #include
|
163 |
|
|
code: #if HAVE_STDLIB_H
|
164 |
|
|
code: #include
|
165 |
|
|
code: #endif
|
166 |
|
|
code: #if HAVE_STRING_H
|
167 |
|
|
code: #include
|
168 |
|
|
code: #else
|
169 |
|
|
code: #include
|
170 |
|
|
code: #endif
|
171 |
|
|
code:
|
172 |
|
|
code: /* minimal include directives */
|
173 |
|
|
code: #include \"mibincl.h\"
|
174 |
|
|
code: #include \"header_complex.h\"
|
175 |
|
|
code: #include \"$outputName.h\"
|
176 |
|
|
code: #include \"snmp-tc.h\"
|
177 |
|
|
code:
|
178 |
|
|
code: /*
|
179 |
|
|
code: * ${outputName}_variables_oid:
|
180 |
|
|
code: * this is the top level oid that we want to register under. This
|
181 |
|
|
code: * is essentially a prefix, with the suffix appearing in the
|
182 |
|
|
code: * variable below.
|
183 |
|
|
code: */
|
184 |
|
|
code:
|
185 |
|
|
code: oid ${outputName}_variables_oid[] = { $commaoid };
|
186 |
|
|
code:
|
187 |
|
|
code: /*
|
188 |
|
|
code: * variable$varlen ${outputName}_variables:
|
189 |
|
|
code: * this variable defines function callbacks and type return information
|
190 |
|
|
code: * for the $outputName mib section
|
191 |
|
|
code: */
|
192 |
|
|
code:
|
193 |
|
|
code: struct variable$varlen ${outputName}_variables[] = {
|
194 |
|
|
code: /* magic number , variable type , ro/rw , callback fn , L, oidsuffix */
|
195 |
|
|
code: $variables{'variable-structure-info'}{'processed'}
|
196 |
|
|
code: };
|
197 |
|
|
code: /* (L = length of the oidsuffix) */
|
198 |
|
|
code:
|
199 |
|
|
code: /* global storage of our data, saved in and configured by header_complex() */
|
200 |
|
|
code: $variables{'code-structure-storage'}{'processed'}
|
201 |
|
|
code:
|
202 |
|
|
code: /*
|
203 |
|
|
code: * init_$outputName():
|
204 |
|
|
code: * Initialization routine. This is called when the agent starts up.
|
205 |
|
|
code: * At a minimum, registration of your variables should take place here.
|
206 |
|
|
code: */
|
207 |
|
|
code: void init_$outputName(void) {
|
208 |
|
|
code: DEBUGMSGTL((\"$outputName\", \"initializing... \"));
|
209 |
|
|
code:
|
210 |
|
|
code: /* register ourselves with the agent to handle our mib tree */
|
211 |
|
|
code: REGISTER_MIB(\"$outputName\", ${outputName}_variables, variable$varlen,\
|
212 |
|
|
code: ${outputName}_variables_oid);
|
213 |
|
|
code:
|
214 |
|
|
code: /* register our config handler(s) to deal with registrations */
|
215 |
|
|
code: $variables{'code-parser-registration'}{'processed'}
|
216 |
|
|
code:
|
217 |
|
|
code: /* place any other initialization junk you need here */
|
218 |
|
|
code:
|
219 |
|
|
code: DEBUGMSGTL((\"$outputName\", \"done.\\n\"));
|
220 |
|
|
code: }
|
221 |
|
|
code:
|
222 |
|
|
code: $variables{'code-parser'}{'processed'}
|
223 |
|
|
code:
|
224 |
|
|
code: $variables{'code-var_table'}{'processed'}
|
225 |
|
|
code:
|
226 |
|
|
code: $variables{'code-write-func'}{'processed'}
|
227 |
|
|
code:
|
228 |
|
|
code: $variables{'code-write-rowstatus'}{'processed'}
|
229 |
|
|
|
230 |
|
|
############################################################################
|
231 |
|
|
# var_ function for tables, which is handled specially and used above
|
232 |
|
|
#
|
233 |
|
|
# Note: $vtable is set to the table name in the processtable loop.
|
234 |
|
|
############################################################################
|
235 |
|
|
|
236 |
|
|
#
|
237 |
|
|
# header file defs first
|
238 |
|
|
#
|
239 |
|
|
type: code-var-table-decl
|
240 |
|
|
processtable: code-var-table-decl
|
241 |
|
|
|
242 |
|
|
code: FindVarMethod var_$vtable;
|
243 |
|
|
code: void parse_$vtable(char *, char *);
|
244 |
|
|
|
245 |
|
|
#
|
246 |
|
|
# .conf Parser Code per table
|
247 |
|
|
#
|
248 |
|
|
type: code-parser-registration
|
249 |
|
|
processtable: code-parser-registration
|
250 |
|
|
code: snmpd_register_config_handler(\"$vtable\", parse_$vtable, NULL,
|
251 |
|
|
code: \"HELP STRING\");
|
252 |
|
|
|
253 |
|
|
type: code-varlist-add
|
254 |
|
|
process: code-varlist-add
|
255 |
|
|
skipif: $variables{$vroutine}{$name}{'isanindex'} != 1
|
256 |
|
|
code: snmp_varlist_add_variable(&vars, NULL, 0, $variables{$mib->{type}}{asnType}, ($variables{$mib->{type}}{'cast'}) thedata->$name, $variables{$mib->{type}}{'sizeofstart'}thedata->$name$variables{$mib->{type}}{'sizeofend'}); /* $name */
|
257 |
|
|
|
258 |
|
|
type: code-parser
|
259 |
|
|
processtable: code-parser
|
260 |
|
|
|
261 |
|
|
code: /*
|
262 |
|
|
code: * ${vtable}_add(): adds a structure node to our data set
|
263 |
|
|
code: */
|
264 |
|
|
code: int
|
265 |
|
|
code: ${vtable}_add(struct ${vtable}_data *thedata) {
|
266 |
|
|
code: struct variable_list *vars = NULL;
|
267 |
|
|
code:
|
268 |
|
|
code: DEBUGMSGTL((\"$outputName\", \"adding data... \"));
|
269 |
|
|
code: /* add the index variables to the varbind list, which is
|
270 |
|
|
code: used by header_complex to index the data */
|
271 |
|
|
code:
|
272 |
|
|
code: $variables{$vtable}{'code-varlist-add'}{'processed'}
|
273 |
|
|
code:
|
274 |
|
|
code: header_complex_add_data(&${vtable}Storage, vars, thedata);
|
275 |
|
|
code: DEBUGMSGTL((\"$vtable\",\"registered an entry\\n\"));
|
276 |
|
|
code:
|
277 |
|
|
code: DEBUGMSGTL((\"$outputName\", \"done.\\n\"));
|
278 |
|
|
code: return SNMPERR_SUCCESS;
|
279 |
|
|
code: }
|
280 |
|
|
code:
|
281 |
|
|
code: /*
|
282 |
|
|
code: * parse_$vtable():
|
283 |
|
|
code: * parses .conf file entries needed to configure the mib.
|
284 |
|
|
code: */
|
285 |
|
|
code: void
|
286 |
|
|
code: parse_$vtable(char *token, char *line) {
|
287 |
|
|
code: size_t tmpint;
|
288 |
|
|
code: struct ${vtable}_data *StorageTmp = SNMP_MALLOC_STRUCT(${vtable}_data);
|
289 |
|
|
code: struct variable_list *vars = NULL;
|
290 |
|
|
code:
|
291 |
|
|
code: DEBUGMSGTL((\"$outputName\", \"parsing config... \"));
|
292 |
|
|
code:
|
293 |
|
|
code: if (StorageTmp == NULL) {
|
294 |
|
|
code: config_perror(\"malloc failure\");
|
295 |
|
|
code: return;
|
296 |
|
|
code: }
|
297 |
|
|
code:
|
298 |
|
|
code: $variables{$vtable}{'code-parser-sections'}{'processed'}
|
299 |
|
|
code:
|
300 |
|
|
code: ${vtable}_add(StorageTmp);
|
301 |
|
|
code:
|
302 |
|
|
code: DEBUGMSGTL((\"$outputName\", \"done.\\n\"));
|
303 |
|
|
code: }
|
304 |
|
|
code:
|
305 |
|
|
code:
|
306 |
|
|
code: /*
|
307 |
|
|
code: * store_$vtable():
|
308 |
|
|
code: * stores .conf file entries needed to configure the mib.
|
309 |
|
|
code: */
|
310 |
|
|
code: void
|
311 |
|
|
code: store_$vtable(void) {
|
312 |
|
|
code: char line[SNMP_MAXBUF];
|
313 |
|
|
code: char *cptr;
|
314 |
|
|
code: size_t tmpint;
|
315 |
|
|
code: struct ${vtable}_data *StorageTmp;
|
316 |
|
|
code: struct header_complex_index *hcindex;
|
317 |
|
|
code:
|
318 |
|
|
code: DEBUGMSGTL((\"$outputName\", \"storing data... \"));
|
319 |
|
|
code:
|
320 |
|
|
code: memset(line,0,sizeof(line));
|
321 |
|
|
code:
|
322 |
|
|
code: strcat(line, \"$vtable\");
|
323 |
|
|
code: cptr = line + strlen(line);
|
324 |
|
|
code:
|
325 |
|
|
code: for(hcindex=${vtable}Storage; hcindex != NULL;
|
326 |
|
|
code: hcindex = hcindex->next) {
|
327 |
|
|
code: StorageTmp = (struct ${vtable}_data *) hcindex->data;
|
328 |
|
|
code:
|
329 |
|
|
code: $variables{$vtable}{'code-persistent-sections'}{'processed'}
|
330 |
|
|
code:
|
331 |
|
|
code: snmpd_store_config(line);
|
332 |
|
|
code: }
|
333 |
|
|
code: DEBUGMSGTL((\"$outputName\", \"done.\\n\"));
|
334 |
|
|
code: }
|
335 |
|
|
|
336 |
|
|
# individual sections for the parser
|
337 |
|
|
type: code-parser-sections
|
338 |
|
|
process: code-parser-sections
|
339 |
|
|
skipif: $mib->{'access'} =~ /NoAccess/
|
340 |
|
|
|
341 |
|
|
code: line = read_config_read_data($variables{$mib->{type}}{asnType}, line, &StorageTmp->$name, &" . eval ("\"$variables{$mib->{type}}{varlenname}\"") . ");
|
342 |
|
|
code: " . eval ("\"$variables{$mib->{type}}{vartest}\"") . "
|
343 |
|
|
|
344 |
|
|
#
|
345 |
|
|
# .conf persistent save Code per table
|
346 |
|
|
#
|
347 |
|
|
type: code-persistent-sections
|
348 |
|
|
process: code-persistent-sections
|
349 |
|
|
skipif: $mib->{'access'} =~ /NoAccess/
|
350 |
|
|
code: cptr = read_config_store_data($variables{$mib->{type}}{asnType}, cptr, &StorageTmp->$name, &" . eval ("\"$variables{$mib->{type}}{varlenname}\"") . ");
|
351 |
|
|
|
352 |
|
|
#
|
353 |
|
|
# Code code per table
|
354 |
|
|
#
|
355 |
|
|
type: code-var_table
|
356 |
|
|
processtable: code-var_table
|
357 |
|
|
|
358 |
|
|
code: /*
|
359 |
|
|
code: * var_$vtable():
|
360 |
|
|
code: * Handle this table separately from the scalar value case.
|
361 |
|
|
code: * The workings of this are basically the same as for var_$outputName above.
|
362 |
|
|
code: */
|
363 |
|
|
code: unsigned char *
|
364 |
|
|
code: var_$vtable(struct variable *vp,
|
365 |
|
|
code: oid *name,
|
366 |
|
|
code: size_t *length,
|
367 |
|
|
code: int exact,
|
368 |
|
|
code: size_t *var_len,
|
369 |
|
|
code: WriteMethod **write_method)
|
370 |
|
|
code: {
|
371 |
|
|
code:
|
372 |
|
|
code: struct ${vtable}_data *StorageTmp = NULL;
|
373 |
|
|
code:
|
374 |
|
|
code: DEBUGMSGTL((\"$outputName\", \"var_$vtable: Entering... \\n\"));
|
375 |
|
|
code: /*
|
376 |
|
|
code: * this assumes you have registered all your data properly
|
377 |
|
|
cdoe: * with header_complex_add() somewhere before this
|
378 |
|
|
code: */
|
379 |
|
|
code: if ((StorageTmp =
|
380 |
|
|
code: header_complex(${vtable}Storage, vp,name,length,exact,
|
381 |
|
|
code: var_len,write_method)) == NULL)
|
382 |
|
|
code: return NULL;
|
383 |
|
|
code:
|
384 |
|
|
code: /*
|
385 |
|
|
code: * this is where we do the value assignments for the mib results.
|
386 |
|
|
code: */
|
387 |
|
|
code: switch(vp->magic) {\n\n
|
388 |
|
|
code: $variables{$vtable}{'code-case-statements'}{'processed'}
|
389 |
|
|
code: default:
|
390 |
|
|
code: ERROR_MSG(\"\");
|
391 |
|
|
code: }
|
392 |
|
|
code: return NULL;
|
393 |
|
|
code: }
|
394 |
|
|
|
395 |
|
|
|
396 |
|
|
############################################################################
|
397 |
|
|
# case statement sections
|
398 |
|
|
############################################################################
|
399 |
|
|
type: code-case-statements
|
400 |
|
|
process: code-case-statements
|
401 |
|
|
skipif: $mib->{'access'} =~ /NoAccess/
|
402 |
|
|
|
403 |
|
|
code: case $NAME:
|
404 |
|
|
code: " . (($mib->{'access'} =~ /ReadWrite|WriteOnly|Create/) ? "*write_method = write_$mib->{label};" : "") . "
|
405 |
|
|
code: *var_len = $variables{$mib->{'type'}}{'sizeofstart'}StorageTmp->$mib->{label}$variables{$mib->{'type'}}{'sizeofend'};
|
406 |
|
|
code: return (u_char *) $variables{$mib->{'type'}}{'storageret'}StorageTmp->$mib->{label};
|
407 |
|
|
code:
|
408 |
|
|
|
409 |
|
|
############################################################################
|
410 |
|
|
# storage structure information
|
411 |
|
|
############################################################################
|
412 |
|
|
type: variable-structure-info
|
413 |
|
|
process: variable-structure-info
|
414 |
|
|
skipif: $mib->{'access'} =~ /NoAccess/
|
415 |
|
|
code: " . sprintf("#define %-20s $count", $NAME) . "
|
416 |
|
|
code: " . sprintf(" { %-20s, %-14s, %-6.6s, %s, %d, { %s } },", $NAME, $variables{$mib->{'type'}}{'asnType'}, $accessToUCD{$mib->{'access'}}, "var_$vroutine", $depth-1, $subid) . "
|
417 |
|
|
|
418 |
|
|
############################################################################
|
419 |
|
|
# write function definition, also appended to the end of the .c file.
|
420 |
|
|
############################################################################
|
421 |
|
|
#
|
422 |
|
|
# Header info: declair write functions for set processing
|
423 |
|
|
#
|
424 |
|
|
process: code-write-func-decl
|
425 |
|
|
type: code-write-func-decl
|
426 |
|
|
skipif: $mib->{'access'} !~ /Write|Create/
|
427 |
|
|
code: WriteMethod write_$name;
|
428 |
|
|
#
|
429 |
|
|
# C code
|
430 |
|
|
#
|
431 |
|
|
type: code-write-func
|
432 |
|
|
process: code-write-func
|
433 |
|
|
skipif: $mib->{'textualConvention'} eq "RowStatus" || $mib->{'access'} !~ /Write|Create/
|
434 |
|
|
code: int
|
435 |
|
|
code: write_$name(int action,
|
436 |
|
|
code: u_char *var_val,
|
437 |
|
|
code: u_char var_val_type,
|
438 |
|
|
code: size_t var_val_len,
|
439 |
|
|
code: u_char *statP,
|
440 |
|
|
code: oid *name,
|
441 |
|
|
code: size_t name_len)
|
442 |
|
|
code: {
|
443 |
|
|
code: static $variables{$mib->{'type'}}{tmpvar} tmpvar;
|
444 |
|
|
code: struct ${vroutine}_data *StorageTmp = NULL;
|
445 |
|
|
code: static size_t tmplen;
|
446 |
|
|
code: size_t newlen=name_len - (sizeof(${outputName}_variables_oid)/sizeof(oid) + $depth - 1);
|
447 |
|
|
code:
|
448 |
|
|
code: DEBUGMSGTL((\"$outputName\", \"write_$name entering action=%d... \\n\", action));
|
449 |
|
|
code: if ((StorageTmp =
|
450 |
|
|
code: header_complex(${vroutine}Storage, NULL,
|
451 |
|
|
code: &name[sizeof(${outputName}_variables_oid)/sizeof(oid) + $depth - 1],
|
452 |
|
|
code: &newlen, 1, NULL, NULL)) == NULL)
|
453 |
|
|
code: return SNMP_ERR_NOSUCHNAME; /* remove if you support creation here */
|
454 |
|
|
code:
|
455 |
|
|
code: switch ( action ) {
|
456 |
|
|
code: case RESERVE1:
|
457 |
|
|
code: if (var_val_type != $variables{$mib->{'type'}}{asnType}){
|
458 |
|
|
code: fprintf(stderr, \"write to $name not $variables{$mib->{'type'}}{asnType}\\n\");
|
459 |
|
|
code: return SNMP_ERR_WRONGTYPE;
|
460 |
|
|
code: }
|
461 |
|
|
code: break;
|
462 |
|
|
code:
|
463 |
|
|
code: case RESERVE2:
|
464 |
|
|
code: /* memory reseveration, final preparation... */
|
465 |
|
|
code: break;
|
466 |
|
|
code:
|
467 |
|
|
code: case FREE:
|
468 |
|
|
code: /* Release any resources that have been allocated */
|
469 |
|
|
code: break;
|
470 |
|
|
code:
|
471 |
|
|
code: case ACTION:
|
472 |
|
|
code: /* The variable has been stored in $variables{$mib->{'type'}}{variable} for
|
473 |
|
|
code: you to use, and you have just been asked to do something with
|
474 |
|
|
code: it. Note that anything done here must be reversable in the UNDO case */
|
475 |
|
|
code: ".eval ("\"$variables{$mib->{type}}{action}\"")."
|
476 |
|
|
code: break;
|
477 |
|
|
code:
|
478 |
|
|
code: case UNDO:
|
479 |
|
|
code: /* Back out any changes made in the ACTION case */
|
480 |
|
|
code: ".eval ("\"$variables{$mib->{type}}{undo}\"")."
|
481 |
|
|
code: break;
|
482 |
|
|
code:
|
483 |
|
|
code: case COMMIT:
|
484 |
|
|
code: /* Things are working well, so it's now safe to make the change
|
485 |
|
|
code: permanently. Make sure that anything done here can't fail! */
|
486 |
|
|
code: ".eval ("\"$variables{$mib->{'type'}}{'commit'}\"")."
|
487 |
|
|
code: break;
|
488 |
|
|
code: }
|
489 |
|
|
code: return SNMP_ERR_NOERROR;
|
490 |
|
|
code: }
|
491 |
|
|
code:
|
492 |
|
|
code:
|
493 |
|
|
############################################################################
|
494 |
|
|
# copy memory from varlist
|
495 |
|
|
############################################################################
|
496 |
|
|
type: code-varlist-copy
|
497 |
|
|
process: code-varlist-copy
|
498 |
|
|
skipif: $variables{$vroutine}{$name}{'isanindex'} != 1
|
499 |
|
|
code: memdup((u_char **) &(StorageNew->$name),
|
500 |
|
|
code: vp->val.$variables{$mib->{'type'}}{variable},
|
501 |
|
|
code: vp->val_len);
|
502 |
|
|
code: StorageNew->${name}Len = vp->val_len;
|
503 |
|
|
code: vp = vp->next_variable;
|
504 |
|
|
############################################################################
|
505 |
|
|
# add null pointers to a varlist; value to be parsed later
|
506 |
|
|
############################################################################
|
507 |
|
|
type: code-varlist-add-null
|
508 |
|
|
process: code-varlist-add-null
|
509 |
|
|
skipif: $variables{$vroutine}{$name}{'isanindex'} != 1
|
510 |
|
|
code: snmp_varlist_add_variable(&vars, NULL, 0, $variables{$mib->{'type'}}{asnType}, NULL, 0); /* $name */
|
511 |
|
|
############################################################################
|
512 |
|
|
# write function definition for a RowStatus object,
|
513 |
|
|
# - allows for creation/deletion.
|
514 |
|
|
############################################################################
|
515 |
|
|
#
|
516 |
|
|
# Header info: declair write functions for set processing
|
517 |
|
|
#
|
518 |
|
|
process: code-write-rowstatus-decl
|
519 |
|
|
type: code-write-rowstatus-decl
|
520 |
|
|
skipif: $mib->{'textualConvention'} ne "RowStatus"
|
521 |
|
|
code: WriteMethod write_$name;
|
522 |
|
|
#
|
523 |
|
|
# code
|
524 |
|
|
#
|
525 |
|
|
type: code-write-rowstatus
|
526 |
|
|
process: code-write-rowstatus
|
527 |
|
|
skipif: $mib->{'textualConvention'} ne "RowStatus"
|
528 |
|
|
code: int
|
529 |
|
|
code: write_$name(int action,
|
530 |
|
|
code: u_char *var_val,
|
531 |
|
|
code: u_char var_val_type,
|
532 |
|
|
code: size_t var_val_len,
|
533 |
|
|
code: u_char *statP,
|
534 |
|
|
code: oid *name,
|
535 |
|
|
code: size_t name_len)
|
536 |
|
|
code: {
|
537 |
|
|
code: struct ${vroutine}_data *StorageTmp = NULL;
|
538 |
|
|
code: static struct ${vroutine}_data *StorageNew, *StorageDel;
|
539 |
|
|
code: size_t newlen=name_len - (sizeof(${vroutine}_variables_oid)/sizeof(oid) + 3 - 1);
|
540 |
|
|
code: static int old_value;
|
541 |
|
|
code: int set_value;
|
542 |
|
|
code: static struct variable_list *vars, *vp;
|
543 |
|
|
code: struct header_complex_index *hciptr;
|
544 |
|
|
code: char who[MAX_OID_LEN], flagName[MAX_OID_LEN];
|
545 |
|
|
code:
|
546 |
|
|
code: StorageTmp =
|
547 |
|
|
code: header_complex(${vroutine}Storage, NULL,
|
548 |
|
|
code: &name[sizeof(${vroutine}_variables_oid)/sizeof(oid) + 3 - 1],
|
549 |
|
|
code: &newlen, 1, NULL, NULL);
|
550 |
|
|
code:
|
551 |
|
|
code:
|
552 |
|
|
code: if (var_val_type != ASN_INTEGER || var_val == NULL){
|
553 |
|
|
code: fprintf(stderr, \"write to $name not ASN_INTEGER\\n\");
|
554 |
|
|
code: return SNMP_ERR_WRONGTYPE;
|
555 |
|
|
code: }
|
556 |
|
|
code: set_value = *((long *) var_val);
|
557 |
|
|
code:
|
558 |
|
|
code: /* check legal range, and notReady is reserved for us, not a user */
|
559 |
|
|
code: if (set_value < 1 || set_value > 6 || set_value == RS_NOTREADY)
|
560 |
|
|
code: return SNMP_ERR_INCONSISTENTVALUE;
|
561 |
|
|
code:
|
562 |
|
|
code: switch ( action ) {
|
563 |
|
|
code: case RESERVE1:
|
564 |
|
|
code: /* stage one: test validity */
|
565 |
|
|
code: if (StorageTmp == NULL) {
|
566 |
|
|
code: /* create the row now? */
|
567 |
|
|
code:
|
568 |
|
|
code: /* ditch illegal values now */
|
569 |
|
|
code: if (set_value == RS_ACTIVE || set_value == RS_NOTINSERVICE)
|
570 |
|
|
code: return SNMP_ERR_INCONSISTENTVALUE;
|
571 |
|
|
code:
|
572 |
|
|
code: /* destroying a non-existent row is actually legal */
|
573 |
|
|
code: if (set_value == RS_DESTROY) {
|
574 |
|
|
code: return SNMP_ERR_NOERROR;
|
575 |
|
|
code: }
|
576 |
|
|
code:
|
577 |
|
|
code: /* illegal creation values */
|
578 |
|
|
code: if (set_value == RS_ACTIVE || set_value == RS_NOTINSERVICE) {
|
579 |
|
|
code: return SNMP_ERR_INCONSISTENTVALUE;
|
580 |
|
|
code: }
|
581 |
|
|
code: } else {
|
582 |
|
|
code: /* row exists. Check for a valid state change */
|
583 |
|
|
code: if (set_value == RS_CREATEANDGO || set_value == RS_CREATEANDWAIT) {
|
584 |
|
|
code: /* can't create a row that exists */
|
585 |
|
|
code: return SNMP_ERR_INCONSISTENTVALUE;
|
586 |
|
|
code: }
|
587 |
|
|
code: /* XXX: interaction with row storage type needed */
|
588 |
|
|
code: }
|
589 |
|
|
code: break;
|
590 |
|
|
code:
|
591 |
|
|
code:
|
592 |
|
|
code: case RESERVE2:
|
593 |
|
|
code: /* memory reseveration, final preparation... */
|
594 |
|
|
code: if (StorageTmp == NULL) {
|
595 |
|
|
code: /* creation */
|
596 |
|
|
code: vars = NULL;
|
597 |
|
|
code:
|
598 |
|
|
code: $variables{'code-varlist-add-null'}{'processed'}
|
599 |
|
|
code:
|
600 |
|
|
code: if (header_complex_parse_oid(&(name[sizeof(${vroutine}_variables_oid)/sizeof(oid)+2]), newlen,
|
601 |
|
|
code: vars) != SNMPERR_SUCCESS) {
|
602 |
|
|
code: /* XXX: free, zero vars */
|
603 |
|
|
code: return SNMP_ERR_INCONSISTENTNAME;
|
604 |
|
|
code: }
|
605 |
|
|
code: vp = vars;
|
606 |
|
|
code:
|
607 |
|
|
code: StorageNew = SNMP_MALLOC_STRUCT(${vroutine}_data);
|
608 |
|
|
code: $variables{'code-varlist-copy'}{'processed'}
|
609 |
|
|
code:
|
610 |
|
|
code: StorageNew->$name = set_value;
|
611 |
|
|
code: /* XXX: free, zero vars, no longer needed? */
|
612 |
|
|
code: }
|
613 |
|
|
code:
|
614 |
|
|
code: break;
|
615 |
|
|
code:
|
616 |
|
|
code:
|
617 |
|
|
code: case FREE:
|
618 |
|
|
code: /* XXX: free, zero vars */
|
619 |
|
|
code: /* Release any resources that have been allocated */
|
620 |
|
|
code: break;
|
621 |
|
|
code:
|
622 |
|
|
code:
|
623 |
|
|
code: case ACTION:
|
624 |
|
|
code: /* The variable has been stored in set_value for you to
|
625 |
|
|
code: use, and you have just been asked to do something with
|
626 |
|
|
code: it. Note that anything done here must be reversable in
|
627 |
|
|
code: the UNDO case */
|
628 |
|
|
code:
|
629 |
|
|
code: if (StorageTmp == NULL) {
|
630 |
|
|
code: /* row creation, so add it */
|
631 |
|
|
code: if (StorageNew != NULL)
|
632 |
|
|
code: ${vroutine}_add(StorageNew);
|
633 |
|
|
code: /* XXX: ack, and if it is NULL? */
|
634 |
|
|
code: } else if (set_value != RS_DESTROY) {
|
635 |
|
|
code: /* set the flag? */
|
636 |
|
|
code: old_value = StorageTmp->$name;
|
637 |
|
|
code: StorageTmp->$name = *((long *) var_val);
|
638 |
|
|
code: } else {
|
639 |
|
|
code: /* destroy... extract it for now */
|
640 |
|
|
code: hciptr =
|
641 |
|
|
code: header_complex_find_entry(${vroutine}Storage,
|
642 |
|
|
code: StorageTmp);
|
643 |
|
|
code: StorageDel =
|
644 |
|
|
code: header_complex_extract_entry(&${vroutine}Storage,
|
645 |
|
|
code: hciptr);
|
646 |
|
|
code: }
|
647 |
|
|
code: break;
|
648 |
|
|
code:
|
649 |
|
|
code:
|
650 |
|
|
code: case UNDO:
|
651 |
|
|
code: /* Back out any changes made in the ACTION case */
|
652 |
|
|
code: if (StorageTmp == NULL) {
|
653 |
|
|
code: /* row creation, so remove it again */
|
654 |
|
|
code: hciptr =
|
655 |
|
|
code: header_complex_find_entry(${vroutine}Storage,
|
656 |
|
|
code: StorageTmp);
|
657 |
|
|
code: StorageDel =
|
658 |
|
|
code: header_complex_extract_entry(&${vroutine}Storage,
|
659 |
|
|
code: hciptr);
|
660 |
|
|
code: /* XXX: free it */
|
661 |
|
|
code: } else if (StorageDel != NULL) {
|
662 |
|
|
code: /* row deletion, so add it again */
|
663 |
|
|
code: ${vroutine}_add(StorageDel);
|
664 |
|
|
code: } else {
|
665 |
|
|
code: StorageTmp->$name = old_value;
|
666 |
|
|
code: }
|
667 |
|
|
code: break;
|
668 |
|
|
code:
|
669 |
|
|
code:
|
670 |
|
|
code: case COMMIT:
|
671 |
|
|
code: /* Things are working well, so it's now safe to make the change
|
672 |
|
|
code: permanently. Make sure that anything done here can't fail! */
|
673 |
|
|
code: if (StorageDel != NULL) {
|
674 |
|
|
code: StorageDel == 0;
|
675 |
|
|
code: /* XXX: free it, its dead */
|
676 |
|
|
code: }
|
677 |
|
|
code: break;
|
678 |
|
|
code: }
|
679 |
|
|
code: return SNMP_ERR_NOERROR;
|
680 |
|
|
code: }
|
681 |
|
|
code:
|