1 karl 1.3 //%2006////////////////////////////////////////////////////////////////////////
|
2 yi.zhou 1.1 //
3 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
6 // IBM Corp.; EMC Corporation, The Open Group.
7 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
9 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.3 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 yi.zhou 1.1 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
20 //
21 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 yi.zhou 1.1 #include <Pegasus/Common/Packer.h>
35 #include <Pegasus/Common/Tracer.h>
36 #include "snmpDeliverTrap_netsnmp.h"
37
38 PEGASUS_NAMESPACE_BEGIN
39
|
40 yi.zhou 1.4 void snmpDeliverTrap_netsnmp::initialize()
41 {
42
43 PEG_METHOD_ENTER (TRC_IND_HANDLER,
44 "snmpDeliverTrap_netsnmp::initialize");
45
46 // Defined default MIB modules (in net-snmp-config.h) do not need to be
47 // loaded and loading them can cause some stderr;
48 // use environment variable MIBS to override the default MIB modules.
49 // If there is no MIBS environment variable, add it in.
50 char *envVar;
51 envVar = getenv("MIBS");
52
53 if (envVar == NULL)
54 {
55 putenv("MIBS=");
56 }
57
58 // Initialize the mib reader
59 netsnmp_set_mib_directory("");
60 init_mib();
61 yi.zhou 1.4
62 // Initializes the SNMP library
63 init_snmp("snmpIndicationHandler");
64
65 // windows32 specific initialization (is a NOOP on unix)
66 SOCK_STARTUP;
67
68 PEG_METHOD_EXIT ();
69
70 }
71
72 void snmpDeliverTrap_netsnmp::terminate()
73 {
74
75 PEG_METHOD_ENTER (TRC_IND_HANDLER,
76 "snmpDeliverTrap_netsnmp::terminate");
77
78 SOCK_CLEANUP;
79
80 PEG_METHOD_EXIT ();
81 }
82 yi.zhou 1.4
|
83 yi.zhou 1.1 void snmpDeliverTrap_netsnmp::deliverTrap(
84 const String& trapOid,
85 const String& securityName,
86 const String& targetHost,
87 const Uint16& targetHostFormat,
88 const String& otherTargetHostFormat,
89 const Uint32& portNumber,
90 const Uint16& snmpVersion,
91 const String& engineID,
92 const Array<String>& vbOids,
93 const Array<String>& vbTypes,
94 const Array<String>& vbValues)
95 {
96
97 PEG_METHOD_ENTER (TRC_IND_HANDLER,
98 "snmpDeliverTrap_netsnmp::deliverTrap");
99
100 void *sessionHandle;
|
101 yi.zhou 1.4 struct snmp_session *sessionPtr;
|
102 yi.zhou 1.1
103 struct snmp_pdu *snmpPdu;
104
105 // Creates a SNMP session
|
106 yi.zhou 1.4 _createSession(targetHost, portNumber, securityName,
|
107 yi.zhou 1.1 sessionHandle, sessionPtr);
108
109 try
110 {
111 _createPdu(snmpVersion, trapOid, sessionPtr, snmpPdu);
112 }
113 catch (...)
114 {
115 _destroySession(sessionHandle);
116
117 PEG_METHOD_EXIT ();
118
119 throw;
120 }
121
122 // Pack OIDs into the PDU
123 try
124 {
125 _packOidsIntoPdu(vbOids, vbTypes, vbValues, snmpPdu);
126 }
127 catch (Exception& e)
128 yi.zhou 1.1 {
129 PEG_TRACE_STRING (TRC_DISCARDED_DATA, Tracer::LEVEL2,
130 e.getMessage ());
131
132 Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
133 Logger::WARNING,
134 _MSG_PACK_CIM_PROPERTY_TO_PDU_FAILED_KEY,
135 _MSG_PACK_CIM_PROPERTY_TO_PDU_FAILED,
136 e.getMessage());
137 }
138 catch (...)
139 {
140 PEG_TRACE_STRING (TRC_DISCARDED_DATA, Tracer::LEVEL2,
141 "Snmp Indication Handler failed to pack a CIM "
142 "Property into the SNMP PDU: Unknown exception.");
143 }
144
145 // Send the trap to the destination
146 if (snmp_sess_send(sessionHandle, snmpPdu) == 0)
147 {
148 Sint32 libErr, sysErr;
149 yi.zhou 1.1 char *errStr;
150
151 // snmp_sess_send failed
152 // get library, system errno
153 snmp_sess_error(sessionHandle, &libErr, &sysErr, &errStr);
154
155 String exceptionStr = _MSG_SESSION_SEND_FAILED;
156 exceptionStr.append (errStr);
157
158 free(errStr);
159
160 _destroySession(sessionHandle);
161
162 PEG_METHOD_EXIT ();
163
164 throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
165 MessageLoaderParms(_MSG_SESSION_SEND_FAILED_KEY,
166 exceptionStr));
167 }
168
169 _destroySession(sessionHandle);
170 yi.zhou 1.1
171 PEG_METHOD_EXIT ();
172
173 }
174
175 // Creates a SNMP session
176 void snmpDeliverTrap_netsnmp::_createSession(
177 const String & targetHost,
178 Uint32 portNumber,
179 const String & securityName,
180 void *&sessionHandle,
181 snmp_session *&sessionPtr)
182 {
183 PEG_METHOD_ENTER (TRC_IND_HANDLER,
184 "snmpDeliverTrap_netsnmp::_createSession");
185
186 Sint32 libErr, sysErr;
187 char *errStr;
188 String exceptionStr;
|
189 yi.zhou 1.4
190 struct snmp_session snmpSession;
|
191 yi.zhou 1.1
|
192 yi.zhou 1.2 {
|
193 yi.zhou 1.4 AutoMutex autoMut(_sessionInitMutex);
|
194 yi.zhou 1.1 snmp_sess_init(&snmpSession);
195
196 CString targetHostCStr = targetHost.getCString();
197
198 // peername has format: targetHost:portNumber
199 snmpSession.peername = (char *)malloc((size_t)(strlen(targetHostCStr)+
200 1+32));
201 sprintf(snmpSession.peername, "%s:%u", (const char*)targetHostCStr,
202 portNumber);
|
203 yi.zhou 1.4
|
204 yi.zhou 1.1 sessionHandle = snmp_sess_open(&snmpSession);
|
205 yi.zhou 1.4 }
|
206 yi.zhou 1.1
207 if (sessionHandle == NULL)
208 {
209 exceptionStr = _MSG_SESSION_OPEN_FAILED;
210
211 // Get library, system errno
|
212 yi.zhou 1.5 snmp_error(&snmpSession, &libErr, &sysErr, &errStr);
|
213 yi.zhou 1.1
214 exceptionStr.append(errStr);
215
216 free(errStr);
217
218 PEG_METHOD_EXIT ();
219
220 throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
221 MessageLoaderParms(_MSG_SESSION_OPEN_FAILED_KEY,
222 exceptionStr));
223
224 }
225
226 try
227 {
228 // get the snmp_session pointer
229 sessionPtr = snmp_sess_session(sessionHandle);
230 if (sessionPtr == NULL)
231 {
232 exceptionStr = _MSG_GET_SESSION_POINT_FAILED;
233
234 yi.zhou 1.1 // Get library, system errno
235 snmp_sess_error(&snmpSession, &libErr, &sysErr, &errStr);
236
237 exceptionStr.append(errStr);
238
239 free(errStr);
240
241 throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
242 MessageLoaderParms(_MSG_GET_SESSION_POINTER_FAILED_KEY,
243 exceptionStr));
244 }
245
246 // Community Name, default is public
247 String communityName;
248 if (securityName.size() == 0)
249 {
250 communityName.assign("public");
251 }
252 else
253 {
254 communityName = securityName;
255 yi.zhou 1.1 }
256
|
257 yi.zhou 1.7 free(snmpSession.peername);
|
258 yi.zhou 1.1
|
259 yi.zhou 1.7 free(sessionPtr->community);
|
260 yi.zhou 1.1
261 CString communityNameCStr = communityName.getCString();
262 size_t communityNameLen = strlen(communityNameCStr);
263
264 sessionPtr->community = (u_char*)malloc(communityNameLen);
265
266 memcpy(sessionPtr->community, (const char *)communityNameCStr,
267 communityNameLen);
268 sessionPtr->community_len = communityNameLen;
269 }
270 catch (...)
271 {
272 _destroySession(sessionHandle);
273
274 PEG_METHOD_EXIT ();
275 throw;
276 }
277
278 PEG_METHOD_EXIT ();
279 }
280
281 yi.zhou 1.1 // Creates a SNMP session
282 void snmpDeliverTrap_netsnmp::_destroySession(
283 void *sessionHandle)
284 {
285 PEG_METHOD_ENTER (TRC_IND_HANDLER,
286 "snmpDeliverTrap_netsnmp::_destroySession");
287
288 snmp_sess_close(sessionHandle);
289
290 PEG_METHOD_EXIT ();
291 }
292
293 // Creates a SNMP TRAP PDU
294 void snmpDeliverTrap_netsnmp::_createPdu(
295 Uint16 snmpVersion,
296 const String& trapOid,
297 snmp_session *&sessionPtr,
298 snmp_pdu *& snmpPdu)
299 {
300
301 PEG_METHOD_ENTER (TRC_IND_HANDLER,
302 yi.zhou 1.1 "snmpDeliverTrap_netsnmp::_createPdu");
303
304 oid _SYSTEM_UP_TIME_OID [] = {1,3,6,1,2,1,1,3,0};
305 oid _SNMPTRAP_OID [] = {1,3,6,1,6,3,1,1,4,1,0};
306
307 in_addr_t *pduInAddr;
308
309 switch (snmpVersion)
310 {
311 case _SNMPv1_TRAP:
312 {
313
314 sessionPtr->version = SNMP_VERSION_1;
315
316 // Create the PDU
317 snmpPdu = snmp_pdu_create(SNMP_MSG_TRAP);
318
319 // Failed to create pdu
320 if (!snmpPdu)
321 {
322 PEG_METHOD_EXIT ();
323 yi.zhou 1.1
324 throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
325 MessageLoaderParms(_MSG_PDU_CREATE_FAILED_KEY,
326 _MSG_PDU_CREATE_FAILED));
327 }
328
329 // Make sure that the v1 trap PDU includes the local IP address
330 pduInAddr = (in_addr_t*) snmpPdu->agent_addr;
331 *pduInAddr = get_myaddr();
332
333 // get system up time
334 snmpPdu->time = get_uptime();
335
336 // Pack trap information into the PDU
337 try
338 {
339 _packTrapInfoIntoPdu(trapOid, snmpPdu);
340 }
341 catch (CIMException& e)
342 {
343 PEG_TRACE_STRING (TRC_DISCARDED_DATA, Tracer::LEVEL2,
344 yi.zhou 1.1 e.getMessage ());
345 Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
346 Logger::WARNING,
347 _MSG_PACK_TRAP_INFO_INTO_PDU_FAILED_KEY,
348 _MSG_PACK_TRAP_INFO_INTO_PDU_FAILED,
349 e.getMessage());
350 }
351
352 break;
353 }
354 case _SNMPv2C_TRAP:
355 {
356 sessionPtr->version = SNMP_VERSION_2c;
357
358 // Create the PDU
359 snmpPdu = snmp_pdu_create(SNMP_MSG_TRAP2);
360
361 // Failed to create pdu
362 if (!snmpPdu)
363 {
364 PEG_METHOD_EXIT ();
365 yi.zhou 1.1
366 throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
367 MessageLoaderParms(_MSG_PDU_CREATE_FAILED_KEY,
368 _MSG_PDU_CREATE_FAILED));
369 }
370
371 // Add sysUpTime to the PDU
372 char sysUpTime[32];
373 sprintf(sysUpTime, "%ld", get_uptime());
374
375 Sint32 retCode;
376 retCode = snmp_add_var(snmpPdu, _SYSTEM_UP_TIME_OID,
377 OID_LENGTH(_SYSTEM_UP_TIME_OID), 't',
378 sysUpTime);
379
380
381 // Failed to add sysUpTime to the pdu
382 if (retCode != 0)
383 {
384 String errMsg = snmp_api_errstring(retCode);
385
386 yi.zhou 1.1 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
387 "Failed to add sysUpTime to pdu: " +
388 errMsg);
389 Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
390 Logger::WARNING,
391 _MSG_ADD_SYSUPTIME_TO_PDU_FAILED_KEY,
392 _MSG_ADD_SYSUPTIME_TO_PDU_FAILED,
393 errMsg);
394 }
395
396 // Add snmp trap to the PDU
397 retCode = snmp_add_var(snmpPdu, _SNMPTRAP_OID, OID_LENGTH(
398 _SNMPTRAP_OID), 'o', trapOid.getCString());
399
400 // Failed to add snmp trap to the pdu
401 if (retCode != 0)
402 {
403 String errMsg = snmp_api_errstring(retCode);
404
405 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
406 "Failed to add snmp trap to pdu: " +
407 yi.zhou 1.1 errMsg);
408 Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
409 Logger::WARNING,
410 _MSG_ADD_SNMP_TRAP_TO_PDU_FAILED_KEY,
411 _MSG_ADD_SNMP_TRAP_TO_PDU_FAILED,
412 errMsg);
413 }
414
415 break;
416 }
417 default:
418 {
419 PEG_METHOD_EXIT ();
420
421 throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,
422 MessageLoaderParms(_MSG_VERSION_NOT_SUPPORTED_KEY,
423 _MSG_VERSION_NOT_SUPPORTED));
424 }
425 }
426
427 PEG_METHOD_EXIT ();
428 yi.zhou 1.1 }
429
430
431 // Pack trap information into the PDU
432 void snmpDeliverTrap_netsnmp::_packTrapInfoIntoPdu(
433 const String & trapOid,
434 snmp_pdu * snmpPdu)
435 {
436 PEG_METHOD_ENTER (TRC_IND_HANDLER,
437 "snmpDeliverTrap_netsnmp::_packTrapInfoIntoPdu");
438
439 oid enterpriseOid[MAX_OID_LEN];
440 size_t enterpriseOidLength;
441
442 Array<String> standard_traps;
443
444 standard_traps.append(String("1.3.6.1.6.3.1.1.5.1"));
445 standard_traps.append(String("1.3.6.1.6.3.1.1.5.2"));
446 standard_traps.append(String("1.3.6.1.6.3.1.1.5.3"));
447 standard_traps.append(String("1.3.6.1.6.3.1.1.5.4"));
448 standard_traps.append(String("1.3.6.1.6.3.1.1.5.5"));
449 yi.zhou 1.1 standard_traps.append(String("1.3.6.1.6.3.1.1.5.6"));
450
451 Array<const char *> oidSubIdentifiers;
452
453 CString trapOidCStr = trapOid.getCString();
454
455 char * trapOidCopy = strdup(trapOidCStr);
456
457 #if !defined(PEGASUS_PLATFORM_WIN32_IX86_MSVC)
458 char *last;
459 for (const char* p = strtok_r(trapOidCopy, ".", &last); p;
460 p=strtok_r(NULL, ".", &last))
461 #else
462 for (const char* p = strtok(trapOidCopy, "."); p; p=strtok(NULL, "."))
463 #endif
464 {
465 oidSubIdentifiers.append(p);
466 }
467
468 long genTrap = 0;
469 long specTrap = 0;
470 yi.zhou 1.1
471 enterpriseOidLength = MAX_OID_LEN;
472
473 char * numericEntOid = (char *) malloc(strlen(trapOidCStr));
474 if (Contains(standard_traps, trapOid))
475 {
476 //
477 // if the trapOid is one of the standard traps,
478 // then the SNMPV1 enterprise parameter must be set
479 // to the value of the trapOid, the generic-trap
480 // parameter must be set to one of (0 - 5), and the
481 // specific-trap parameter must be set to 0
482 //
483
484 // Convert trapOid from numeric form to a list of subidentifiers
485 if (read_objid((const char*)trapOidCStr, enterpriseOid,
486 &enterpriseOidLength) == 0)
487 {
488 // Failed to parse trapOid
489
490 PEG_METHOD_EXIT ();
491 yi.zhou 1.1 throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
492 MessageLoaderParms(_MSG_READ_OBJID_FAILED_KEY,
493 _MSG_READ_OBJID_FAILED,
494 trapOid));
495 }
496
497 // the generic trap is last sub-identifier of the
498 // trapOid minus 1
499 snmpPdu->trap_type =
500 atoi(oidSubIdentifiers[oidSubIdentifiers.size() - 1]) - 1;
501 snmpPdu->specific_type = 0;
502 }
503 else
504 {
505 //
506 // if the trapOid is not one of the standard traps:
507 // then 1) the generic-trap parameter must be set to 6,
508 // 2) if the next-to-last sub-identifier of the
509 // trapOid is zero, then the SNMPV1 enterprise
510 // parameter is the trapOid with the last 2
511 // sub-identifiers removed, otherwise, the
512 yi.zhou 1.1 // SNMPV1 enterprise parameter is the trapOid
513 // with the last sub-identifier removed;
514 // 3) the SNMPv1 specific-trap parameter is the last
515 // sub-identifier of the trapOid;
516 //
517
518 snmpPdu->trap_type = 6;
519
520 snmpPdu->specific_type =
521 atoi(oidSubIdentifiers[oidSubIdentifiers.size()-1]);
522
523 strcpy(numericEntOid, oidSubIdentifiers[0]);
524 for (Uint32 i = 1; i < oidSubIdentifiers.size()-2; i++)
525 {
526 strcat(numericEntOid, ".");
527 strcat(numericEntOid, oidSubIdentifiers[i]);
528 }
529
|
530 yi.zhou 1.6 if (strcmp(oidSubIdentifiers[oidSubIdentifiers.size()-2], "0") != 0)
|
531 yi.zhou 1.1 {
532 strcat(numericEntOid, ".");
533 strcat(numericEntOid,
534 oidSubIdentifiers[oidSubIdentifiers.size()-2]);
535 }
536
537 // Convert ent from numeric form to a list of subidentifiers
538 if (read_objid(numericEntOid, enterpriseOid,
539 &enterpriseOidLength) == 0)
540 {
541 // Failed to parse numericEntOid
542
543 PEG_METHOD_EXIT ();
544
545 throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
546 MessageLoaderParms(_MSG_READ_ENTOID_FAILED_KEY,
547 _MSG_READ_ENTOID_FAILED,
548 String(numericEntOid)));
549 }
550
551 }
552 yi.zhou 1.1
553 snmpPdu->enterprise = (oid*) malloc(enterpriseOidLength * sizeof(oid));
554 memcpy(snmpPdu->enterprise, enterpriseOid,
555 enterpriseOidLength * sizeof(oid));
556
557 snmpPdu->enterprise_length = enterpriseOidLength;
558
559 free(trapOidCopy);
560 free(numericEntOid);
561
562 PEG_METHOD_EXIT ();
563 }
564
565 // Pack oids into the PDU
566 void snmpDeliverTrap_netsnmp::_packOidsIntoPdu(
567 const Array<String>& vbOids,
568 const Array<String>& vbTypes,
569 const Array<String>& vbValues,
570 snmp_pdu * snmpPdu)
571 {
572
573 yi.zhou 1.1 PEG_METHOD_ENTER (TRC_IND_HANDLER,
574 "snmpDeliverTrap_netsnmp::_packOidsIntoPdu");
575
576 char dataType;
577 oid vbOid[MAX_OID_LEN];
578 size_t vbOidLength = MAX_OID_LEN;
579
580 for (Uint32 i=0; i < vbOids.size(); i++)
581 {
582 if (vbTypes[i] == "OctetString")
583 {
584 dataType = 's';
585 }
586 else if (vbTypes[i] == "Integer")
587 {
588 dataType = 'i';
589 }
590 else if (vbTypes[i] == "OID")
591 {
592 dataType = 'o';
593 }
594 yi.zhou 1.1 else
595 {
596 // Integer, OctetString, and OID are supported SNMP Data Types
597 // for the CIM Property
598
599 PEG_METHOD_EXIT ();
600
601 throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
602 MessageLoaderParms(_MSG_UNSUPPORTED_SNMP_DATA_TYPE_KEY,
603 _MSG_UNSUPPORTED_SNMP_DATA_TYPE,
604 vbTypes[i]));
605
606 }
607
608 // Convert oid of a CIM property from numeric form to a list of
609 // subidentifiers
610 if (read_objid((const char*)vbOids[i].getCString(), vbOid,
611 &vbOidLength) == 0)
612 {
613 // Failed to parse vbOids
614
615 yi.zhou 1.1 PEG_METHOD_EXIT ();
616
617 throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
618 MessageLoaderParms(_MSG_PARSE_CIM_PROPERTY_OID_FAILED_KEY,
619 _MSG_PARSE_CIM_PROPERTY_OID_FAILED,
620 vbOids[i]));
621 }
622
623 Sint32 retCode;
624 retCode = snmp_add_var(snmpPdu, vbOid, vbOidLength, dataType,
625 vbValues[i].getCString());
626
627 // Failed to add vbOid to the pdu
628 if (retCode != 0)
629 {
630 PEG_METHOD_EXIT ();
631
632 throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
633 MessageLoaderParms(_MSG_ADD_VAR_TO_PDU_FAILED_KEY,
634 _MSG_ADD_VAR_TO_PDU_FAILED,
635 vbOids[i],
636 yi.zhou 1.1 String(snmp_api_errstring(retCode))));
637
638 }
639 }
640
641 PEG_METHOD_EXIT ();
642 }
643
644 PEGASUS_NAMESPACE_END
|