6 #include <sys/socket.h>
8 #include <net-snmp/net-snmp-config.h>
9 #include <net-snmp/net-snmp-includes.h>
10 #include <net-snmp/agent/net-snmp-agent-includes.h>
13 #define sv_undef PL_sv_undef
16 typedef struct handler_cb_data_s {
20 #define NETSNMP_NAMEBUF_LEN 128
21 typedef struct netsnmp_oid_s {
24 unsigned int namebuf[ NETSNMP_NAMEBUF_LEN ];
27 static int have_done_agent = 0;
28 static int have_done_lib = 0;
33 croak("%s not implemented on this architecture", s);
38 constant_MODE_G(char *name, int len, int arg)
44 switch (name[6 + 2]) {
46 if (strEQ(name + 6, "ET")) { /* MODE_G removed */
54 if (strEQ(name + 6, "ETBULK")) { /* MODE_G removed */
62 if (strEQ(name + 6, "ETNEXT")) { /* MODE_G removed */
79 constant_MODE_SET_R(char *name, int len, int arg)
85 switch (name[10 + 6]) {
87 if (strEQ(name + 10, "ESERVE1")) { /* MODE_SET_R removed */
88 #ifdef MODE_SET_RESERVE1
89 return MODE_SET_RESERVE1;
95 if (strEQ(name + 10, "ESERVE2")) { /* MODE_SET_R removed */
96 #ifdef MODE_SET_RESERVE2
97 return MODE_SET_RESERVE2;
112 constant_MODE_S(char *name, int len, int arg)
118 switch (name[6 + 3]) {
120 if (strEQ(name + 6, "ET_ACTION")) { /* MODE_S removed */
121 #ifdef MODE_SET_ACTION
122 return MODE_SET_ACTION;
128 if (strEQ(name + 6, "ET_BEGIN")) { /* MODE_S removed */
129 #ifdef MODE_SET_BEGIN
130 return MODE_SET_BEGIN;
136 if (strEQ(name + 6, "ET_COMMIT")) { /* MODE_S removed */
137 #ifdef MODE_SET_COMMIT
138 return MODE_SET_COMMIT;
144 if (strEQ(name + 6, "ET_FREE")) { /* MODE_S removed */
146 return MODE_SET_FREE;
152 if (!strnEQ(name + 6,"ET_", 3))
154 return constant_MODE_SET_R(name, len, arg);
156 if (strEQ(name + 6, "ET_UNDO")) { /* MODE_S removed */
158 return MODE_SET_UNDO;
173 constant(char *name, int len, int arg)
180 switch (name[0 + 5]) {
182 if (!strnEQ(name + 0,"MODE_", 5))
184 return constant_MODE_G(name, len, arg);
186 if (!strnEQ(name + 0,"MODE_", 5))
188 return constant_MODE_S(name, len, arg);
199 handler_wrapper(netsnmp_mib_handler *handler,
200 netsnmp_handler_registration *reginfo,
201 netsnmp_agent_request_info *reqinfo,
202 netsnmp_request_info *requests)
205 handler_cb_data *cb_data = (handler_cb_data *) handler->myvoid;
208 if (cb_data && (cb = cb_data->perl_cb)) {
216 arg = newSVrv(rarg, "NetSNMP::agent::netsnmp_mib_handler");
217 sv_setiv(arg, (int) handler);
220 arg = newSVrv(rarg, "NetSNMP::agent::reginfo");
221 sv_setiv(arg, (int) reginfo);
224 arg = newSVrv(rarg, "NetSNMP::agent::netsnmp_agent_request_info");
225 sv_setiv(arg, (int) reqinfo);
228 arg = newSVrv(rarg, "NetSNMP::agent::netsnmp_request_infoPtr");
229 sv_setiv(arg, (int) requests);
232 if (SvTYPE(cb) == SVt_PVCV) {
233 perl_call_sv(cb, G_DISCARD); /* I have no idea what discard does */
234 /* XXX: it discards the results,
236 } else if (SvROK(cb) && SvTYPE(SvRV(cb)) == SVt_PVCV) {
237 /* reference to code */
238 perl_call_sv(SvRV(cb), G_DISCARD);
245 return SNMP_ERR_NOERROR;
248 MODULE = NetSNMP::agent PACKAGE = NetSNMP::agent
256 char * s = SvPV(sv, len);
259 RETVAL = constant(s,len,arg);
264 __agent_check_and_process(block = 1)
267 RETVAL = agent_check_and_process(block);
286 snmp_enable_stderrlog()
288 MODULE = NetSNMP::agent PACKAGE = NetSNMP::agent PREFIX = na_
295 snmp_shutdown("perl");
298 MODULE = NetSNMP::agent PACKAGE = NetSNMP::agent::netsnmp_handler_registration PREFIX = nsahr_
300 netsnmp_handler_registration *
301 nsahr_new(name, regoid, perlcallback)
306 oid myoid[MAX_OID_LEN];
307 size_t myoid_len = MAX_OID_LEN;
308 handler_cb_data *cb_data;
311 if (!snmp_parse_oid(regoid, myoid, &myoid_len)) {
312 if (!read_objid(regoid, myoid, &myoid_len)) {
313 fprintf(stderr, "couldn't parse %s (reg name: %s)\n",
320 cb_data = (handler_cb_data *) malloc(sizeof(handler_cb_data));
321 RETVAL = netsnmp_create_handler_registration(name, handler_wrapper,
324 cb_data->perl_cb = newSVsv(perlcallback);
325 RETVAL->handler->myvoid = cb_data;
330 MODULE = NetSNMP::agent PACKAGE = netsnmp_handler_registrationPtr PREFIX = nsahr_
333 nsahr_DESTROY(reginfo)
334 netsnmp_handler_registration *reginfo
336 netsnmp_handler_registration_free(reginfo);
342 netsnmp_handler_registration *reginfo;
345 reginfo = (netsnmp_handler_registration *) SvIV(SvRV(me));
346 RETVAL = netsnmp_register_handler(reginfo);
348 /* the agent now has a "reference" to this reg pointer */
361 netsnmp_handler_registration *reginfo;
362 SV *optr, *arg, *rarg;
367 reginfo = (netsnmp_handler_registration *) SvIV(SvRV(me));
369 o = SNMP_MALLOC_TYPEDEF(netsnmp_oid);
370 o->name = o->namebuf;
371 o->len = reginfo->rootoid_len;
372 memcpy(o->name, reginfo->rootoid,
373 reginfo->rootoid_len * sizeof(oid));
375 rarg = newSViv((int) 0);
376 arg = newSVrv(rarg, "netsnmp_oidPtr");
377 sv_setiv(arg, (int) o);
382 i = perl_call_pv("NetSNMP::OID::newwithptr", G_SCALAR);
385 fprintf(stderr, "unhandled OID error.\n");
392 MODULE = NetSNMP::agent PACKAGE = NetSNMP::agent::netsnmp_request_infoPtr PREFIX = nari_
400 netsnmp_request_info *request;
401 SV *optr, *arg, *rarg;
406 request = (netsnmp_request_info *) SvIV(SvRV(me));
408 o = SNMP_MALLOC_TYPEDEF(netsnmp_oid);
409 o->name = o->namebuf;
410 o->len = request->requestvb->name_length;
411 memcpy(o->name, request->requestvb->name,
412 request->requestvb->name_length * sizeof(oid));
414 rarg = newSViv((int) 0);
415 arg = newSVrv(rarg, "netsnmp_oidPtr");
416 sv_setiv(arg, (int) o);
421 i = perl_call_pv("NetSNMP::OID::newwithptr", G_SCALAR);
424 fprintf(stderr, "unhandled OID error.\n");
435 netsnmp_request_info *request;
437 request = (netsnmp_request_info *) SvIV(SvRV(me));
438 RETVAL = SNMP_MALLOC_TYPEDEF(netsnmp_oid);
439 RETVAL->name = RETVAL->namebuf;
440 RETVAL->len = request->requestvb->name_length;
441 memcpy(RETVAL->name, request->requestvb->name,
442 request->requestvb->name_length * sizeof(oid));
450 u_char *oidbuf = NULL;
451 size_t ob_len = 0, oo_len = 0;
452 netsnmp_request_info *request;
454 request = (netsnmp_request_info *) SvIV(SvRV(me));
455 sprint_realloc_by_type(&oidbuf, &ob_len, &oo_len, 1,
456 request->requestvb, 0, 0, 0);
457 RETVAL = oidbuf; /* mem leak */
462 nari_getDelegated(me)
465 netsnmp_request_info *request;
467 request = (netsnmp_request_info *) SvIV(SvRV(me));
468 RETVAL = request->delegated;
473 nari_setDelegated(me, newdelegated)
477 netsnmp_request_info *request;
479 request = (netsnmp_request_info *) SvIV(SvRV(me));
480 request->delegated = newdelegated;
483 nari_getProcessed(me)
486 netsnmp_request_info *request;
488 request = (netsnmp_request_info *) SvIV(SvRV(me));
489 RETVAL = request->processed;
494 nari_setProcessed(me, newprocessed)
498 netsnmp_request_info *request;
500 request = (netsnmp_request_info *) SvIV(SvRV(me));
501 request->processed = newprocessed;
507 netsnmp_request_info *request;
509 request = (netsnmp_request_info *) SvIV(SvRV(me));
510 RETVAL = request->status;
515 nari_setStatus(me, newstatus)
519 netsnmp_request_info *request;
521 request = (netsnmp_request_info *) SvIV(SvRV(me));
522 request->status = newstatus;
528 netsnmp_request_info *request;
530 request = (netsnmp_request_info *) SvIV(SvRV(me));
531 RETVAL = request->repeat;
536 nari_setRepeat(me, newrepeat)
540 netsnmp_request_info *request;
542 request = (netsnmp_request_info *) SvIV(SvRV(me));
543 request->repeat = newrepeat;
546 nari_setValue(me, type, value)
551 u_char *oidbuf = NULL;
552 size_t ob_len = 0, oo_len = 0;
553 netsnmp_request_info *request;
555 struct hostent *hent;
557 oid myoid[MAX_OID_LEN];
560 request = (netsnmp_request_info *) SvIV(SvRV(me));
563 ltmp = strtol(value, NULL, 0);
564 snmp_set_var_typed_value(request->requestvb, type,
565 (u_char *) <mp, sizeof(ltmp));
571 utmp = strtoul(value, NULL, 0);
572 snmp_set_var_typed_value(request->requestvb, type,
573 (u_char *) &utmp, sizeof(utmp));
578 snmp_set_var_typed_value(request->requestvb, type,
580 strlen(value)); /* XXX: null strs */
584 hent = gethostbyname(value);
585 snmp_set_var_typed_value(request->requestvb, type,
586 hent->h_addr_list[0], 4); /* XXX: i4v6... */
590 if (!snmp_parse_oid(value, myoid, &myoid_len)) {
591 fprintf(stderr, "couldn't parse %s in setOID\n", value);
593 request = (netsnmp_request_info *) SvIV(SvRV(me));
594 snmp_set_var_typed_value(request->requestvb, type,
595 (u_char *) myoid, myoid_len);
601 fprintf(stderr, "unknown var value type: %d (%s)\n",
611 nari_setOID(me, value)
615 oid myoid[MAX_OID_LEN];
616 size_t myoid_len = MAX_OID_LEN;
617 netsnmp_request_info *request;
619 if (!snmp_parse_oid(value, myoid, &myoid_len)) {
620 fprintf(stderr, "couldn't parse %s in setOID\n", value);
622 request = (netsnmp_request_info *) SvIV(SvRV(me));
623 snmp_set_var_objid(request->requestvb, myoid, myoid_len);
631 netsnmp_request_info *request;
635 request = (netsnmp_request_info *) SvIV(SvRV(me));
636 if (request && request->next) {
637 request = request->next;
639 arg = newSVrv(rarg, "NetSNMP::agent::netsnmp_request_infoPtr");
640 sv_setiv(arg, (int) request);
647 MODULE = NetSNMP::agent PACKAGE = NetSNMP::agent::netsnmp_agent_request_info PREFIX = narqi_
653 netsnmp_agent_request_info *reqinfo;
655 reqinfo = (netsnmp_agent_request_info *) SvIV(SvRV(me));
656 RETVAL = reqinfo->mode;
661 narqi_setMode(me, newvalue)
665 netsnmp_agent_request_info *reqinfo;
667 reqinfo = (netsnmp_agent_request_info *) SvIV(SvRV(me));
668 reqinfo->mode = newvalue;
671 MODULE = NetSNMP::agent PACKAGE = NetSNMP::agent