Revert "Revert "and added files""
[bcm963xx.git] / userapps / opensource / net-snmp / agent / mibgroup / examples / ucdDemoPublic.c
1 /*
2  * ucdDemoPublic.c 
3  */
4
5 #include <net-snmp/net-snmp-config.h>
6 #if HAVE_STDLIB_H
7 #include <stdlib.h>
8 #endif
9 #if HAVE_STRING_H
10 #include <string.h>
11 #else
12 #include <strings.h>
13 #endif
14
15 #if TIME_WITH_SYS_TIME
16 # ifdef WIN32
17 #  include <sys/timeb.h>
18 # else
19 #  include <sys/time.h>
20 # endif
21 # include <time.h>
22 #else
23 # if HAVE_SYS_TIME_H
24 #  include <sys/time.h>
25 # else
26 #  include <time.h>
27 # endif
28 #endif
29
30 #if HAVE_WINSOCK_H
31 #include <winsock.h>
32 #endif
33
34 #include <net-snmp/net-snmp-includes.h>
35 #include <net-snmp/agent/net-snmp-agent-includes.h>
36
37 #include "util_funcs.h"
38 #include "ucdDemoPublic.h"
39
40 #define MYMAX 1024
41 #define MAXUSERS 10
42
43 int             num = 0;
44 static char     demoUsers[MAXUSERS][MYMAX + 1];
45 static char     demopass[MYMAX + 1];
46
47 void
48 ucdDemo_parse_user(const char *word, char *line)
49 {
50     if (num == MAXUSERS)
51         return;
52
53     if (strlen(line) > MYMAX)
54         return;
55
56     strcpy(demoUsers[num++], line);
57 }
58
59
60 void
61 ucdDemo_parse_userpass(const char *word, char *line)
62 {
63     if (strlen(line) > MYMAX)
64         return;
65
66     strcpy(demopass, line);
67 }
68
69 /*
70  * this variable defines function callbacks and type return information 
71  * for the ucdDemoPublic mib 
72  */
73
74 struct variable2 ucdDemoPublic_variables[] = {
75     {UCDDEMORESETKEYS, ASN_INTEGER, RWRITE, var_ucdDemoPublic, 1, {1}},
76     {UCDDEMOPUBLICSTRING, ASN_OCTET_STR, RWRITE, var_ucdDemoPublic, 1,
77      {2}},
78     {UCDDEMOUSERLIST, ASN_OCTET_STR, RWRITE, var_ucdDemoPublic, 1, {3}},
79     {UCDDEMOPASSPHRASE, ASN_OCTET_STR, RWRITE, var_ucdDemoPublic, 1, {4}},
80
81 };
82
83 /*
84  * Define the OID pointer to the top of the mib tree that we're
85  * registering underneath 
86  */
87 oid             ucdDemoPublic_variables_oid[] =
88     { 1, 3, 6, 1, 4, 1, 2021, 14, 1, 1 };
89
90 void
91 init_ucdDemoPublic(void)
92 {
93     REGISTER_MIB("examples/ucdDemoPublic", ucdDemoPublic_variables,
94                  variable2, ucdDemoPublic_variables_oid);
95     snmpd_register_config_handler("demoUser",
96                                   ucdDemo_parse_user, NULL, "USER");
97     snmpd_register_config_handler("demoPass",
98                                   ucdDemo_parse_userpass, NULL,
99                                   "PASSPHASE");
100 }
101
102 unsigned char   publicString[MYMAX + 1];
103
104 unsigned char  *
105 var_ucdDemoPublic(struct variable *vp,
106                   oid * name,
107                   size_t * length,
108                   int exact, size_t * var_len, WriteMethod ** write_method)
109 {
110     static long     long_ret;
111     static char     string[MYMAX + 1], *cp;
112     int             i;
113
114     *write_method = 0;          /* assume it isnt writable for the time being */
115     *var_len = sizeof(long_ret);        /* assume an integer and change later if not */
116
117     if (header_generic(vp, name, length, exact, var_len, write_method))
118         return 0;
119
120     /*
121      * this is where we do the value assignments for the mib results. 
122      */
123     switch (vp->magic) {
124
125     case UCDDEMORESETKEYS:
126         *write_method = write_ucdDemoResetKeys;
127         long_ret = 0;
128         return (unsigned char *) &long_ret;
129
130     case UCDDEMOPUBLICSTRING:
131         *write_method = write_ucdDemoPublicString;
132         *var_len = strlen(publicString);
133         return (unsigned char *) publicString;
134
135     case UCDDEMOUSERLIST:
136         cp = string;
137         for (i = 0; i < num; i++) {
138             snprintf(cp, sizeof(string)-strlen(string), " %s", demoUsers[i]);
139             string[MYMAX] = 0;
140             cp = cp + strlen(cp);
141         }
142         *var_len = strlen(string);
143         return (unsigned char *) string;
144
145     case UCDDEMOPASSPHRASE:
146         *var_len = strlen(demopass);
147         return (unsigned char *) demopass;
148
149     default:
150         DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ucdDemoPublic\n",
151                     vp->magic));
152     }
153     return 0;
154 }
155
156 int
157 write_ucdDemoResetKeys(int action,
158                        u_char * var_val,
159                        u_char var_val_type,
160                        size_t var_val_len,
161                        u_char * statP, oid * name, size_t name_len)
162 {
163     /*
164      * variables we may use later 
165      */
166     static long     long_ret;
167     unsigned char  *engineID;
168     size_t          engineIDLen;
169     int             i;
170     struct usmUser *user;
171
172     if (var_val_type != ASN_INTEGER) {
173         DEBUGMSGTL(("ucdDemoPublic",
174                     "write to ucdDemoResetKeys not ASN_INTEGER\n"));
175         return SNMP_ERR_WRONGTYPE;
176     }
177     if (var_val_len > sizeof(long_ret)) {
178         DEBUGMSGTL(("ucdDemoPublic",
179                     "write to ucdDemoResetKeys: bad length\n"));
180         return SNMP_ERR_WRONGLENGTH;
181     }
182     if (action == COMMIT) {
183         long_ret = *((long *) var_val);
184         if (long_ret == 1) {
185             engineID = snmpv3_generate_engineID(&engineIDLen);
186             for (i = 0; i < num; i++) {
187                 user = usm_get_user(engineID, engineIDLen, demoUsers[i]);
188                 if (user) {
189                     usm_set_user_password(user, "userSetAuthPass",
190                                           demopass);
191                     usm_set_user_password(user, "userSetPrivPass",
192                                           demopass);
193                 }
194             }
195             /*
196              * reset the keys 
197              */
198         }
199     }
200     return SNMP_ERR_NOERROR;
201 }
202
203 int
204 write_ucdDemoPublicString(int action,
205                           u_char * var_val,
206                           u_char var_val_type,
207                           size_t var_val_len,
208                           u_char * statP, oid * name, size_t name_len)
209 {
210     if (var_val_type != ASN_OCTET_STR) {
211         DEBUGMSGTL(("ucdDemoPublic",
212                     "write to ucdDemoPublicString not ASN_OCTET_STR\n"));
213         return SNMP_ERR_WRONGTYPE;
214     }
215     if (var_val_len > MYMAX) {
216         DEBUGMSGTL(("ucdDemoPublic",
217                     "write to ucdDemoPublicString: bad length\n"));
218         return SNMP_ERR_WRONGLENGTH;
219     }
220     if (action == COMMIT) {
221         if (var_val_len != 0) {
222             strcpy(publicString, var_val);
223             publicString[var_val_len] = '\0';
224         } else
225             publicString[0] = '\0';
226     }
227     return SNMP_ERR_NOERROR;
228 }