xref: /onnv-gate/usr/src/cmd/agents/snmp/agent/access.c (revision 0:68f95e015346)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 #include <stdlib.h>
30 #include <stdio.h>
31 #include <string.h>
32 #include <sys/types.h>
33 #include <sys/socket.h>
34 #include <netinet/in.h>
35 #include <arpa/inet.h>
36 
37 #include "impl.h"
38 #include "error.h"
39 #include "trace.h"
40 #include "asn1.h"
41 #include "snmp.h"
42 #include "trap.h"
43 
44 #include "agent_msg.h"
45 #include "access.h"
46 
47 #define WILD_CARD_HOST_NAME	"*"
48 #define WILD_CARD_ADDRESS 0
49 
50 #define MAX_BUF_SIZE 256
51 
52 /***** STATIC VARIABLES *****/
53 
54 static Manager *first_manager = NULL;
55 static Community *first_community = NULL;
56 
57 static EFilter *first_efilter = NULL;
58 
59 static NameOidPair *first_name_oid_pair = NULL;
60 
61 
init_manager_set()62 void init_manager_set ()
63 {
64 	first_community = NULL;	/* TODO: check this out */
65 	first_manager = NULL;
66 }
67 
set_first_manager(Manager * mgr)68 void set_first_manager (Manager *mgr)
69 {
70 	first_manager = mgr;
71 }
72 
get_curr_manager_set()73 Manager * get_curr_manager_set ()
74 {
75 	return first_manager;
76 }
77 
78 /***********************************************************/
79 
80 /*
81  *	returns	0 if OK
82  *		1 if error
83  *		-1 if fatal error
84  */
85 
manager_add(char * name,char * error_label)86 Manager* manager_add(char *name, char *error_label)
87 {
88 	IPAddress ip_address;
89 	Manager *new;
90 	Manager *m;
91 
92 
93 	error_label[0] = '\0';
94 
95 
96 	if(name == NULL)
97 	{
98 		(void)sprintf(error_label, "BUG: manager_add(): name is NULL");
99 		return NULL;
100 	}
101 
102 
103 	/* skip the ip adx for wild-card host */
104 
105 	if(strcmp(name,WILD_CARD_HOST_NAME)){
106 		/* try to find the IP address from the name */
107 		if(name_to_ip_address(name, &ip_address, error_label))
108 		{
109 			return NULL;
110 		}
111 	}
112 
113 
114 	/* checking for dup is on the wild-card host name */
115 
116 
117 	/* check if this manager does not already exist */
118 	if(strcmp(name,WILD_CARD_HOST_NAME)){
119 		for(m = first_manager; m; m = m->next_manager)
120 		{
121 			if(ip_address.s_addr == m->ip_address.s_addr)
122 			{
123 				(void)sprintf(error_label, ERR_MSG_MANAGER_DUP, name);
124 				return m;
125 			}
126 		}
127 	}else{
128 		for(m = first_manager; m; m = m->next_manager)
129 		{
130 			if(!strcmp(m->name,name))
131 			{
132 				return m;
133 			}
134 		}
135 	}
136 
137 
138 	/* allocate, initialize and link the new manager */
139 	new = (Manager *) calloc(1,sizeof(Manager));
140 	if(new == NULL)
141 	{
142 		(void)sprintf(error_label, ERR_MSG_ALLOC);
143 		return NULL;
144 	}
145 	new->next_manager = NULL;
146 	new->name = NULL;
147 
148 	new->name = strdup(name);
149 	if(new->name == NULL)
150 	{
151 		(void)sprintf(error_label, ERR_MSG_ALLOC);
152 		free(new);
153 		return NULL;
154 	}
155 
156 	/* ip adx for wild-card host should be zero */
157 
158 	if(strcmp(name,WILD_CARD_HOST_NAME)){
159 		new->ip_address.s_addr = ip_address.s_addr;
160 	}else{
161 		new->ip_address.s_addr = WILD_CARD_ADDRESS;
162 
163 	}
164 
165 	new->next_manager = first_manager;
166 	first_manager = new;
167 
168 
169 	return new;
170 }
171 
172 /***********************************************************/
173 
174 /*
175  * returns a pointer to the manager if the request succeeds,
176  * otherwise returns NULL
177  */
178 
is_valid_manager(Address * address,Manager ** mngr)179 Manager *is_valid_manager(Address *address, Manager **mngr)
180 {
181         Manager *m;
182 
183         *mngr = NULL;
184 
185         if(address == NULL)
186         {
187                 error("BUG: is_valid_manager(): address is NULL");
188                 return NULL;
189         }
190 
191         if(first_manager == NULL)
192         {
193                 return NULL;
194         }
195 
196         for(m = first_manager; m; m = m->next_manager)
197         {
198                 if(address->sin_addr.s_addr == m->ip_address.s_addr)
199                 {
200                         *mngr = m;
201                         return m;
202                 }
203         }
204 
205         /* check for wild-card host */
206         for(m = first_manager; m; m = m->next_manager)
207         {
208                 if(!strcmp(m->name,WILD_CARD_HOST_NAME)){
209                         *mngr = m;
210                         return m;
211                 }
212         }
213 
214         return m;
215 }
216 
217 /***********************************************************/
218 
delete_manager_list()219 void delete_manager_list()
220 {
221 	Manager *next;
222 
223 
224 	while(first_manager)
225 	{
226 		next = first_manager->next_manager;
227 
228 		if(first_manager->name)
229 		{
230 			free(first_manager->name);
231 		}
232 
233 		free(first_manager);
234 
235 		first_manager = next;
236 	}
237 
238 	first_manager = NULL;
239 }
240 
manager_list_free(Manager * mngr)241 void manager_list_free(Manager *mngr)
242 {
243 	Manager *next;
244 
245 
246 	while(mngr)
247 	{
248 		next = mngr->next_manager;
249 
250 		if(mngr->name)
251 		{
252 			free(mngr->name);
253 		}
254 
255 		free(mngr);
256 
257 		mngr = next;
258 	}
259 
260 	mngr = NULL;
261 }
262 
sub_member_free(SubMember * mem)263 void sub_member_free(SubMember *mem)
264 {
265   Manager *mngr;
266 
267   if(mem==NULL) return;
268   mem->count--;
269   if(mem->count<0){
270   	mngr = mem->first_manager;
271   	manager_list_free(mngr);
272   	if(mem->community_string != NULL) free(mem->community_string);
273   	free(mem);
274   }
275 }
276 
sub_group_list_free(SubGroup * group)277 void sub_group_list_free(SubGroup *group)
278 {
279 	SubGroup *next;
280 
281 
282 	while(group)
283 	{
284 		next = group->next_sub_group;
285 
286 		if(group->first_sub_member != NULL)
287 		{
288 			sub_member_free(group->first_sub_member);
289 		}
290 
291 		free(group);
292 
293 		group = next;
294 	}
295 
296 }
297 
trap_slot_list_free(TrapSlot * slot)298 void trap_slot_list_free(TrapSlot *slot)
299 {
300 	TrapSlot *next;
301 
302 
303 	while(slot)
304 	{
305 		next = slot->next_trap_slot;
306 		if(slot->first_sub_group != NULL)
307 		{
308 			sub_group_list_free(slot->first_sub_group);
309 		}
310 
311 		free(slot);
312 
313 		slot = next;
314 	}
315 
316 }
317 
318 
delete_efilter_list()319 void delete_efilter_list()
320 {
321 	EFilter *next;
322 
323 
324 	while(first_efilter)
325 	{
326 		next = first_efilter->next_efilter;
327 
328 		if(first_efilter->name)
329 		{
330 			free(first_efilter->name);
331 		}
332 
333 		free(first_efilter);
334 
335 		first_efilter = next;
336 	}
337 
338 	first_efilter = NULL;
339 }
340 
341 /***********************************************************/
342 
trace_managers()343 void trace_managers()
344 {
345 	Manager *m;
346 	AccessServer *as;
347 
348 	trace("MANAGERS:\n");
349 	trace("---------\n");
350 	for(m = first_manager; m; m = m->next_manager)
351 	{
352 		trace("%-30s %-20s\n",
353 			m->name,
354 			!strcmp(m->name,WILD_CARD_HOST_NAME)?
355 			"0":inet_ntoa(m->ip_address)   );
356 		for(as=m->first_acc_server;as;as=as->next_acc_server)
357 			trace_access_server(as);
358 
359 	}
360 	trace("\n");
361 }
362 
363 
364 /***********************************************************/
365 
366 /*
367  *	returns	0 if OK
368  *		1 if error
369  *		-1 if fatal error
370  */
371 
community_add(char * name,int type,char * error_label)372 int community_add(char *name, int type, char *error_label)
373 {
374 	int ret;
375 	Community *new;
376 	Community *c;
377 	Community *last = NULL;
378 
379 
380 	error_label[0] = '\0';
381 
382 	if(name == NULL)
383 	{
384 		(void)sprintf(error_label, "BUG: community_add(): name is NULL");
385 		return -1;
386 	}
387 
388 	if(name[0] == '\0')
389 	{
390 		(void)sprintf(error_label, "BUG: community_add(): name is empty");
391 		return -1;
392 	}
393 
394 	if( (type != READ_ONLY) && (type != READ_WRITE) )
395 	{
396 		(void)sprintf(error_label, "BUG: community_add(): bad type (%d)", type);
397 		return -1;
398 	}
399 
400 	for(c = first_community; c; c = c->next_community)
401 	{
402 		ret = strcmp(name, c->name);
403 		if(ret > 0)
404 		{
405 			break;
406 		}
407 		else
408 		if(ret == 0)
409 		{
410 			(void)sprintf(error_label, ERR_MSG_COMMUNITY_DUP, name);
411 			return 1;
412 		}
413 
414 		last = c;
415 	}
416 
417 	new = (Community *) calloc(1,sizeof(Community));
418 	if(new == NULL)
419 	{
420 		(void)sprintf(error_label, ERR_MSG_ALLOC);
421 		return -1;
422 	}
423 	new->next_community = NULL;
424 	new->name = NULL;
425 
426 	new->name = strdup(name);
427 	if(new->name == NULL)
428 	{
429 		(void)sprintf(error_label, ERR_MSG_ALLOC);
430 		free(new);
431 		return -1;
432 	}
433 
434 	new->type = type;
435 
436 	if(last)
437 	{
438 		last->next_community = new;
439 	}
440 	else
441 	{
442 		first_community = new;
443 	}
444 	new->next_community = c;
445 
446 
447 	return 0;
448 }
449 
get_access_type(Manager * mngr,char * name)450 int get_access_type(Manager *mngr,char *name)
451 {
452   AccessServer *as;
453   AccessPolicy *ap;
454   Community *comm;
455 
456   if(name==NULL || mngr==NULL) return NULL;
457   for(as=mngr->first_acc_server;as;as=as->next_acc_server)
458   {
459     if((ap=as->first_acc_policy)!=NULL)
460 	for(comm=ap->first_community;comm;comm=comm->next_community)
461 		if(comm->name!=NULL && !strcmp(name,comm->name))
462 			return ap->access_type;
463   }
464   return -1;
465 }
466 
467 
468 /***********************************************************/
469 
470 /* returns True or False        */
471 
is_valid_community(char * name,int type,Manager * mngr)472 int is_valid_community(char *name, int type, Manager *mngr)
473 {
474 	int access_type;
475 
476 
477 	if(name == NULL)
478 	{
479 		error("BUG: is_valid_community(): name is NULL");
480 		return False;
481 	}
482 
483 	if( (type != GETNEXT_REQ_MSG )
484 		&& (type != GET_REQ_MSG)
485 		&& (type != SET_REQ_MSG) )
486 	{
487 		error("BUG: is_valid_community(): bad type(0x%x)", type);
488 		return False;
489 	}
490 
491   	if(mngr==NULL)  return True; /* accept reqs from any hosts */
492 
493 	if(mngr->first_acc_server!=NULL){
494 		if( (access_type = get_access_type(mngr,name)) == -1)
495 			return False;
496 	}
497 
498 	if(type != SET_REQ_MSG)
499 	{
500 		return True;
501 	}
502 	else
503 	{
504 		if(access_type == READ_WRITE)
505 		{
506 			return True;
507 		}
508 		else
509 		{
510 			return False;
511 		}
512 	}
513 
514 }
515 
516 
517 /***********************************************************/
518 
delete_community_list()519 void delete_community_list()
520 {
521 	Community *next;
522 
523 
524 	while(first_community)
525 	{
526 		next = first_community->next_community;
527 
528 		if(first_community->name)
529 		{
530 			free(first_community->name);
531 		}
532 
533 		free(first_community);
534 
535 		first_community = next;
536 	}
537 
538 	first_community = NULL;
539 }
540 
541 
542 /***********************************************************/
543 
trace_access_server(AccessServer * as)544 void trace_access_server(AccessServer *as)
545 {
546   AccessPolicy *ap;
547 
548   if(as==NULL) return;
549   if( (ap=as->first_acc_policy)!=NULL )
550 	trace_access_policy(ap);
551 }
552 
trace_access_policy(AccessPolicy * ap)553 void trace_access_policy(AccessPolicy *ap)
554 {
555   Community *c;
556 
557   if(ap==NULL) return;
558   trace("\tCOMMUNITIES(");
559   switch(ap->access_type)
560   {
561 	case READ_ONLY:
562 		trace("%s", "READ_ONLY");
563 		break;
564 	case READ_WRITE:
565 		trace("%s", "READ_WRITE");
566 		break;
567   }
568   trace("): ");
569   for(c=ap->first_community;c;c=c->next_community)
570 	trace_communities(c);
571   trace("\n");
572 }
573 
trace_communities(Community * c)574 void trace_communities(Community *c)
575 {
576 
577 
578 	trace(" %s", c->name);
579 }
580 
581 
582 /***********************************************************/
community_list_free(Community * comm)583 void community_list_free(Community *comm)
584 {
585 	Community *next;
586 
587 
588 	while(comm)
589 	{
590 		next = comm->next_community;
591 
592 		if(comm->name)
593 		{
594 			free(comm->name);
595 		}
596 
597 		free(comm);
598 
599 		comm = next;
600 	}
601 
602 	comm = NULL;
603 }
604 
access_policy_list_delete(AccessPolicy * ap)605 void access_policy_list_delete(AccessPolicy *ap)
606 {
607   if(ap==NULL) return;
608   ap->count--;
609   if(ap->count<=0){
610   	free(ap);
611   }
612 }
613 
access_policy_list_free(AccessPolicy * ap)614 void access_policy_list_free(AccessPolicy *ap)
615 {
616   if(ap==NULL) return;
617   ap->count--;
618   if(ap->count<=0){
619   	community_list_free(ap->first_community);
620   	free(ap);
621   }
622 }
623 
access_server_delete(AccessServer * as)624 void access_server_delete(AccessServer *as)
625 {
626   if(as==NULL) return;
627   access_policy_list_delete(as->first_acc_policy);
628   free(as);
629 }
630 
access_server_free(AccessServer * as)631 void access_server_free(AccessServer *as)
632 {
633   if(as==NULL) return;
634   access_policy_list_free(as->first_acc_policy);
635   free(as);
636 }
637 
agent_manager_list_free(Manager * mgr)638 void agent_manager_list_free(Manager *mgr)
639 {
640 	Manager *nextmgr;
641 	AccessServer *as, *last=NULL;
642 
643 	if (mgr == NULL)
644 		return;
645 
646 	while(mgr)
647 	{
648 		nextmgr = mgr->next_manager;
649 
650 		as = mgr->first_acc_server;
651 		while (as) {
652 			last = as->next_acc_server;
653 			access_server_delete(as);
654 			as = last;
655 		}
656 
657 		if(mgr->name)
658 			free(mgr->name);
659 
660 		free(mgr);
661 
662 		mgr = nextmgr;
663 	}
664 
665 	mgr = NULL;
666 }
667 
access_server_add_tail(Manager * mngr,AccessServer * acc_server)668 void access_server_add_tail(Manager* mngr, AccessServer *acc_server)
669 {
670   AccessServer *as, *last=NULL;
671 
672   if(mngr==NULL || acc_server==NULL) return;
673   for(as=mngr->first_acc_server;as;as=as->next_acc_server)
674 	last = as;
675 
676   if(last==NULL){
677 	mngr->first_acc_server = acc_server;
678   }else{
679 	last->next_acc_server = acc_server;
680   }
681   acc_server->next_acc_server = NULL;
682   acc_server->attached = TRUE;
683 }
684 
community_attach(AccessPolicy * ap,Community * comm)685 void community_attach(AccessPolicy *ap, Community *comm)
686 {
687   if(ap==NULL || comm==NULL) return;
688   if(ap->first_community==NULL)
689 	ap->first_community = comm;
690   else{
691 	comm->next_community = ap->first_community;
692 	ap->first_community = comm;
693   }
694 }
695 
696 
efilter_add(char * name,char * error_label)697 EFilter* efilter_add(char *name, char *error_label)
698 {
699 	EFilter *new;
700 	EFilter *m;
701 
702 
703 	error_label[0] = '\0';
704 
705 
706 	if(name == NULL)
707 	{
708 		(void)sprintf(error_label, "BUG: efilter_add(): name is NULL");
709 		return NULL;
710 	}
711 
712 
713 	for(m = first_efilter; m; m = m->next_efilter)
714 	{
715 		if(!strcmp(m->name,name))
716 		{
717 			return m;
718 		}
719 	}
720 
721 
722 	/* allocate, initialize and link the new efilter */
723 	new = (EFilter *) calloc(1,sizeof(EFilter));
724 	if(new == NULL)
725 	{
726 		(void)sprintf(error_label, ERR_MSG_ALLOC);
727 		return NULL;
728 	}
729 	new->next_efilter = NULL;
730 	new->name = NULL;
731 
732 	new->name = strdup(name);
733 	if(new->name == NULL)
734 	{
735 		(void)sprintf(error_label, ERR_MSG_ALLOC);
736 		free(new);
737 		return NULL;
738 	}
739 
740 	new->enterprise = enterprise_name_to_oid(new->name);
741 
742 	new->next_efilter = first_efilter;
743 	first_efilter = new;
744 
745 	return new;
746 }
747 
trap_slot_add(int num,EFilter * efilter,char * error_label)748 TrapSlot* trap_slot_add(int num,EFilter *efilter,char *error_label)
749 {
750 	TrapSlot *new;
751 	TrapSlot *m;
752 
753 
754 	if(efilter==NULL) return NULL;
755 	if(num < 0)
756 	{
757 		(void)sprintf(error_label, "BUG: trap_slot_add(): name is NULL");
758 		return NULL;
759 	}
760 
761 
762 	for(m = efilter->first_trap_slot; m; m = m->next_trap_slot)
763 	{
764 		if(m->num == num)
765 		{
766 			return m;
767 		}
768 	}
769 
770 
771 	/* allocate, initialize and link the new efilter */
772 	new = (TrapSlot *) calloc(1,sizeof(TrapSlot));
773 	if(new == NULL)
774 	{
775 		(void)sprintf(error_label, ERR_MSG_ALLOC);
776 		return NULL;
777 	}
778 	new->num = num;
779 	new->next_trap_slot = efilter->first_trap_slot;
780 	efilter->first_trap_slot = new;
781 
782 	return new;
783 }
784 
sub_group_add_tail(TrapSlot * slot,SubGroup * group)785 void sub_group_add_tail(TrapSlot *slot, SubGroup *group)
786 {
787   SubGroup *sg, *last =NULL;
788 
789   if(slot==NULL || group==NULL) return;
790   for(sg=slot->first_sub_group;sg;sg=sg->next_sub_group)
791 	last = sg;
792 
793   if(last==NULL){
794 	slot->first_sub_group = group;
795   }else{
796 	last->next_sub_group = group;
797   }
798   group->next_sub_group = NULL;
799 }
800 
mem_filter_join(int low,int high,SubMember * mem,EFilter * filter)801 void mem_filter_join(int low, int high,SubMember *mem,EFilter *filter)
802 {
803   /* find the trap slot in the filter */
804   /* create subgroup, attach submember to subgroup */
805   /* insert subgroup into the trap slot */
806 
807   int idx;
808   TrapSlot *slot;
809   SubGroup *group;
810 
811   if(low<0 || high<0 || filter==NULL || mem==NULL) return;
812   for(idx=low;idx<=high;idx++){
813 	slot = trap_slot_add(idx,filter,error_label);
814 	if(slot==NULL) continue;
815 	group = calloc(1,sizeof(SubGroup));
816 	if(group==NULL){
817 		error("malloc() failed");
818 	}
819         /* The efilter list may contain duplicate entries because
820            the agent ACL file may be read several times. This seems
821            to be necessary to mantain other functionality in the ACL
822            such as specifying managers. The following hack makes sure
823            the trap is sent to each host only by not allowing duplicate
824            members in an efilter.
825         */
826         if (slot->first_sub_group == NULL) {	/* always add initial first_sub_group */
827 		sub_group_add_tail(slot,group);
828 		group->first_sub_member = mem;
829 		mem->count++;
830         }else {                                 /* at least one sub_group exists  */
831                 if (strcmp(slot->first_sub_group->first_sub_member->first_manager->name,
832                            mem->first_manager->name)) {  /* check for duplicate member */
833                                   sub_group_add_tail(slot,group);
834                                   group->first_sub_member = mem;
835                                   mem->count++;
836                 } else    /* don't add duplicate  */
837                       free(group);
838         }
839   }
840 }
841 
trace_hosts(Manager * mngr)842 static void trace_hosts(Manager *mngr)
843 {
844    Manager *m;
845 
846    for(m=mngr;m;m=m->next_manager){
847 	trace("\t\t%s %s\n",
848 			m->name,
849 			inet_ntoa(m->ip_address));
850    }
851 }
852 
trace_sub_member(SubMember * mem)853 static void trace_sub_member(SubMember *mem)
854 {
855   if(mem==NULL) return;
856   if(mem->community_string != NULL)
857   	trace("\tcommunity-string: %s\n",mem->community_string);
858   trace_hosts(mem->first_manager);
859 }
860 
trace_sub_group(SubGroup * group)861 static void trace_sub_group(SubGroup *group)
862 {
863   if(group==NULL) return;
864   trace_sub_member(group->first_sub_member);
865 }
866 
trace_trap_slot(TrapSlot * slot)867 static void trace_trap_slot(TrapSlot *slot)
868 {
869   SubGroup *group;
870 
871   if(slot==NULL) return;
872   trace("\ttrap-num=%d",slot->num);
873   for(group=slot->first_sub_group;group;group=group->next_sub_group)
874   	trace_sub_group(group);
875 }
876 
trace_filter()877 void trace_filter()
878 {
879   EFilter *filter;
880   TrapSlot *slot;
881 
882   trace("#EFILTER:\n");
883   for(filter=first_efilter;filter;filter=filter->next_efilter)
884   {
885 	trace("enterprise=\"%s\"\n",filter->name);
886 	for(slot=filter->first_trap_slot;slot;slot=slot->next_trap_slot)
887 		trace_trap_slot(slot);
888   }
889   trace("\n");
890 }
891 
892 /**** Enterprise related functions *****/
893 
trace_name_oid_pair()894 void trace_name_oid_pair()
895 {
896   NameOidPair *np;
897 
898   trace("NAME_OID_PAIR:\n");
899   for(np=first_name_oid_pair;np;np=np->next)
900         trace("name: %s oid: %s\n",np->name,SSAOidString(np->oid));
901   trace("\n");
902 }
903 
enterprise_name_to_oid(char * name)904 Oid *enterprise_name_to_oid(char *name)
905 {
906   NameOidPair *np;
907 
908   if(name == NULL) return NULL;
909   for(np=first_name_oid_pair;np;np=np->next){
910         if(np->name!=NULL && !strcmp(name,np->name))
911                 return np->oid;
912   }
913   return NULL;
914 }
915 
set_name_and_oid_pair(char * inbuf)916 static NameOidPair* set_name_and_oid_pair(char *inbuf)
917 {
918         char *str;
919         char *name_str, *oid_str;
920         Oid  *oid = NULL;
921 	NameOidPair *np;
922 
923         if ((inbuf== NULL) || (inbuf[0]== '#')) return NULL;
924 
925         /* first "  for name */
926         if ((str = strchr(inbuf, '"')) == NULL) return NULL;
927         str++;
928         name_str = str;
929 
930                 /* second " for name */
931         if ((str = strchr(str, '"')) == NULL) return NULL;
932         *str = '\0';
933 
934         str++;
935         /* first " for oid_str*/
936         if ((str = strchr(str, '"')) == NULL)  return NULL;
937         str++;
938         oid_str = str;
939 
940         /* second " for oid_str*/
941         if ((str = strchr(str, '"')) == NULL) return NULL;
942         *str = '\0';
943         oid = SSAOidStrToOid(oid_str,error_label);
944 
945 	np = calloc(1,sizeof(NameOidPair));
946 	if(np==NULL){
947 	  error("calloc failed");
948 	  return NULL;
949 	}
950 	np->oid = oid;
951 	np->name = strdup(name_str);
952 
953 	if (np->name == NULL) {
954 		free(np);
955 		return(NULL);
956 	}
957 
958 	return np;
959 }
960 
insert_name_oid_pair(char * name_str,char * oid_str)961 static void insert_name_oid_pair(char *name_str,char* oid_str)
962 {
963   char inbuf[MAX_BUF_SIZE];
964   NameOidPair *np;
965 
966    (void)sprintf(inbuf,"\"%s\"   \"%s\"\n",name_str,oid_str);
967    if( (np=set_name_and_oid_pair(inbuf)) != NULL){
968 		np->next = first_name_oid_pair;
969 		first_name_oid_pair = np;
970    }
971 }
972 
load_enterprise_oid(char * filename)973 void load_enterprise_oid(char* filename)
974 {
975   FILE *fd;
976   char inbuf[MAX_BUF_SIZE];
977   NameOidPair *np;
978 
979   if(filename==NULL) return;
980   fd = fopen(filename,"r");
981   if(fd==NULL){
982 	error("can open the file %s",filename);
983 	return;
984   }
985   while(fgets(inbuf,MAX_BUF_SIZE,fd)){
986 	if( (np=set_name_and_oid_pair(inbuf)) != NULL){
987 	/* insert np */
988 		np->next = first_name_oid_pair;
989 		first_name_oid_pair = np;
990 	}
991   }
992   /* insert a couple of extra name-oid pairs:
993 	sun, snmp
994    */
995 	insert_name_oid_pair("snmp", "1.3.6.1.2.1.11");
996 	insert_name_oid_pair("sun", "1.3.6.1.4.1.42.2.1.1");
997 
998   (void)fclose(fd);
999 }
1000 
find_efilter(Oid * oid)1001 static EFilter* find_efilter(Oid* oid)
1002 {
1003   EFilter *filter;
1004 
1005   for(filter=first_efilter;filter;filter=filter->next_efilter)
1006   {
1007 	if(SSAOidCmp(filter->enterprise,oid)==0) return filter;
1008   }
1009   return NULL;
1010 }
1011 
find_trap_slot(int num,EFilter * filter)1012 static TrapSlot* find_trap_slot(int num,EFilter *filter)
1013 {
1014   TrapSlot *slot;
1015 
1016   for(slot=filter->first_trap_slot;slot;slot=slot->next_trap_slot)
1017 	if(slot->num==num) return slot;
1018   return NULL;
1019 }
1020 
trap_filter_action(Oid * oid,int generic,int specific,uint32_t time_stamp,SNMP_variable * variables)1021 void trap_filter_action(Oid *oid,int generic,int specific,
1022         uint32_t time_stamp,SNMP_variable *variables)
1023 {
1024   EFilter *filter;
1025   TrapSlot *slot;
1026   SubGroup *group;
1027   Manager *manager;
1028   static Subid snmp_subids[] = {1,3,6,1,2,1,11};
1029   static Oid snmp_oid = {snmp_subids, 7};
1030   int trap_num;
1031   IPAddress my_ip_address;
1032 
1033   (void)memset(&my_ip_address, 0, sizeof(IPAddress));
1034 
1035   if(oid==NULL) return;
1036   if( (filter=find_efilter(oid))==NULL ) return;
1037   if(SSAOidCmp(oid,&snmp_oid)==0)
1038 	trap_num = generic;
1039   else
1040 	trap_num = specific;
1041   if( (slot=find_trap_slot(trap_num,filter))==NULL ) return;
1042   for(group=slot->first_sub_group;group;group=group->next_sub_group){
1043 	if(group->first_sub_member!=NULL){
1044 	  for(manager=group->first_sub_member->first_manager;manager;
1045 		manager=manager->next_manager){
1046 		trap_send_raw(&(manager->ip_address),my_ip_address,
1047 			group->first_sub_member->community_string,0,
1048 			oid,generic,specific, SNMP_TRAP_PORT,time_stamp,
1049 			variables,error_label);
1050 	  }
1051 	}
1052   }
1053 }
1054 
1055