1 #include <net-snmp/net-snmp-config.h>
2
3 #include <net-snmp/types.h>
4 #include <net-snmp/library/snmpAliasDomain.h>
5
6 #include <stdio.h>
7 #include <sys/types.h>
8 #include <errno.h>
9
10 #if HAVE_STRING_H
11 #include <string.h>
12 #else
13 #include <strings.h>
14 #endif
15 #if HAVE_STDLIB_H
16 #include <stdlib.h>
17 #endif
18 #if HAVE_UNISTD_H
19 #include <unistd.h>
20 #endif
21
22 #include <net-snmp/net-snmp-includes.h>
23 #include <net-snmp/types.h>
24 #include <net-snmp/output_api.h>
25 #include <net-snmp/utilities.h>
26 #include <net-snmp/config_api.h>
27
28 oid netsnmp_snmpALIASDomain[] = { 1,3,6,1,4,1,8072,3,3,7 };
29 static netsnmp_tdomain aliasDomain;
30
31 /* simple storage mechanism */
32 static netsnmp_data_list *alias_memory = NULL;
33
34 #ifdef HAVE_DMALLOC_H
free_wrapper(void * p)35 static void free_wrapper(void * p)
36 {
37 free(p);
38 }
39 #else
40 #define free_wrapper free
41 #endif
42
43 /* An alias parser */
44 void
parse_alias_config(const char * token,char * line)45 parse_alias_config(const char *token, char *line) {
46 char aliasname[SPRINT_MAX_LEN];
47 char transportdef[SPRINT_MAX_LEN];
48 /* copy the first word (the alias) out and then assume the rest is
49 transport */
50 line = copy_nword(line, aliasname, sizeof(aliasname));
51 line = copy_nword(line, transportdef, sizeof(transportdef));
52 if (line)
53 config_perror("more data than expected");
54 netsnmp_data_list_add_node(&alias_memory,
55 netsnmp_create_data_list(aliasname,
56 strdup(transportdef),
57 &free_wrapper));
58 }
59
60 void
free_alias_config(void)61 free_alias_config(void) {
62 netsnmp_free_all_list_data(alias_memory);
63 alias_memory = NULL;
64 }
65
66 /*
67 * Open a ALIAS-based transport for SNMP. Local is TRUE if addr is the local
68 * address to bind to (i.e. this is a server-type session); otherwise addr is
69 * the remote address to send things to.
70 */
71
72 netsnmp_transport *
netsnmp_alias_create_tstring(const char * str,int local,const char * default_target)73 netsnmp_alias_create_tstring(const char *str, int local,
74 const char *default_target)
75 {
76 const char *aliasdata;
77
78 aliasdata = (const char*)netsnmp_get_list_data(alias_memory, str);
79 if (!aliasdata) {
80 snmp_log(LOG_ERR, "No alias found for %s\n", str);
81 return NULL;
82 }
83
84 return netsnmp_tdomain_transport(aliasdata,local,default_target);
85 }
86
87
88
89 netsnmp_transport *
netsnmp_alias_create_ostring(const void * o,size_t o_len,int local)90 netsnmp_alias_create_ostring(const void *o, size_t o_len, int local)
91 {
92 fprintf(stderr, "make ostring\n");
93 return NULL;
94 }
95
96 void
netsnmp_alias_ctor(void)97 netsnmp_alias_ctor(void)
98 {
99 aliasDomain.name = netsnmp_snmpALIASDomain;
100 aliasDomain.name_length = sizeof(netsnmp_snmpALIASDomain) / sizeof(oid);
101 aliasDomain.prefix = (const char **)calloc(2, sizeof(char *));
102 aliasDomain.prefix[0] = "alias";
103
104 aliasDomain.f_create_from_tstring_new = netsnmp_alias_create_tstring;
105 aliasDomain.f_create_from_ostring = netsnmp_alias_create_ostring;
106
107 netsnmp_tdomain_register(&aliasDomain);
108
109 register_config_handler("snmp", "alias", parse_alias_config,
110 free_alias_config, "NAME TRANSPORT_DEFINITION");
111 }
112