00001 #include <net-snmp/net-snmp-config.h>
00002
00003 #include <stdio.h>
00004 #include <sys/types.h>
00005 #include <errno.h>
00006
00007 #if HAVE_STRING_H
00008 #include <string.h>
00009 #else
00010 #include <strings.h>
00011 #endif
00012 #if HAVE_STDLIB_H
00013 #include <stdlib.h>
00014 #endif
00015 #if HAVE_UNISTD_H
00016 #include <unistd.h>
00017 #endif
00018
00019 #if HAVE_DMALLOC_H
00020 #include <dmalloc.h>
00021 #endif
00022
00023 #include <net-snmp/types.h>
00024 #include <net-snmp/output_api.h>
00025 #include <net-snmp/utilities.h>
00026 #include <net-snmp/config_api.h>
00027
00028 #include <net-snmp/library/snmp_transport.h>
00029
00030 oid netsnmp_snmpALIASDomain[] = { 1,3,6,1,4,1,8072,3,3,7 };
00031 static netsnmp_tdomain aliasDomain;
00032
00033
00034 static netsnmp_data_list *alias_memory = NULL;
00035
00036
00037 void
00038 parse_alias_config(const char *token, char *line) {
00039 char aliasname[SPRINT_MAX_LEN];
00040 char transportdef[SPRINT_MAX_LEN];
00041
00042
00043 line = copy_nword(line, aliasname, sizeof(aliasname));
00044 line = copy_nword(line, transportdef, sizeof(transportdef));
00045 if (line)
00046 config_perror("more data than expected");
00047 netsnmp_data_list_add_node(&alias_memory,
00048 netsnmp_create_data_list(aliasname,
00049 strdup(transportdef),
00050 &free));
00051 }
00052
00053 void
00054 free_alias_config(void) {
00055 netsnmp_free_all_list_data(alias_memory);
00056 alias_memory = NULL;
00057 }
00058
00059
00060
00061
00062
00063
00064
00065 netsnmp_transport *
00066 netsnmp_alias_create_tstring(const char *str, int local,
00067 const char *default_target)
00068 {
00069 const char *aliasdata;
00070
00071 aliasdata = (const char*)netsnmp_get_list_data(alias_memory, str);
00072 if (!aliasdata) {
00073 snmp_log(LOG_ERR, "No alias found for %s\n", str);
00074 return NULL;
00075 }
00076
00077 return netsnmp_tdomain_transport(aliasdata,local,default_target);
00078 }
00079
00080
00081
00082 netsnmp_transport *
00083 netsnmp_alias_create_ostring(const u_char * o, size_t o_len, int local)
00084 {
00085 fprintf(stderr, "make ostring\n");
00086 return NULL;
00087 }
00088
00089 void
00090 netsnmp_alias_ctor(void)
00091 {
00092 aliasDomain.name = netsnmp_snmpALIASDomain;
00093 aliasDomain.name_length = sizeof(netsnmp_snmpALIASDomain) / sizeof(oid);
00094 aliasDomain.prefix = (const char **)calloc(2, sizeof(char *));
00095 aliasDomain.prefix[0] = "alias";
00096
00097 aliasDomain.f_create_from_tstring_new = netsnmp_alias_create_tstring;
00098 aliasDomain.f_create_from_ostring = netsnmp_alias_create_ostring;
00099
00100 netsnmp_tdomain_register(&aliasDomain);
00101
00102 register_config_handler("snmp", "alias", parse_alias_config,
00103 free_alias_config, "NAME TRANSPORT_DEFINITION");
00104 }