diff packages/net/snmp/lib/current/src/default_store.c @ 103:95f3e12a6327 ecos-sw-2000-06-23

Merge from eCos master repository on 2000-06-23-16:41:10-BST
author jlarmour
date Fri, 23 Jun 2000 17:06:31 +0000
parents
children e0c0827131d1
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/net/snmp/lib/current/src/default_store.c
@@ -0,0 +1,355 @@
+//==========================================================================
+//
+//      ./lib/current/src/default_store.c
+//
+//
+//==========================================================================
+//####COPYRIGHTBEGIN####
+//                                                                          
+// -------------------------------------------                              
+// The contents of this file are subject to the Red Hat eCos Public License 
+// Version 1.1 (the "License"); you may not use this file except in         
+// compliance with the License.  You may obtain a copy of the License at    
+// http://www.redhat.com/                                                   
+//                                                                          
+// Software distributed under the License is distributed on an "AS IS"      
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the 
+// License for the specific language governing rights and limitations under 
+// the License.                                                             
+//                                                                          
+// The Original Code is eCos - Embedded Configurable Operating System,      
+// released September 30, 1998.                                             
+//                                                                          
+// The Initial Developer of the Original Code is Red Hat.                   
+// Portions created by Red Hat are                                          
+// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.                             
+// All Rights Reserved.                                                     
+// -------------------------------------------                              
+//                                                                          
+//####COPYRIGHTEND####
+//####UCDSNMPCOPYRIGHTBEGIN####
+//
+// -------------------------------------------
+//
+// Portions of this software may have been derived from the UCD-SNMP
+// project,  <http://ucd-snmp.ucdavis.edu/>  from the University of
+// California at Davis, which was originally based on the Carnegie Mellon
+// University SNMP implementation.  Portions of this software are therefore
+// covered by the appropriate copyright disclaimers included herein.
+//
+// The release used was version 4.1.2 of May 2000.  "ucd-snmp-4.1.2"
+// -------------------------------------------
+//
+//####UCDSNMPCOPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    hmt
+// Contributors: hmt
+// Date:         2000-05-30
+// Purpose:      Port of UCD-SNMP distribution to eCos.
+// Description:  
+//              
+//
+//####DESCRIPTIONEND####
+//
+//==========================================================================
+/********************************************************************
+       Copyright 1989, 1991, 1992 by Carnegie Mellon University
+
+			  Derivative Work -
+Copyright 1996, 1998, 1999, 2000 The Regents of the University of California
+
+			 All Rights Reserved
+
+Permission to use, copy, modify and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appears in all copies and
+that both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of CMU and The Regents of
+the University of California not be used in advertising or publicity
+pertaining to distribution of the software without specific written
+permission.
+
+CMU AND THE REGENTS OF THE UNIVERSITY OF CALIFORNIA DISCLAIM ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL CMU OR
+THE REGENTS OF THE UNIVERSITY OF CALIFORNIA BE LIABLE FOR ANY SPECIAL,
+INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+FROM THE LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*********************************************************************/
+/* default_store.h: storage space for defaults */
+
+#include <config.h>
+#include <sys/types.h>
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#if HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#if HAVE_STRING_H
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+#if HAVE_WINSOCK_H
+#include <winsock.h>
+#endif
+
+#if HAVE_DMALLOC_H
+#include <dmalloc.h>
+#endif
+
+#include "asn1.h"
+#include "snmp_api.h"
+#include "snmp_debug.h"
+#include "snmp_logging.h"
+#include "tools.h"
+#include "read_config.h"
+#include "default_store.h"
+#include "read_config.h"
+#include "system.h"
+
+struct ds_read_config *ds_configs = NULL;
+
+int ds_integers[DS_MAX_IDS][DS_MAX_SUBIDS];
+char ds_booleans[DS_MAX_IDS][DS_MAX_SUBIDS/8];  /* bit vector storage. */
+char *ds_strings[DS_MAX_IDS][DS_MAX_SUBIDS];  /* bit vector storage. */
+
+int
+ds_set_boolean(int storeid, int which, int value) {
+
+  if (storeid >= DS_MAX_IDS || which >= DS_MAX_SUBIDS ||
+      storeid < 0 || which < 0)
+    return SNMPERR_GENERR;
+    
+  DEBUGMSGTL(("ds_set_boolean","Setting %d:%d = %d/%s\n", storeid, which,
+              value, ((value)?"True":"False")));
+
+  if (value > 0)
+    ds_booleans[storeid][which/8] |= (1 << (which%8));
+  else
+    ds_booleans[storeid][which/8] &= (0xff7f >> (7-(which%8)));
+
+  return SNMPERR_SUCCESS;
+}
+
+int
+ds_toggle_boolean(int storeid, int which) {
+
+  if (storeid >= DS_MAX_IDS || which >= DS_MAX_SUBIDS ||
+      storeid < 0 || which < 0)
+    return SNMPERR_GENERR;
+    
+  if ((ds_booleans[storeid][which/8] & (1 << (which % 8))) == 0)
+    ds_booleans[storeid][which/8] |= (1 << (which%8));
+  else
+    ds_booleans[storeid][which/8] &= (0xff7f >> (7-(which%8)));
+
+  DEBUGMSGTL(("ds_toggle_boolean","Setting %d:%d = %d/%s\n", storeid, which,
+              ds_booleans[storeid][which/8],
+              ((ds_booleans[storeid][which/8])?"True":"False")));
+
+  return SNMPERR_SUCCESS;
+}
+
+int
+ds_get_boolean(int storeid, int which) {
+  if (storeid >= DS_MAX_IDS || which >= DS_MAX_SUBIDS ||
+      storeid < 0 || which < 0)
+    return SNMPERR_GENERR;
+
+  return ((ds_booleans[storeid][which/8] & (1 << (which%8))) ? 1 : 0);
+}
+
+int
+ds_set_int(int storeid, int which, int value) {
+  if (storeid >= DS_MAX_IDS || which >= DS_MAX_SUBIDS ||
+      storeid < 0 || which < 0)
+    return SNMPERR_GENERR;
+
+  DEBUGMSGTL(("ds_set_int","Setting %d:%d = %d\n", storeid, which, value));
+
+  ds_integers[storeid][which] = value;
+  return SNMPERR_SUCCESS;
+}
+
+int
+ds_get_int(int storeid, int which) {
+  if (storeid >= DS_MAX_IDS || which >= DS_MAX_SUBIDS ||
+      storeid < 0 || which < 0)
+    return SNMPERR_GENERR;
+
+  return (ds_integers[storeid][which]);
+}
+
+int
+ds_set_string(int storeid, int which, const char *value) {
+
+  if (storeid >= DS_MAX_IDS || which >= DS_MAX_SUBIDS ||
+      storeid < 0 || which < 0)
+    return SNMPERR_GENERR;
+    
+  DEBUGMSGTL(("ds_set_string","Setting %d:%d = %s\n", storeid, which,
+              value));
+
+  if (ds_strings[storeid][which] != NULL)
+    free(ds_strings[storeid][which]);
+
+  if (value)
+    ds_strings[storeid][which] = strdup(value);
+  else 
+    ds_strings[storeid][which] = NULL;
+  
+  return SNMPERR_SUCCESS;
+}
+
+char *
+ds_get_string(int storeid, int which) {
+  if (storeid >= DS_MAX_IDS || which >= DS_MAX_SUBIDS ||
+      storeid < 0 || which < 0)
+    return NULL;
+
+  return (ds_strings[storeid][which]);
+}
+
+void
+ds_handle_config(const char *token, char *line) {
+  struct ds_read_config *drsp;
+  char buf[SNMP_MAXBUF];
+  int itmp;
+
+  DEBUGMSGTL(("ds_handle_config", "handling %s\n", token));
+  for(drsp = ds_configs; drsp != NULL && strcasecmp(token, drsp->token) != 0;
+      drsp = drsp->next);
+  if (drsp != NULL) {
+    DEBUGMSGTL(("ds_handle_config",
+                "setting: token=%s, type=%d, id=%d, which=%d\n",
+                drsp->token, drsp->type, drsp->storeid, drsp->which));
+    switch (drsp->type) {
+      case ASN_BOOLEAN:
+        if (strncasecmp(line,"yes",3) == 0 || strncasecmp(line,"true",4) == 0) {
+          itmp = 1;
+        } else if (strncasecmp(line,"no",3) == 0 ||
+                strncasecmp(line,"false",5) == 0) {
+          itmp = 0;
+        } else if (atoi(line) > 0) {
+          itmp = 1;
+        } else {
+          itmp = 0;
+        }
+        ds_set_boolean(drsp->storeid, drsp->which, itmp);
+        DEBUGMSGTL(("ds_handle_config", "bool: %d\n", itmp));
+        break;
+
+      case ASN_INTEGER:
+        ds_set_int(drsp->storeid, drsp->which, atoi(line));
+        DEBUGMSGTL(("ds_handle_config", "int: %d\n", atoi(line)));
+        break;
+
+      case ASN_OCTET_STR:
+        if (*line == '"') {
+            copy_word(line, buf);
+            ds_set_string(drsp->storeid, drsp->which, buf);
+        } else {
+            ds_set_string(drsp->storeid, drsp->which, line);
+        }
+        DEBUGMSGTL(("ds_handle_config", "string: %s\n", line));
+        break;
+
+      default:
+        snmp_log(LOG_CRIT,"ds_handle_config *** unknown type %d\n", drsp->type);
+        break;
+    }
+  } else {
+    snmp_log(LOG_CRIT, "ds_handle_config *** no registration for %s\n", token);
+  }
+}
+
+
+int
+ds_register_config(u_char type, const char *ftype, const char *token,
+                   int storeid, int which) {
+  struct ds_read_config *drsp;
+
+  if (storeid >= DS_MAX_IDS || which >= DS_MAX_SUBIDS ||
+      storeid < 0 || which < 0 || token == NULL)
+    return SNMPERR_GENERR;
+
+  if (ds_configs == NULL) {
+    ds_configs = SNMP_MALLOC_STRUCT(ds_read_config);
+    drsp = ds_configs;
+  } else {
+    for(drsp = ds_configs; drsp->next != NULL; drsp = drsp->next);
+    drsp->next = SNMP_MALLOC_STRUCT(ds_read_config);
+    drsp = drsp->next;
+  }
+
+  drsp->type = type;
+  drsp->token = strdup(token);
+  drsp->storeid = storeid;
+  drsp->which = which;
+
+  switch (type) {
+    case ASN_BOOLEAN:
+      register_config_handler(ftype, token, ds_handle_config, NULL,"(1|yes|true|0|no|false)");
+      break;
+
+    case ASN_INTEGER:
+      register_config_handler(ftype, token, ds_handle_config, NULL,"integerValue");
+      break;
+
+    case ASN_OCTET_STR:
+      register_config_handler(ftype, token, ds_handle_config, NULL,"string");
+      break;
+    
+  }
+  return SNMPERR_SUCCESS;
+}
+
+int
+ds_register_premib(u_char type, const char *ftype, const char *token,
+                   int storeid, int which) {
+  struct ds_read_config *drsp;
+
+  if (storeid >= DS_MAX_IDS || which >= DS_MAX_SUBIDS ||
+      storeid < 0 || which < 0 || token == NULL)
+    return SNMPERR_GENERR;
+
+  if (ds_configs == NULL) {
+    ds_configs = SNMP_MALLOC_STRUCT(ds_read_config);
+    drsp = ds_configs;
+  } else {
+    for(drsp = ds_configs; drsp->next != NULL; drsp = drsp->next);
+    drsp->next = SNMP_MALLOC_STRUCT(ds_read_config);
+    drsp = drsp->next;
+  }
+
+  drsp->type = type;
+  drsp->token = strdup(token);
+  drsp->storeid = storeid;
+  drsp->which = which;
+
+  switch (type) {
+    case ASN_BOOLEAN:
+      register_premib_handler(ftype, token, ds_handle_config, NULL,"(1|yes|true|0|no|false)");
+      break;
+
+    case ASN_INTEGER:
+      register_premib_handler(ftype, token, ds_handle_config, NULL,"integerValue");
+      break;
+
+    case ASN_OCTET_STR:
+      register_premib_handler(ftype, token, ds_handle_config, NULL,"string");
+      break;
+    
+  }
+  return SNMPERR_SUCCESS;
+}
+