/* WARNING: This file was generated by dkct. Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: prmonsnmp.ctr */ /* Copyright (C) 2016-2017, Dirk Krause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above opyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @file prmonsnmp.c The prmonsnmp module. */ #line 10 "prmonsnmp.ctr" #include "dk4conf.h" #include "dk4types.h" #if DK4_HAVE_STDLIB_H #ifndef STDLIB_H_INCLUDED #include #define STDLIB_H_INCLUDED 1 #endif #endif #if DK4_HAVE_UNISTD_H #ifndef UNISTD_H_INCLUDED #include #define UNISTD_H_INCLUDED 1 #endif #endif #if DK4_HAVE_PROCESS_H #ifndef PROCESS_H_INCLUDED #include #define PROCESS_H_INCLUDED 1 #endif #endif /** Constant text fragments used by the program, not localized. */ static const char * const prmonsnmp_kw[] = { /* 0 */ "\n", /* 1 */ " ", /* 2 */ "prmonsnmp", /* 3 */ "public", /* 4 */ "unreachable", /* 5 */ "unknown", /* 6 */ "running", /* 7 */ "warning", /* 8 */ "testing", /* 9 */ "down", /* 10 */ "unreachable", /* 11 */ "other", /* 12 */ "unknown", /* 13 */ "idle", /* 14 */ "printing", /* 15 */ "warmup", /* 16 */ "XXXX-XXXX-XXXX-XXXX", /* 17 */ " / ", /* 18 */ " ", /* 19 */ "W: Low paper.\n", /* 20 */ "E: No paper!\n", /* 21 */ "W: Low toner.\n", /* 22 */ "E: No toner!\n", /* 23 */ "E: Door open!\n", /* 24 */ "E: Jammed!\n", /* 25 */ "E: Offline!\n", /* 26 */ "W: Service requested.\n", /* 27 */ "E: Input tray missing!\n", /* 28 */ "E: Output tray missing!\n", /* 29 */ "E: Marker supply missing!\n", /* 30 */ "W: Output near full.\n", /* 31 */ "E: Output full!\n", /* 32 */ "W: Input tray empty.\n", /* 33 */ "W: Overdue preventive maintenance.\n", /* 34 */ "# ", /* 35 */ "UNREACHABLE!\n", /* 36 */ ": ERROR: Failed to create SNMP request PDU!\n", /* 37 */ ": Warning: SNMP version configured multiple times!\n", /* 38 */ ": ERROR: Illegal SNMP version: \"", /* 39 */ "\"!\n", /* 40 */ ": Warning: SNMP community configured multiple times!\n", /* 41 */ ": Warning: Host name configured multiple times!\n", /* 42 */ ": ERROR: Missing host name!\n", /* 43 */ ": ERROR: Failed to open SNMP session!\n", /* 44 */ ": ERROR: Failed to restore signal handlers!\n", /* 45 */ ": ERROR: Failed to set up signal handlers!\n", NULL #line 152 "prmonsnmp.ctr" }; #if DK4_HAVE_LIBNETSNMP && ((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) #include #include #include #include #include "dk4mem.h" #include "dk4str8.h" #include "dk4mai8dus.h" #include "dk4time.h" #include "dk4time08.h" #include "dk4sock.h" #include "dk4maasz.h" #include "dk4mai8dii.h" #include "dk4mai8ddu.h" #include "dk4mao8d.h" #include "dk4mao8h.h" #include "dk4enc.h" #include "dk4loc.h" #include "dk4vers.h" #line 181 "prmonsnmp.ctr" /** Status text from SNMP response. */ static char statext[1024]; /** Previous status text. */ static char ostatext[sizeof(statext)]; /** Long option names. */ static const char * const long_options[] = { /* 0 */ "help", /* 1 */ "version", /* 2 */ "license", NULL #line 204 "prmonsnmp.ctr" }; /** OID for device status. */ static const oid prmonsnmp_oid_ds[] = { (oid)1, (oid)3, (oid)6, (oid)1, (oid)2, (oid)1, (oid)25, (oid)3, (oid)2, (oid)1, (oid)5, (oid)1 }; /** Size of device status OID (number of elements). */ static size_t const pjsnmp_sz_oid_ds = sizeof(prmonsnmp_oid_ds)/sizeof(oid); /** Size of device status OID (number of bytes). */ static size_t const pjsnmp_bytes_oid_ds = sizeof(prmonsnmp_oid_ds); /** OID for printer status. */ static const oid prmonsnmp_oid_ps[] = { (oid)1, (oid)3, (oid)6, (oid)1, (oid)2, (oid)1, (oid)25, (oid)3, (oid)5, (oid)1, (oid)1, (oid)1 }; /** Size of printer status OID (number of elements). */ static size_t const pjsnmp_sz_oid_ps = sizeof(prmonsnmp_oid_ps)/sizeof(oid); /** Size of printer status OID (number of bytes). */ static size_t const pjsnmp_bytes_oid_ps = sizeof(prmonsnmp_oid_ps); /** OID for pagecount value. */ static const oid prmonsnmp_oid_pc[] = { (oid)1, (oid)3, (oid)6, (oid)1, (oid)2, (oid)1, (oid)43, (oid)10, (oid)2, (oid)1, (oid)4, (oid)1, (oid)1 }; /** Size of page counter OID (number of elements). */ static size_t const pjsnmp_sz_oid_pc = sizeof(prmonsnmp_oid_pc)/sizeof(oid); /** Size of page counter OID (number of bytes). */ static size_t const pjsnmp_bytes_oid_pc = sizeof(prmonsnmp_oid_pc); /** Printer error OID. */ static const oid prmonsnmp_oid_pe[] = { (oid)1, (oid)3, (oid)6, (oid)1, (oid)2, (oid)1, (oid)25, (oid)3, (oid)5, (oid)1, (oid)2, (oid)1 }; /** Size of printer error OID (number of elements). */ static size_t const pjsnmp_sz_oid_pe = sizeof(prmonsnmp_oid_pe)/sizeof(oid); /** Size of printer error OID (number of bytes). */ static size_t const pjsnmp_bytes_oid_pe = sizeof(prmonsnmp_oid_pe); /** Status text OID. */ static const oid prmonsnmp_oid_st[] = { (oid)1, (oid)3, (oid)6, (oid)1, (oid)2, (oid)1, (oid)43, (oid)16, (oid)5, (oid)1, (oid)2, (oid)1, (oid)1 }; /** Size of printer error OID (number of elements). */ static size_t const pjsnmp_sz_oid_st = sizeof(prmonsnmp_oid_st)/sizeof(oid); /** Size of printer error OID (number of bytes). */ static size_t const pjsnmp_bytes_oid_st = sizeof(prmonsnmp_oid_st); /** Help text. */ static const char * const help_text[] = { "", "Monitor printers", "", "prmonsnmp [-v version] [-c community] [-t seconds] [-n] host", "", "Options:", "-v version\t\tSNMP version: 1, 2c, 2 (same as 2c), 3, default: 1.", "-c community\t\tSNMP community name, default: public.", "-t seconds\t\tDuration for monitoring, default: 0 (endless).", "-n\t\t\tNo 250 ms grace period between requests.", "", "--help\t\t\tShow this help text.", "--version\t\tShow version number.", "--license\t\tShow license information.", "", NULL #line 308 "prmonsnmp.ctr" }; /** License conditions text. */ static const char * const license_text[] = { "", "This software uses code from the following projects, either directly or as", "a library:", "", "dktools\t\tDirk Krause's tools and libraries.", "\t\tSee http://dktools.sourceforge.net/ for more information.", #if DK4_HAVE_LIBNETSNMP "Net-SNMP\tSNMP access library.", "\t\tSee http://net-snmp.sourceforge.net/ for more information.", #endif #if DK4_HAVE_ZLIB_H "", "zlib\t\tData compression library.", "\t\tSee http://www.zlib.net/ for more information.", #endif #if DK4_HAVE_OPENSSL_MD5_H && DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_OPENSSL_RIPEMD_H "", "OpenSSL\t\tCryptographic toolkit, used to build file checksums here.", "\t\tSee http://www.openssl.org/ for more information.", "", "This product includes software developed by the OpenSSL Project for use in", "the OpenSSL Toolkit (http://www.openssl.org/).", "This product includes cryptographic software written by", "Eric Young (eay@cryptsoft.com).", "This product includes software written by Tim Hudson (tjh@cryptsoft.com).", #endif "", "All the licenses below apply to the program.", "Licenses for used libraries are shown as found on my Scientific Linux 6.x", "computer in the /usr/share/doc directory on 2015-04-01. Check the project", "homepages of the used libraries for additional information and/or updated", "license terms.", "", "", "DK tools and libraries license", "==============================", "Copyright (c) 2015-2016, Dirk Krause", "All rights reserved.", "", "Redistribution and use in source and binary forms, with or without", "modification, are permitted provided that the following conditions are met:", "", "* Redistributions of source code must retain the above copyright notice,", " this list of conditions and the following disclaimer.", "* Redistributions in binary form must reproduce the above copyright", " notice, this list of conditions and the following disclaimer in the", " documentation and/or other materials provided with the distribution.", "* Neither the name of the Dirk Krause nor the names of contributors may be", " used to endorse or promote products derived from this software without", " specific prior written permission.", "", "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"", "AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE", "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE", "ARE DISCLAIMED.", "", "IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,", "INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,", "BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,", "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY", "OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING", "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,", "EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.", #if DK4_HAVE_LIBNETSNMP "", "", "Net-SNMP license", "================", "Various copyrights apply to this package, listed in various separate parts", "below. Please make sure that you read all the parts. Up until 2001,", "the project was based at UC Davis, and the first part covers all code", "written during this time. From 2001 onwards, the project has been", "based at SourceForge, and Networks Associates Technology, Inc hold the", "copyright on behalf of the wider Net-SNMP community, covering all", "derivative work done since then. An additional copyright section has", "been added as Part 3 below also under a BSD license for the work", "contributed by Cambridge Broadband Ltd. to the project since 2001.", "An additional copyright section has been added as Part 4 below also", "under a BSD license for the work contributed by Sun Microsystems, Inc.", "to the project since 2003.", "", "Code has been contributed to this project by many people over", "the years it has been in development, and a full list of contributors", "can be found in the README file under the THANKS section.", "", "", "---- Part 1: CMU/UCD copyright notice: (BSD like) -----", "", "", " Copyright 1989, 1991, 1992 by Carnegie Mellon University", "", "\t\t Derivative Work - 1996, 1998-2000", "Copyright 1996, 1998-2000 The Regents of the University of California", "", "\t\t\t 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.", "", "", "---- Part 2: Networks Associates Technology, Inc copyright notice (BSD) -----", "", "Copyright (c) 2001-2003, Networks Associates Technology, Inc", "All rights reserved.", " ", "Redistribution and use in source and binary forms, with or without", "modification, are permitted provided that the following conditions are met:", " ", "* Redistributions of source code must retain the above copyright notice,", " this list of conditions and the following disclaimer.", " ", "* Redistributions in binary form must reproduce the above copyright", " notice, this list of conditions and the following disclaimer in the", " documentation and/or other materials provided with the distribution.", " ", "* Neither the name of the Networks Associates Technology, Inc nor the", " names of its contributors may be used to endorse or promote", " products derived from this software without specific prior written", " permission.", " ", "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS", "IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,", "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", "PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR", "CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,", "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,", "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;", "OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,", "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR", "OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF", "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.", "", "---- Part 3: Cambridge Broadband Ltd. copyright notice (BSD) -----", "", "Portions of this code are copyright (c) 2001-2003, Cambridge Broadband Ltd.", "All rights reserved.", " ", "Redistribution and use in source and binary forms, with or without", "modification, are permitted provided that the following conditions are met:", " ", "* Redistributions of source code must retain the above copyright notice,", " this list of conditions and the following disclaimer.", " ", "* Redistributions in binary form must reproduce the above copyright", " notice, this list of conditions and the following disclaimer in the", " documentation and/or other materials provided with the distribution.", " ", "* The name of Cambridge Broadband Ltd. may not be used to endorse or", " promote products derived from this software without specific prior", " written permission.", " ", "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY", "EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE", "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", "PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE", "LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR", "CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF", "SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR", "BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,", "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE", "OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN", "IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.", "", "", "---- Part 4: Sun Microsystems, Inc. copyright notice (BSD) -----", "", "Copyright © 2003 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, ", "California 95054, U.S.A. All rights reserved.", "", "Use is subject to license terms below.", "", "This distribution may include materials developed by third parties.", "", "Sun, Sun Microsystems, the Sun logo and Solaris are trademarks or registered ", "trademarks of Sun Microsystems, Inc. in the U.S. and other countries.", "", "Redistribution and use in source and binary forms, with or without", "modification, are permitted provided that the following conditions are met:", "", "* Redistributions of source code must retain the above copyright notice,", " this list of conditions and the following disclaimer.", "", "* Redistributions in binary form must reproduce the above copyright", " notice, this list of conditions and the following disclaimer in the", " documentation and/or other materials provided with the distribution.", "", "* Neither the name of the Sun Microsystems, Inc. nor the", " names of its contributors may be used to endorse or promote", " products derived from this software without specific prior written", " permission.", "", "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS", "IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,", "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", "PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR", "CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,", "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,", "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;", "OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,", "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR", "OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF", "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.", "", "---- Part 5: Sparta, Inc copyright notice (BSD) -----", "", "Copyright (c) 2003-2006, Sparta, Inc", "All rights reserved.", " ", "Redistribution and use in source and binary forms, with or without", "modification, are permitted provided that the following conditions are met:", " ", "* Redistributions of source code must retain the above copyright notice,", " this list of conditions and the following disclaimer.", " ", "* Redistributions in binary form must reproduce the above copyright", " notice, this list of conditions and the following disclaimer in the", " documentation and/or other materials provided with the distribution.", " ", "* Neither the name of Sparta, Inc nor the names of its contributors may", " be used to endorse or promote products derived from this software", " without specific prior written permission.", " ", "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS", "IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,", "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", "PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR", "CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,", "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,", "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;", "OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,", "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR", "OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF", "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.", "", "---- Part 6: Cisco/BUPTNIC copyright notice (BSD) -----", "", "Copyright (c) 2004, Cisco, Inc and Information Network", "Center of Beijing University of Posts and Telecommunications.", "All rights reserved.", " ", "Redistribution and use in source and binary forms, with or without", "modification, are permitted provided that the following conditions are met:", " ", "* Redistributions of source code must retain the above copyright notice,", " this list of conditions and the following disclaimer.", " ", "* Redistributions in binary form must reproduce the above copyright", " notice, this list of conditions and the following disclaimer in the", " documentation and/or other materials provided with the distribution.", " ", "* Neither the name of Cisco, Inc, Beijing University of Posts and", " Telecommunications, nor the names of their contributors may", " be used to endorse or promote products derived from this software", " without specific prior written permission.", " ", "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS", "IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,", "THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", "PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR", "CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,", "EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,", "PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;", "OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,", "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR", "OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF", "ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.", "", "---- Part 7: Fabasoft R&D Software GmbH & Co KG copyright notice (BSD) -----", "", "Copyright (c) Fabasoft R&D Software GmbH & Co KG, 2003", "oss@fabasoft.com", "Author: Bernhard Penz ", "", "Redistribution and use in source and binary forms, with or without", "modification, are permitted provided that the following conditions are met:", "", "* Redistributions of source code must retain the above copyright notice,", " this list of conditions and the following disclaimer.", "", "* Redistributions in binary form must reproduce the above copyright", " notice, this list of conditions and the following disclaimer in the", " documentation and/or other materials provided with the distribution.", "", "* The name of Fabasoft R&D Software GmbH & Co KG or any of its subsidiaries, ", " brand or product names may not be used to endorse or promote products ", " derived from this software without specific prior written permission.", "", "THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY", "EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE", "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", "PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE", "LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR", "CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF", "SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR", "BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,", "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE", "OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN", "IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.", #endif #if DK4_HAVE_ZLIB_H "", "", "Zlib license", "============", "(C) 1995-2004 Jean-loup Gailly and Mark Adler", "", "This software is provided 'as-is', without any express or implied", "warranty. In no event will the authors be held liable for any damages", "arising from the use of this software.", "", "Permission is granted to anyone to use this software for any purpose,", "including commercial applications, and to alter it and redistribute it", "freely, subject to the following restrictions:", "", "1. The origin of this software must not be misrepresented; you must not", " claim that you wrote the original software. If you use this software", " in a product, an acknowledgment in the product documentation would be", " appreciated but is not required.", "2. Altered source versions must be plainly marked as such, and must not be", " misrepresented as being the original software.", "3. This notice may not be removed or altered from any source distribution.", "", "Jean-loup Gailly Mark Adler", "jloup@gzip.org madler@alumni.caltech.edu", #endif #if DK4_HAVE_BZLIB_H "", "", "Bzip2 and libbzip2 library license", "==================================", "This program, \"bzip2\", the associated library \"libbzip2\", and all", "documentation, are copyright (C) 1996-2007 Julian R Seward. All", "rights reserved.", "", "Redistribution and use in source and binary forms, with or without", "modification, are permitted provided that the following conditions", "are met:", "", "1. Redistributions of source code must retain the above copyright", " notice, this list of conditions and the following disclaimer.", "", "2. The origin of this software must not be misrepresented; you must ", " not claim that you wrote the original software. If you use this ", " software in a product, an acknowledgment in the product ", " documentation would be appreciated but is not required.", "", "3. Altered source versions must be plainly marked as such, and must", " not be misrepresented as being the original software.", "", "4. The name of the author may not be used to endorse or promote ", " products derived from this software without specific prior written ", " permission.", "", "THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS", "OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED", "WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE", "ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY", "DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL", "DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE", "GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS", "INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,", "WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING", "NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS", "SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.", "", "Julian Seward, jseward@bzip.org", "bzip2/libbzip2 version 1.0.5 of 10 December 2007", #endif #if DK4_HAVE_OPENSSL_MD5_H && DK4_HAVE_OPENSSL_SHA_H && DK4_HAVE_OPENSSL_RIPEMD_H "", "", "OpenSSL license", "===============", "", "LICENSE ISSUES", "--------------", "", "The OpenSSL toolkit stays under a dual license, i.e. both the conditions of", "the OpenSSL License and the original SSLeay license apply to the toolkit.", "See below for the actual license texts. Actually both licenses are BSD-style", "Open Source licenses. In case of any license issues related to OpenSSL", "please contact openssl-core@openssl.org.", "", "OpenSSL License", "---------------", "", "Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved.", "", "Redistribution and use in source and binary forms, with or without", "modification, are permitted provided that the following conditions", "are met:", "", "1. Redistributions of source code must retain the above copyright", " notice, this list of conditions and the following disclaimer. ", "", "2. Redistributions in binary form must reproduce the above copyright", " notice, this list of conditions and the following disclaimer in", " the documentation and/or other materials provided with the", " distribution.", "", "3. All advertising materials mentioning features or use of this", " software must display the following acknowledgment:", " \"This product includes software developed by the OpenSSL Project", " for use in the OpenSSL Toolkit. (http://www.openssl.org/)\"", "", "4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to", " endorse or promote products derived from this software without", " prior written permission. For written permission, please contact", " openssl-core@openssl.org.", "", "5. Products derived from this software may not be called \"OpenSSL\"", " nor may \"OpenSSL\" appear in their names without prior written", " permission of the OpenSSL Project.", "", "6. Redistributions of any form whatsoever must retain the following", " acknowledgment:", " \"This product includes software developed by the OpenSSL Project", " for use in the OpenSSL Toolkit (http://www.openssl.org/)\"", "", "THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY", "EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE", "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR", "PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR", "ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,", "SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT", "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;", "LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)", "HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,", "STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)", "ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED", "OF THE POSSIBILITY OF SUCH DAMAGE.", "", "This product includes cryptographic software written by Eric Young", "(eay@cryptsoft.com). This product includes software written by Tim", "Hudson (tjh@cryptsoft.com).", "", "", "Original SSLeay License", "-----------------------", "", "Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)", "All rights reserved.", "", "This package is an SSL implementation written", "by Eric Young (eay@cryptsoft.com).", "The implementation was written so as to conform with Netscapes SSL.", "", "This library is free for commercial and non-commercial use as long as", "the following conditions are aheared to. The following conditions", "apply to all code found in this distribution, be it the RC4, RSA,", "lhash, DES, etc., code; not just the SSL code. The SSL documentation", "included with this distribution is covered by the same copyright terms", "except that the holder is Tim Hudson (tjh@cryptsoft.com).", "", "Copyright remains Eric Young's, and as such any Copyright notices in", "the code are not to be removed.", "If this package is used in a product, Eric Young should be given attribution", "as the author of the parts of the library used.", "This can be in the form of a textual message at program startup or", "in documentation (online or textual) provided with the package.", "", "Redistribution and use in source and binary forms, with or without", "modification, are permitted provided that the following conditions", "are met:", "1. Redistributions of source code must retain the copyright", " notice, this list of conditions and the following disclaimer.", "2. Redistributions in binary form must reproduce the above copyright", " notice, this list of conditions and the following disclaimer in the", " documentation and/or other materials provided with the distribution.", "3. All advertising materials mentioning features or use of this software", " must display the following acknowledgement:", " \"This product includes cryptographic software written by", " Eric Young (eay@cryptsoft.com)\"", " The word 'cryptographic' can be left out if the rouines from the library", " being used are not cryptographic related :-).", "4. If you include any Windows specific code (or a derivative thereof) from ", " the apps directory (application code) you must include an acknowledgement:", " \"This product includes software written by Tim Hudson (tjh@cryptsoft.com)\"", "", "THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND", "ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE", "IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE", "ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE", "FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL", "DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS", "OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)", "HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT", "LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY", "OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF", "SUCH DAMAGE.", "", "The licence and distribution terms for any publically available version or", "derivative of this code cannot be changed. i.e. this code cannot simply be", "copied and put under another distribution licence", "[including the GNU Public Licence.]", "", #endif "", NULL #line 830 "prmonsnmp.ctr" }; /** Version information. */ static const char version_text[] = { DKT_VERSION_C8 }; /** Accepted SNMP version names. */ static const char * const snmp_version_names[] = { /* 0 */ "1", /* 1 */ "2", /* 2 */ "2c", /* 3 */ "3", NULL #line 849 "prmonsnmp.ctr" }; /** Host name (or IP address) of printer. */ static char *host_name = NULL; /** SNMP community name. */ static char *snmp_comm = NULL; /** SNMP session. */ static struct snmp_session *snmp_sess = NULL; /** Timeout in seconds. */ static dk4_um_t timeout = (dk4_um_t)0UL; /** Previous log timestamp. */ static dk4_time_t previous_log = (dk4_time_t)0UL; /** SNMP version. */ static long snmp_vers = SNMP_VERSION_1; /** Flag: Had a previous log. */ static int have_time = 0; /** Flag: Behave gracefully, max 4 SNMP requests per second. */ static int grace = 1; #ifdef SIGPIPE /** Indicator: SIGPIPE signal received. */ static DK4_VOLATILE dk4_sig_atomic_t sig_had_pipe = 0; #endif /** Indicator: SIGINT signal received. */ static DK4_VOLATILE dk4_sig_atomic_t sig_had_int = 0; /** Indicator: SIGTERM signal received. */ static DK4_VOLATILE dk4_sig_atomic_t sig_had_term = 0; static int encoding = DK4_ENCODING_ASCII; #endif /** Exit status code. */ static int exval = EXIT_FAILURE; #if DK4_HAVE_LIBNETSNMP && ((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) /** Help (1), version (2), license (4). */ static int hvl = 0; /** Pass volatile pointer. @param ptr Pointer to pass through. @return The original pointer. */ static DK4_VOLATILE dk4_sig_atomic_t * sig_pass_pointer(DK4_VOLATILE dk4_sig_atomic_t *ptr) { return ptr; } #ifdef SIGPIPE /** Handler for SIGPIPE signal. @param signo Signal number (always SIGPIPE, ignored). */ static void sig_handler_pipe(int signo) { *sig_pass_pointer(&sig_had_pipe) = 1; } #endif /** Handler for SIGINT signal. @param signo Signal number (always SIGINT, ignored). */ static void sig_handler_int(int signo) { *sig_pass_pointer(&sig_had_int) = 1; } /** Handler for SIGTERM signal. @param signo Signal number (always SIGTERM, ignored). */ static void sig_handler_term(int signo) { *sig_pass_pointer(&sig_had_term) = 1; } /** Read value from volatile atomic type. This function is necessary as some compilers mis-optimize direct access to volatile variables (at least if you believe one of the coding standards). @param ap Pointer to volatile atomic variable. @return Contents of the variable. */ static dk4_sig_atomic_t sig_read_atomic(DK4_VOLATILE dk4_sig_atomic_t *ap) { return (*ap); } /** Check whether we can continue or must abort due to signal. @param dopipe Flag: Check for SIGPIPE too. @return 1 if we can continue, 0 otherwise. */ static int can_continue(int dopipe) { int back = 1; if (0 != sig_read_atomic(&sig_had_term)) { back = 0; } if (0 != sig_read_atomic(&sig_had_int)) { back = 0; } #ifdef SIGPIPE if (0 != dopipe) { if (0 != sig_read_atomic(&sig_had_pipe)) { back = 0; } } #endif return back; } /** Check two OIDs for equality. @param pl Left OID. @param szl Left OID size. @param pr Right OID. @param szr Right OID size. @return 1 for equal OIDs, 0 otherwise. */ static int oids_equal(const oid *pl, size_t szl, const oid *pr, size_t szr) { #if VERSION_BEFORE_20160206 size_t i; #endif int back = 0; if (szl == szr) { #if VERSION_BEFORE_20160206 back = 1; for (i = 0; ((i < szl) && (1 == back)); i++) { if (pl[i] != pr[i]) { back = 0; } } #else if (0 == dk4mem_cmp(pl, pr, (szl * sizeof(oid)), NULL)) { back = 1; } #endif } return back; } /** Find OID index. @param oid Pointer to OID to check. @param sz OID size. @return 0 for hrDeviceStatus, 1 for hrPrinterStatus, 2 for page counter, 3 for hrPrinterDetectedErrorState, 4 for prtMarkerLifeCount, -1 otherwise. */ static int oid_index(oid *p, size_t sz) { int back = -1; if (0 != oids_equal(p, sz, prmonsnmp_oid_ds, pjsnmp_sz_oid_ds)) { back = 0; } else { if (0 != oids_equal(p, sz, prmonsnmp_oid_ps, pjsnmp_sz_oid_ps)) { back = 1; } else { if (0 != oids_equal(p, sz, prmonsnmp_oid_pe, pjsnmp_sz_oid_pe)) { back = 2; } else { if (0 != oids_equal(p, sz, prmonsnmp_oid_st, pjsnmp_sz_oid_st)) { back = 3; } else { if (0 != oids_equal(p, sz, prmonsnmp_oid_pc, pjsnmp_sz_oid_pc)) { back = 4; } } } } } return back; } /** Retrieve integer value from variable list. @param iptr Address of variable to set. @param var SNMP variable containing the value. @return 1 on success, 0 on error. */ static int get_int(int *iptr, struct variable_list *var) { char bu[64]; /* Buffer for text data copy */ const char *endptr = NULL; /* End of used data in numeric conversion */ long l; /* Long value from SNMP response */ int i; /* Text to number conversion result */ int back = 0; #line 1099 "prmonsnmp.ctr" switch (var->type) { case ASN_OCTET_STR : { #line 1101 "prmonsnmp.ctr" if ((var->val_len > 0) && (var->val_len < sizeof(bu))) { dk4mem_cpy(bu, (void *)((var->val).string), var->val_len, NULL); bu[var->val_len] = '\0'; if (0 != dk4ma_input_c8_dec_int(&i, bu, &endptr, 1, NULL)) { *iptr = i; back = 1; } } } break; case ASN_TIMETICKS : case ASN_GAUGE : case ASN_COUNTER : case ASN_INTEGER : { #line 1114 "prmonsnmp.ctr" l = *((var->val).integer); *iptr = (int)l; back = 1; } break; } #line 1120 "prmonsnmp.ctr" return back; } /** Retrieve unsigned long value from variable list. @param ulptr Address of variable to set. @param var SNMP variable containing the value. @return 1 on success, 0 on error. */ static int get_ul(unsigned long *ulptr, struct variable_list *var) { unsigned long ul = 0UL; /* Conversion result */ long l; /* Long result from SNMP response */ int back = 0; #line 1137 "prmonsnmp.ctr" switch (var->type) { case ASN_OCTET_STR : { #line 1139 "prmonsnmp.ctr" if (0 < var->val_len) { ul |= ((((unsigned long)(((var->val).string)[0])) << 24) & 0xFF000000UL); back = 1; } if (1 < var->val_len) { ul |= ((((unsigned long)(((var->val).string)[1])) << 16) & 0x00FF0000UL); } if (2 < var->val_len) { ul |= ((((unsigned long)(((var->val).string)[2])) << 8) & 0x0000FF00UL); } if (3 < var->val_len) { ul |= ((((unsigned long)(((var->val).string)[3])) ) & 0x000000FFUL); } if (0 != back) { *ulptr = ul; } } break; case ASN_TIMETICKS : case ASN_GAUGE : case ASN_COUNTER : case ASN_INTEGER : { #line 1164 "prmonsnmp.ctr" l = *((var->val).integer); if (0L <= l) { *ulptr = (unsigned long)l; back = 1; } } break; } #line 1172 "prmonsnmp.ctr" return back; } /** Check whether a text buffer contains non-ASCII bytes. @param ptr Buffer start address. @param i Buffer size. @return 1 if non-ASCII found, 0 for ASCII only. */ static int contains_non_ascii(const unsigned char *ptr, size_t i) { int back = 0; while ((0 == back) && (0 < i)) { if (0x7F < *(ptr++)) { back = 1; } i--; } return back; } /** Log current timestamp. */ static void log_timestamp(void) { char buf[64]; /* Text representation of timestamp */ dk4_time_t current; /* Current time */ int res; /* Conversion operation result */ dk4time_get(¤t); if ((0 == have_time) || (current != previous_log)) { res = dk4time_as_text_c8(buf, sizeof(buf), ¤t, NULL); if (0 != res) { if (0 != have_time) { fputc('\n', stdout); } fputs(prmonsnmp_kw[34], stdout); fputs(buf, stdout); fputc('\n', stdout); } } else { if (0 != have_time) { fputc('\n', stdout); } } have_time = 1; previous_log = current; } /** Show text, convert non-ASCII to question marks. @param str String to show. @param sz Text length. */ static void show_as_ascii(const unsigned char *str, size_t sz) { while (0 < sz--) { if (0x7F < *str) { fputc('?', stdout); } else { fputc(*str, stdout); } str++; } } /** The main loop sending SNMP requests and printing responses to standard output. */ static void run_main_loop(void) { char nb[64]; /* Buffer for hex representation */ struct timeval to; /* Timeout for select */ struct snmp_pdu *rq; /* Request */ struct snmp_pdu *rs; /* Response */ struct variable_list *vars; /* Current variable to process */ unsigned char *uptr; /* Traverse text */ dk4_time_t start_time; /* Start time */ dk4_time_t timeout_time; /* First timeout seen */ dk4_time_t current_time; /* Current time */ unsigned long cond = 0UL; /* Printer detected error */ unsigned long ocond = 0UL; /* Previous printer det err */ unsigned long tcond = 0UL; /* Current conditions */ unsigned long opcnt = 0UL; /* Previous page count */ unsigned long ul; /* unsigned long from current var */ unsigned long pcnt; /* Page count */ size_t lst; /* Status text length */ size_t olst; /* Previous status text length */ int i; /* Traverse bits in pr det err st */ int found; /* Summary: Which information found */ int must_show; /* Must show changed values */ int must_flush; /* Must flush standard output */ int status; /* SNMP response status */ int res; /* Operation result */ int cc = 1; /* Flag: Can continue */ int devst = 0; /* Device status */ int prist = 0; /* Printer status */ int unreach = 0; /* Flag: Unreachable */ int odevst = 0; /* Previous device status */ int oprist = 0; /* Previous printer status */ int ounreach = 0; /* Previous unreach flag */ dk4time_get(&start_time); timeout_time = (dk4_time_t)0UL; if ((dk4_um_t)0UL < timeout) { timeout_time = start_time + (dk4_time_t)timeout; } cc = 1; statext[0] = '\0'; ostatext[0] = '\0'; olst = 0; do { pcnt = 0UL; unreach = 1; devst = 0; prist = 0; found = 0; cond = 0UL; statext[0] = '\0'; rs = NULL; lst = 0; must_show = 0; #line 1308 "prmonsnmp.ctr" must_flush = 0; if (0 != can_continue(0)) { rq = snmp_pdu_create(SNMP_MSG_GET); if (NULL != rq) { snmp_add_null_var(rq, prmonsnmp_oid_ds, pjsnmp_sz_oid_ds); snmp_add_null_var(rq, prmonsnmp_oid_ps, pjsnmp_sz_oid_ps); snmp_add_null_var(rq, prmonsnmp_oid_pe, pjsnmp_sz_oid_pe); snmp_add_null_var(rq, prmonsnmp_oid_st, pjsnmp_sz_oid_st); snmp_add_null_var(rq, prmonsnmp_oid_pc, pjsnmp_sz_oid_pc); status = snmp_synch_response(snmp_sess, rq, &rs); if (STAT_SUCCESS == status) { if (NULL != rs) { if (SNMP_ERR_NOERROR == rs->errstat) { unreach = 0; vars = rs->variables; while (NULL != vars) { switch (oid_index(vars->name, vars->name_length)) { case 0: { i = 0; if (0 != get_int(&i, vars)) { devst = i; found |= 1; } } break; case 1: { i = 0; if (0 != get_int(&i, vars)) { prist = i; found |= 2; } } break; case 2: { ul = 0UL; if (0 != get_ul(&ul, vars)) { cond = ul; found |= 4; } } break; case 3: { if ((0 < vars->val_len)&&(sizeof(statext) > vars->val_len)) { dk4mem_cpy(statext,(vars->val).string,vars->val_len,NULL); statext[vars->val_len] = '\0'; lst = vars->val_len; found |= 8; } } break; case 4: { ul = 0UL; if (0 != get_ul(&ul, vars)) { pcnt = ul; found |= 16; } } break; } vars = vars->next_variable; } if (0 != (1 & found)) { if (devst != odevst) { #line 1367 "prmonsnmp.ctr" must_show = 1; } } if (0 != (2 & found)) { if (prist != oprist) { #line 1372 "prmonsnmp.ctr" must_show = 1; } } if (0 != (4 & found)) { if (cond != ocond) { #line 1377 "prmonsnmp.ctr" must_show = 1; } } if (0 != (8 & found)) { if (lst != olst) { #line 1382 "prmonsnmp.ctr" must_show = 1; } if (0 != dk4mem_cmp(statext, ostatext, lst, NULL)) { #line 1386 "prmonsnmp.ctr" must_show = 1; } } if (0 != (16 & found)) { if (pcnt != opcnt) { must_show = 1; } } if (0 != must_show) { log_timestamp(); must_flush = 1; if ((0 != (1 & found)) && (0 <= devst) && (5 >= devst)) { fputs(prmonsnmp_kw[4 + devst], stdout); } if ((0 != (2 & found)) && (0 <= prist) && (5 >= prist)) { fputs(prmonsnmp_kw[17], stdout); fputs(prmonsnmp_kw[10 + prist], stdout); } if (0 != (4 & found)) { fputs(prmonsnmp_kw[18], stdout); tcond = 0x80000000UL; for (i = 0; i < 16; i++) { if ((0 < i) && (0 == (i % 4))) { fputc('-', stdout); } fputc(((0UL != (tcond & cond)) ? '1' : '0'), stdout); tcond = tcond / 2UL; } } if (0 != (16 & found)) { res = dk4ma_write_c8_decimal_unsigned( nb, sizeof(nb), (dk4_um_t)pcnt, 0, NULL ); if (0 != res) { fputs(prmonsnmp_kw[18], stdout); fputs(nb, stdout); } } fputc('\n', stdout); if (0 != (4 & found)) { tcond = 0x80000000UL; for (i = 0; i < 15; i++) { if (0UL != (cond & tcond)) { fputs(prmonsnmp_kw[19 + i], stdout); } tcond = tcond / 2UL; } } if (0 != (8 & found)) { if (0 < lst) { uptr = (unsigned char *)statext; for (i = 0; i < lst; i++) { if (0 < i) { if (0 == (i % 24)) { fputc('\n', stdout); } else { fputc(' ', stdout); } } res = dk4ma_write_c8_hex_unsigned( nb, sizeof(nb), (dk4_um_t)(*(uptr++)), 2, NULL ); if (0 != res) { fputs(nb, stdout); } } fputc('\n', stdout); fputc('"', stdout); if (0 == contains_non_ascii((unsigned char *)statext,lst)) { fwrite(statext, 1, lst, stdout); } else { show_as_ascii((unsigned char *)statext, lst); } fputc('"', stdout); fputc('\n', stdout); } } } } } } if (NULL != rs) { snmp_free_pdu(rs); } if (unreach != ounreach) { log_timestamp(); fputs(prmonsnmp_kw[35], stdout); must_flush = 1; } ounreach = unreach; odevst = devst; oprist = prist; ocond = cond; olst = lst; opcnt = pcnt; strcpy(ostatext, statext); } else { cc = -1; exval = EXIT_FAILURE; /* ERROR: Failed to create request PDU */ fputs(prmonsnmp_kw[2], stderr); fputs(prmonsnmp_kw[36], stderr); fflush(stderr); } if (0 != must_flush) { fflush(stdout); } } else { cc = -1; } if (1 == cc) { if ((dk4_time_t)0UL < timeout_time) { dk4time_get(¤t_time); if (current_time > timeout_time) { cc = 0; } } } if (1 == cc) { if (0 != grace) { to.tv_sec = 0L; to.tv_usec = 250000L; select(0, NULL, NULL, NULL, &to); } } } while (1 == cc); } /** Set SNMP version. @param name SNMP version name as text. @return 1 on success, 0 on error. */ static int set_snmp_version(const char *name) { int back = 0; switch (dk4str8_array_index(snmp_version_names, name, 0)) { case 0: { back = 1; snmp_vers = SNMP_VERSION_1; } break; case 1: case 2: { back = 1; snmp_vers = SNMP_VERSION_2c; } break; case 3: { back = 1; snmp_vers = SNMP_VERSION_3; } break; } return back; } /** Process command line arguments. @param argc Number of command line arguments. @param argv Command line arguments array. @return 1 on success, 0 on error. */ static int process_command_line_arguments(int argc, char *argv[]) { char **lfdarg; /* Traverse cmd line arguments */ char *curarg; /* Current cmd line argument */ const char *ep; /* End of used data in conversion */ dk4_um_t um; /* Conversion result */ int i; /* Cmd line args still remaining */ int have_vers = 0; /* Flag: Have SNMP version */ int back = 1; /* Function result */ int res; /* Conversion result */ lfdarg = argv; i = argc; lfdarg++; i--; while (0 < i) { curarg = *lfdarg; if ('-' == *curarg) { curarg++; switch (*curarg) { case '-' : { curarg++; switch ( dk4str8_array_index(long_options, curarg, 0) ) { case 0: { hvl |= 1; } break; case 1: { hvl |= 2; } break; case 2: { hvl |= 4; } break; } } break; case 'n' : { grace = 0; } break; case 'v' : { if (0 != have_vers) { /* WARNING: Version redefined */ fputs(prmonsnmp_kw[2], stderr); fputs(prmonsnmp_kw[37], stderr); fflush(stderr); } have_vers = 1; curarg++; curarg = dk4str8_start(curarg, NULL); if (NULL == curarg) { lfdarg++; i--; if (0 < i) { curarg = *lfdarg; } } if (NULL != curarg) { if (0 == set_snmp_version(curarg)) { /* WARNING: Illegal SNMP version */ fputs(prmonsnmp_kw[2], stderr); fputs(prmonsnmp_kw[38], stderr); fputs(curarg, stderr); fputs(prmonsnmp_kw[39], stderr); fflush(stderr); back = 0; } } else { back = 0; } } break; case 'c' : { curarg++; curarg = dk4str8_start(curarg, NULL); if (NULL == curarg) { lfdarg++; i--; if (0 < i) { curarg = *lfdarg; } } if (NULL != curarg) { if (NULL != snmp_comm) { /* WARNING: Community redefined */ fputs(prmonsnmp_kw[2], stderr); fputs(prmonsnmp_kw[40], stderr); fflush(stderr); } snmp_comm = curarg; } else { back = 0; } } break; case 't' : { curarg++; curarg = dk4str8_start(curarg, NULL); if (NULL == curarg) { lfdarg++; i--; if (0 < i) { curarg = *lfdarg; } } if (NULL != curarg) { ep = NULL; res = dk4ma_input_c8_dec_dk4_um_t(&um, curarg, &ep, 1, NULL); if (0 != res) { timeout = um; } else { back = 0; } } else { back = 0; } } break; } } else { if (NULL != host_name) { /* WARNING: Host name redefined */ fputs(prmonsnmp_kw[2], stderr); fputs(prmonsnmp_kw[41], stderr); fflush(stderr); } host_name = curarg; } if (0 < i) { lfdarg++; i--; } } if ((0 == hvl) && (NULL == host_name)) { /* ERROR: Missing host name */ fputs(prmonsnmp_kw[2], stderr); fputs(prmonsnmp_kw[42], stderr); fflush(stderr); back = 0; } return back; } /** Show a text paragraph on standard output. @param txt Text to show. */ static void show_text(const char * const *txt) { if (NULL != txt) { while (NULL != *txt) { fputs(*(txt++), stdout); fputc('\n', stdout); } fflush(stdout); } } /** Handle --help, --version, --license options. */ static void run_hvl(void) { #line 1697 "prmonsnmp.ctr" if (0 != (1 & hvl)) { show_text(help_text); } if (0 != (2 & hvl)) { fputs(version_text, stdout); fputc('\n', stdout); fflush(stdout); } if (0 != (4 & hvl)) { show_text(license_text); } exval = EXIT_SUCCESS; #line 1710 "prmonsnmp.ctr" } #endif /** Main function. @param argc Number of command line arguments. @param argv Command line arguments array. @return 0 on success, all other values indicate errors. */ int main(int argc, char *argv[]) { #if DK4_HAVE_LIBNETSNMP && ((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) /* +++++ Required libraries available */ dkChar blang[32]; dkChar breg[32]; struct snmp_session template; #if DK4_HAVE_SIGACTION #ifdef SIGPIPE struct sigaction opipe; struct sigaction npipe; #endif struct sigaction oint; struct sigaction nint; struct sigaction oterm; struct sigaction nterm; #else #ifdef SIGPIPE dk4_sig_handler_t *opipe = NULL; #endif dk4_sig_handler_t *oterm = NULL; dk4_sig_handler_t *oint = NULL; #endif const size_t szblang = DK4_SIZEOF(blang,dkChar); const size_t szbreg = DK4_SIZEOF(breg,dkChar); #if DK4_HAVE_SIGACTION int pipe_set = 0; int term_set = 0; int int_set = 0; int sig_i_f = 0; int sig_r_f = 0; #endif #line 1755 "prmonsnmp.ctr" #line 1756 "prmonsnmp.ctr" /* Set signal handlers. -------------------- */ #if DK4_HAVE_SIGACTION #ifdef SIGPIPE DK4_MEMRES(&npipe, sizeof(npipe)); npipe.sa_handler = sig_handler_pipe; npipe.sa_flags = 0; if (0 != sigemptyset(&npipe.sa_mask)) { /* ERROR: Failed to set up masked signal set for SIGPIPE */ sig_i_f = 1; goto finished; } if (0 != sigaddset(&npipe.sa_mask, SIGPIPE)) { /* ERROR: Failed to set up masked signal set for SIGPIPE */ sig_i_f = 1; goto finished; } if (0 != sigaction(SIGPIPE, &npipe, &opipe)) { /* ERROR: Failed to set up signal handler for SIGPIPE */ sig_i_f = 1; goto finished; } pipe_set = 1; #endif DK4_MEMRES(&nterm, sizeof(nterm)); nterm.sa_handler = sig_handler_term; nterm.sa_flags = 0; if (0 != sigemptyset(&nterm.sa_mask)) { /* ERROR: Failed to set up masked signal set for SIGTERM */ sig_i_f = 1; goto finished; } if (0 != sigaddset(&nterm.sa_mask, SIGTERM)) { /* ERROR: Failed to set up masked signal set for SIGTERM */ sig_i_f = 1; goto finished; } if (0 != sigaction(SIGTERM, &nterm, &oterm)) { /* ERROR: Failed to set up signal handler for SIGTERM */ sig_i_f = 1; goto finished; } term_set = 1; DK4_MEMRES(&nint, sizeof(nint)); nint.sa_handler = sig_handler_int; nint.sa_flags = 0; if (0 != sigemptyset(&nint.sa_mask)) { /* ERROR: Failed to set up masked signal set for SIGINT */ sig_i_f = 1; goto finished; } if (0 != sigaddset(&nint.sa_mask, SIGINT)) { /* ERROR: Failed to set up masked signal set for SIGINT */ sig_i_f = 1; goto finished; } if (0 != sigaction(SIGINT, &nint, &oint)) { /* ERROR: Failed to set up signal handler for SIGINT */ sig_i_f = 1; goto finished; } int_set = 1; #else #ifdef SIGPIPE opipe = sigset(SIGPIPE, sig_handler_pipe); #endif oint = sigset(SIGINT, sig_handler_int); oterm = sigset(SIGTERM, sig_handler_term); #endif /* Retrieve encoding. ------------------ */ if (0 == dk4loc_get_settings(blang, szblang, breg, szbreg, &encoding, NULL)) { encoding = DK4_ENCODING_ASCII; } /* Process command line arguments. ------------------------------- */ if (0 == process_command_line_arguments(argc, argv)) { goto finished; } if (0 != hvl) { run_hvl(); goto finished; } /* Set up SNMP and create session. ------------------------------- */ #if DK4_HAVE_SNMP_DISABLE_SYSLOG #line 1852 "prmonsnmp.ctr" snmp_disable_syslog(); #endif #if DK4_HAVE_SNMP_DISABLE_FILELOG #line 1856 "prmonsnmp.ctr" snmp_disable_filelog(); #endif #if DK4_HAVE_SNMP_DISABLE_STDERRLOG #line 1860 "prmonsnmp.ctr" snmp_disable_stderrlog(); #endif init_snmp(prmonsnmp_kw[2]); DK4_MEMRES(&template, sizeof(template)); snmp_sess_init(&template); template.version = snmp_vers; template.peername = host_name; template.community = (unsigned char *)snmp_comm; if (NULL == snmp_comm) { template.community = (unsigned char *)(prmonsnmp_kw[3]); } template.community_len = strlen((char *)(template.community)); snmp_sess = snmp_open(&template); if (NULL == snmp_sess) { /* ERROR: Failed to open session */ fputs(prmonsnmp_kw[2], stderr); fputs(prmonsnmp_kw[43], stderr); fflush(stderr); goto finished; } /* Run main loop. -------------- */ exval = EXIT_SUCCESS; run_main_loop(); /* Cleanup. -------- */ finished: /* Close SNMP session, if any. */ /* Restore signal handlers */ #if DK4_HAVE_SIGACTION if (0 != sig_i_f) { fputs(prmonsnmp_kw[2], stderr); fputs(prmonsnmp_kw[45], stderr); fflush(stderr); } if (0 != int_set) { if (0 != sigaction(SIGINT, &oint, NULL)) { /* ERROR */ sig_r_f = 1; } } if (0 != term_set) { if (0 != sigaction(SIGTERM, &oterm, NULL)) { /* ERROR */ sig_r_f = 1; } } #ifdef SIGPIPE if (0 != pipe_set) { if (0 != sigaction(SIGPIPE, &opipe, NULL)) { /* ERROR */ sig_r_f = 1; } } #endif if (0 != sig_r_f) { fputs(prmonsnmp_kw[2], stderr); fputs(prmonsnmp_kw[44], stderr); fflush(stderr); } #else if (NULL != oterm) { sigset(SIGTERM, oterm); } if (NULL != oint ) { sigset(SIGINT, oint ); } #ifdef SIGPIPE if (NULL != opipe) { sigset(SIGPIPE, opipe); } #endif #endif #line 1938 "prmonsnmp.ctr" #line 1939 "prmonsnmp.ctr" /* ----- Required libraries available */ #else /* if DK4_HAVE_LIBNETSNMP && ((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) */ fputs(prmonsnmp_kw[2], stderr); fputs(": ERROR: Required features missing!\n", stderr); #if !DK4_HAVE_LIBNETSNMP fputs("Support for Net-SNMP required!\n", stderr); fputs("http://sourceforge.net/projects/net-snmp\n", stderr); #endif #if !((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) fputs("Support for sigaction() or sigset() required but not found!\n",stderr); #endif fflush(stderr); #endif /* if DK4_HAVE_LIBNETSNMP && ((DK4_HAVE_SIGACTION) || (DK4_HAVE_SIGSET)) */ exit(exval); return exval; }