snmp_config.c

Go to the documentation of this file.
00001 /*
00002  * Copyright 1998-2007 by egnite Software GmbH
00003  * Copyright 1988, 1989, 1991, 1992 by Carnegie Mellon University
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  *
00009  * 1. Redistributions of source code must retain the above copyright
00010  *    notice, this list of conditions and the following disclaimer.
00011  * 2. Redistributions in binary form must reproduce the above copyright
00012  *    notice, this list of conditions and the following disclaimer in the
00013  *    documentation and/or other materials provided with the distribution.
00014  * 3. Neither the name of the copyright holders nor the names of
00015  *    contributors may be used to endorse or promote products derived
00016  *    from this software without specific prior written permission.
00017  *
00018  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00019  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00020  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00021  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00022  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00023  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00024  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
00025  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
00026  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
00027  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
00028  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00029  * SUCH DAMAGE.
00030  *
00031  * For additional information see http://www.ethernut.de/
00032  */
00033 
00034 #include <sys/types.h>
00035 
00036 #include <stdlib.h>
00037 #include <string.h>
00038 #include <memdebug.h>
00039 
00040 #include <pro/snmp_config.h>
00041 
00042 static VIEW_LIST *views;
00043 static COMMUNITY_LIST *communities;
00044 
00051 int SnmpViewCreate(CONST char *name, CONST OID * subtree, size_t subtreelen, int type)
00052 {
00053     static int nextview = 1;
00054     VIEW_LIST *vp;
00055     VIEW_LIST *nvp;
00056     VIEW_LIST *prev = NULL;
00057     size_t i;
00058 
00059     /* Check name length. */
00060     if (strlen(name) > (sizeof(vp->view_name) - 1)) {
00061         return -1;
00062     }
00063 
00064     /* Check if this name exists already. */
00065     for (vp = views; vp; prev = vp, vp = vp->next) {
00066         if (strcmp(name, vp->view_name) == 0) {
00067             break;
00068         }
00069     }
00070 
00071     /* Allocate a new view entry. */
00072     nvp = malloc(sizeof(VIEW_LIST));
00073     memset(nvp, 0, sizeof(VIEW_LIST));
00074     strcpy(nvp->view_name, name);
00075     nvp->view_type = type;
00076     nvp->view_subtree_len = subtreelen;
00077     for (i = 0; i < subtreelen; i++) {
00078         nvp->view_subtree[i] = subtree[i];
00079     }
00080     /* Set index, either of the existing entry or a new one. */
00081     nvp->view_index = vp ? vp->view_index : nextview++;
00082 
00083     /* Add the new entry to the linked list. */
00084     if (views) {
00085         for (; vp; prev = vp, vp = vp->next);
00086         prev->next = nvp;
00087     } else {
00088         views = nvp;
00089     }
00090     return nvp->view_index;
00091 }
00092 
00093 int SnmpViewFind(char *name)
00094 {
00095     VIEW_LIST *vp;
00096 
00097     if (strcmp(name, "-") == 0) {
00098         return 0;
00099     }
00100     for (vp = views; vp; vp = vp->next) {
00101         if (strcmp(vp->view_name, name) == 0) {
00102             return vp->view_index;
00103         }
00104     }
00105     return -1;
00106 }
00107 
00119 int SnmpCommunityFind(CONST char *name, int *readView, int *writeView)
00120 {
00121     COMMUNITY_LIST *cp;
00122 
00123     for (cp = communities; cp; cp = cp->next) {
00124         if (strcmp(cp->comm_name, name) == 0) {
00125             if (readView) {
00126                 *readView = cp->comm_read_view;
00127             }
00128             if (writeView) {
00129                 *writeView = cp->comm_write_view;
00130             }
00131             return 0;
00132         }
00133     }
00134     return -1;
00135 }
00136 
00148 int SnmpCommunityCreate(CONST char *name, int readView, int writeView)
00149 {
00150     COMMUNITY_LIST *cp;
00151     COMMUNITY_LIST *prev = 0;
00152 
00153     if (strlen(name) > (sizeof(cp->comm_name) - 1)) {
00154         return -1;
00155     }
00156     for (cp = communities; cp; cp = cp->next) {
00157         if (strcmp(name, cp->comm_name) == 0) {
00158             return 0;
00159         }
00160         prev = cp;
00161     }
00162 
00163     cp = malloc(sizeof(COMMUNITY_LIST));
00164     memset(cp, 0, sizeof(COMMUNITY_LIST));
00165     strcpy(cp->comm_name, name);
00166     cp->comm_read_view = readView;
00167     cp->comm_write_view = writeView;
00168     if (prev) {
00169         prev->next = cp;
00170     } else {
00171         communities = cp;
00172     }
00173     return 0;
00174 }

© 2000-2007 by egnite Software GmbH - visit http://www.ethernut.de/