Mercurial > flash_v2
diff packages/net/snmp/agent/current/src/kernel.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/agent/current/src/kernel.c @@ -0,0 +1,279 @@ +//========================================================================== +// +// ./agent/current/src/kernel.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. +*********************************************************************/ + +/* + * 13 Jun 91 wsak (wk0x@andrew) added mips support + */ + +#include <config.h> + +#ifdef CAN_USE_NLIST + +#include <sys/types.h> +#if HAVE_UNISTD_H +#include <unistd.h> +#endif +#include <stdio.h> +#include <errno.h> +#if HAVE_STRING_H +#include <string.h> +#endif +#if HAVE_FCNTL_H +#include <fcntl.h> +#endif +#if HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif +#if HAVE_KVM_H +#include <kvm.h> +#endif + +#include "asn1.h" +#include "snmp_api.h" +#include "snmp_impl.h" +#include "snmp_logging.h" +#include "default_store.h" + +#include "kernel.h" +#include "ds_agent.h" + +#ifndef NULL +#define NULL 0 +#endif + + +#if HAVE_KVM_H +kvm_t *kd; + +void +init_kmem(const char *file) +{ +#if HAVE_KVM_OPENFILES + char err[4096]; + kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, err); + if (kd == NULL && !ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS)) { + snmp_log(LOG_CRIT, "init_kmem: kvm_openfiles failed: %s\n", err); + exit(1); + } +#else + kd = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL); + if (!kd && !ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS)) { + snmp_log(LOG_CRIT, "init_kmem: kvm_open failed: %s\n", strerror(errno)); + exit(1); + } +#endif /* HAVE_KVM_OPENFILES */ +} + + +/* + * klookup: + * + * It seeks to the location off in kmem + * It does a read into target of siz bytes. + * + * Return 0 on failure and 1 on sucess. + * + */ + + +int +klookup(unsigned long off, + char *target, + int siz) +{ + int result; + if (kd == NULL) return 0; + result = kvm_read(kd, off, target, siz); + if (result != siz) { +#if HAVE_KVM_OPENFILES + snmp_log(LOG_ERR,"kvm_read(*, %lx, %p, %d) = %d: %s\n", off, target, siz, + result, kvm_geterr(kd)); +#else + snmp_log(LOG_ERR,"kvm_read(*, %lx, %p, %d) = %d: ", off, target, siz, + result); + snmp_log_perror("klookup"); +#endif + return 0; + } + return 1; +} + +#else /* HAVE_KVM_H */ + +static off_t klseek (off_t); +static int klread (char *, int); +int swap, mem, kmem; + +void +init_kmem(const char *file) +{ + kmem = open(file, O_RDONLY); + if (kmem < 0 && !ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS)){ + snmp_log_perror(file); + exit(1); + } + fcntl(kmem,F_SETFD,1); + mem = open("/dev/mem",O_RDONLY); + if (mem < 0 && !ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS)){ + snmp_log_perror("/dev/mem"); + exit(1); + } + fcntl(mem,F_SETFD,1); +#ifdef DMEM_LOC + swap = open(DMEM_LOC,O_RDONLY); + if (swap < 0 && !ds_get_boolean(DS_APPLICATION_ID, DS_AGENT_NO_ROOT_ACCESS)){ + snmp_log_perror(DMEM_LOC); + exit(1); + } + fcntl(swap,F_SETFD,1); +#endif +} + + +/* + * Seek into the kernel for a value. + */ +static off_t +klseek(off_t base) +{ + return (lseek(kmem, (off_t)base, SEEK_SET)); +} + + +/* + * Read from the kernel + */ +static int +klread(char *buf, + int buflen) +{ + return (read(kmem, buf, buflen)); +} + + +/* + * klookup: + * + * It seeks to the location off in kmem + * It does a read into target of siz bytes. + * + * Return 0 on failure and 1 on sucess. + * + */ + + +int +klookup(unsigned long off, + char *target, + int siz) +{ + long retsiz; + + if (kmem < 0) return 0; + + if ((retsiz = klseek((off_t) off)) != off) { + snmp_log(LOG_ERR, "klookup(%lx, %p, %d): ", off, target, siz); + snmp_log_perror("klseek"); +#ifdef EXIT_ON_BAD_KLREAD + exit(1); +#endif + return (0); + } + if ((retsiz = klread(target, siz)) != siz ) { + if (snmp_get_do_debugging()) { + /* these happen too often on too many architectures to print them + unless we're in debugging mode. People get very full log files. */ + snmp_log(LOG_ERR, "klookup(%lx, %p, %d): ", off, target, siz); + snmp_log_perror("klread"); + } +#ifdef EXIT_ON_BAD_KLREAD + exit(1); +#endif + return(0); + } + return (1); +} + +#endif /* HAVE_KVM_H */ + +#endif /* CAN_USE_NLIST */
