125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * SNMP functions for CUPS. 325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 2007-2014 by Apple Inc. 525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 2006-2007 by Easy Software Products, all rights reserved. 625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * These coded instructions, statements, and computer programs are the 825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * property of Apple Inc. and are protected by Federal copyright 925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * law. Distribution and use rights are outlined in the file "LICENSE.txt" 1025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * "LICENSE" which should have been included with this file. If this 1125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * file is missing or damaged, see the license at "http://www.cups.org/". 1225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 1325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This file is subject to the Apple OS-Developed Software exception. 1425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 1525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 1625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 1725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Include necessary headers. 1825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 1925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include "cups-private.h" 2125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include "snmp-private.h" 2225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_POLL 2325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# include <poll.h> 2425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_POLL */ 2525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 2825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Local functions... 2925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 3025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 3125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void asn1_debug(const char *prefix, unsigned char *buffer, 3225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t len, int indent); 3325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int asn1_decode_snmp(unsigned char *buffer, size_t len, 3425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_snmp_t *packet); 3525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int asn1_encode_snmp(unsigned char *buffer, size_t len, 3625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_snmp_t *packet); 3725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int asn1_get_integer(unsigned char **buffer, 3825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend, 3925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned length); 4025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int asn1_get_oid(unsigned char **buffer, 4125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend, 4225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned length, int *oid, int oidsize); 4325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int asn1_get_packed(unsigned char **buffer, 4425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend); 4525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic char *asn1_get_string(unsigned char **buffer, 4625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend, 4725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned length, char *string, 4825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t strsize); 4925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned asn1_get_length(unsigned char **buffer, 5025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend); 5125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int asn1_get_type(unsigned char **buffer, 5225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend); 5325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void asn1_set_integer(unsigned char **buffer, 5425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int integer); 5525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void asn1_set_length(unsigned char **buffer, 5625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned length); 5725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void asn1_set_oid(unsigned char **buffer, 5825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const int *oid); 5925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void asn1_set_packed(unsigned char **buffer, 6025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int integer); 6125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned asn1_size_integer(int integer); 6225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned asn1_size_length(unsigned length); 6325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned asn1_size_oid(const int *oid); 6425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned asn1_size_packed(int integer); 6525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void snmp_set_error(cups_snmp_t *packet, 6625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *message); 6725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 6825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 6925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 7025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPClose()' - Close a SNMP socket. 7125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 7225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 7325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid 7425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPClose(int fd) /* I - SNMP socket file descriptor */ 7525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 7625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4_cupsSNMPClose(fd=%d)", fd)); 7725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 7825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrClose(NULL, fd); 7925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 8025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 8125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 8225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 8325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPCopyOID()' - Copy an OID. 8425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 8525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The array pointed to by "src" is terminated by the value -1. 8625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 8725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 8825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint * /* O - New OID */ 8925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPCopyOID(int *dst, /* I - Destination OID */ 9025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const int *src, /* I - Source OID */ 9125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int dstsize) /* I - Number of integers in dst */ 9225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 9325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int i; /* Looping var */ 9425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4_cupsSNMPCopyOID(dst=%p, src=%p, dstsize=%d)", dst, src, 9725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann dstsize)); 9825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 9925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (i = 0, dstsize --; src[i] >= 0 && i < dstsize; i ++) 10025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann dst[i] = src[i]; 10125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 10225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann dst[i] = -1; 10325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 10425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (dst); 10525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 10625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 10725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 10825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 10925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPDefaultCommunity()' - Get the default SNMP community name. 11025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 11125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The default community name is the first community name found in the 11225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * snmp.conf file. If no community name is defined there, "public" is used. 11325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 11425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 11525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannconst char * /* O - Default community name */ 11625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPDefaultCommunity(void) 11725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 11825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_file_t *fp; /* snmp.conf file */ 11925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char line[1024], /* Line from file */ 12025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *value; /* Value from file */ 12125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int linenum; /* Line number in file */ 12225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_globals_t *cg = _cupsGlobals(); /* Global data */ 12325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 12425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 12525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("4_cupsSNMPDefaultCommunity()"); 12625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 12725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cg->snmp_community[0]) 12825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 12925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(cg->snmp_community, "public", sizeof(cg->snmp_community)); 13025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 13125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(line, sizeof(line), "%s/snmp.conf", cg->cups_serverroot); 13225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((fp = cupsFileOpen(line, "r")) != NULL) 13325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 13425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann linenum = 0; 13525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) 13625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!_cups_strcasecmp(line, "Community") && value) 13725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 13825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(cg->snmp_community, value, sizeof(cg->snmp_community)); 13925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 14025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 14125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cupsFileClose(fp); 14325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 14425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 14525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5_cupsSNMPDefaultCommunity: Returning \"%s\"", 14725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->snmp_community)); 14825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 14925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (cg->snmp_community); 15025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 15125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 15225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 15325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 15425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPIsOID()' - Test whether a SNMP response contains the specified OID. 15525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 15625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The array pointed to by "oid" is terminated by the value -1. 15725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 15825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 15925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - 1 if equal, 0 if not equal */ 16025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPIsOID(cups_snmp_t *packet, /* I - Response packet */ 16125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const int *oid) /* I - OID */ 16225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 16325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int i; /* Looping var */ 16425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 16525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 16625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 16725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 16825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 16925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 17025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4_cupsSNMPIsOID(packet=%p, oid=%p)", packet, oid)); 17125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 17225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!packet || !oid) 17325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 17425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPIsOID: Returning 0"); 17525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 17625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 17725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 17825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 17925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 18025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Compare OIDs... 18125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 18225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 18325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (i = 0; 18425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann i < CUPS_SNMP_MAX_OID && oid[i] >= 0 && packet->object_name[i] >= 0; 18525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann i ++) 18625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (oid[i] != packet->object_name[i]) 18725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 18825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPIsOID: Returning 0"); 18925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 19025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 19125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 19225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 19325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5_cupsSNMPIsOID: Returning %d", 19425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann i < CUPS_SNMP_MAX_OID && oid[i] == packet->object_name[i])); 19525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 19625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (i < CUPS_SNMP_MAX_OID && oid[i] == packet->object_name[i]); 19725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 19825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 19925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 20025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 20125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPIsOIDPrefixed()' - Test whether a SNMP response uses the specified 20225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * OID prefix. 20325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 20425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The array pointed to by "prefix" is terminated by the value -1. 20525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 20625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 20725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - 1 if prefixed, 0 if not prefixed */ 20825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPIsOIDPrefixed( 20925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_snmp_t *packet, /* I - Response packet */ 21025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const int *prefix) /* I - OID prefix */ 21125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 21225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int i; /* Looping var */ 21325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 21425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 21525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 21625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 21725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 21825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 21925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4_cupsSNMPIsOIDPrefixed(packet=%p, prefix=%p)", packet, 22025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann prefix)); 22125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 22225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!packet || !prefix) 22325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 22425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPIsOIDPrefixed: Returning 0"); 22525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 22625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 22725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 22825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 22925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 23025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Compare OIDs... 23125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 23225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 23325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (i = 0; 23425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann i < CUPS_SNMP_MAX_OID && prefix[i] >= 0 && packet->object_name[i] >= 0; 23525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann i ++) 23625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (prefix[i] != packet->object_name[i]) 23725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 23825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPIsOIDPrefixed: Returning 0"); 23925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 24025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 24125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 24225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 24325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5_cupsSNMPIsOIDPrefixed: Returning %d", 24425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann i < CUPS_SNMP_MAX_OID)); 24525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 24625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (i < CUPS_SNMP_MAX_OID); 24725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 24825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 24925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 25025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 25125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPOIDToString()' - Convert an OID to a string. 25225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 25325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 25425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 25525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannchar * /* O - New string or @code NULL@ on error */ 25625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPOIDToString(const int *src, /* I - OID */ 25725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *dst, /* I - String buffer */ 25825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t dstsize) /* I - Size of string buffer */ 25925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 26025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *dstptr, /* Pointer into string buffer */ 26125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *dstend; /* End of string buffer */ 26225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 26325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 26425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4_cupsSNMPOIDToString(src=%p, dst=%p, dstsize=" CUPS_LLFMT ")", 26525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann src, dst, CUPS_LLCAST dstsize)); 26625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 26725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 26825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 26925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 27025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!src || !dst || dstsize < 4) 27225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 27325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 27525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Loop through the OID array and build a string... 27625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 27725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 27825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (dstptr = dst, dstend = dstptr + dstsize - 1; 27925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *src >= 0 && dstptr < dstend; 28025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann src ++, dstptr += strlen(dstptr)) 28125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snprintf(dstptr, (size_t)(dstend - dstptr + 1), ".%d", *src); 28225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 28325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*src >= 0) 28425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 28525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 28625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (dst); 28725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 28825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 28925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 29025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 29125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPOpen()' - Open a SNMP socket. 29225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 29325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 29425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - SNMP socket file descriptor */ 29525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPOpen(int family) /* I - Address family - @code AF_INET@ or @code AF_INET6@ */ 29625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 29725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int fd; /* SNMP socket file descriptor */ 29825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int val; /* Socket option value */ 29925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 30025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 30125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 30225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Create the SNMP socket... 30325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 30425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 30525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4_cupsSNMPOpen(family=%d)", family)); 30625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 30725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((fd = socket(family, SOCK_DGRAM, 0)) < 0) 30825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 30925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5_cupsSNMPOpen: Returning -1 (%s)", strerror(errno))); 31025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 31125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 31225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 31325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 31425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 31525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Set the "broadcast" flag... 31625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 31725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 31825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann val = 1; 31925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, CUPS_SOCAST &val, sizeof(val))) 32125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 32225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5_cupsSNMPOpen: Returning -1 (%s)", strerror(errno))); 32325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann close(fd); 32525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 32725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 32825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5_cupsSNMPOpen: Returning %d", fd)); 33025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (fd); 33225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 33325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 33625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPRead()' - Read and parse a SNMP response. 33725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 33825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * If "timeout" is negative, @code _cupsSNMPRead@ will wait for a response 33925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * indefinitely. 34025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 34125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 34225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmanncups_snmp_t * /* O - SNMP packet or @code NULL@ if none */ 34325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPRead(int fd, /* I - SNMP socket file descriptor */ 34425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_snmp_t *packet, /* I - SNMP packet buffer */ 34525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann double timeout) /* I - Timeout in seconds */ 34625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 34725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char buffer[CUPS_SNMP_MAX_PACKET]; 34825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* Data packet */ 34925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t bytes; /* Number of bytes received */ 35025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann socklen_t addrlen; /* Source address length */ 35125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann http_addr_t address; /* Source address */ 35225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 35325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 35425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 35525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 35625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 35725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 35825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4_cupsSNMPRead(fd=%d, packet=%p, timeout=%.1f)", fd, packet, 35925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann timeout)); 36025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fd < 0 || !packet) 36225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 36325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPRead: Returning NULL"); 36425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 36625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 36725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 36925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Optionally wait for a response... 37025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 37125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 37225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (timeout >= 0.0) 37325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 37425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int ready; /* Data ready on socket? */ 37525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_POLL 37625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann struct pollfd pfd; /* Polled file descriptor */ 37725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 37825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann pfd.fd = fd; 37925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann pfd.events = POLLIN; 38025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 38125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while ((ready = poll(&pfd, 1, (int)(timeout * 1000.0))) < 0 && 38225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (errno == EINTR || errno == EAGAIN)); 38325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 38425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 38525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fd_set input_set; /* select() input set */ 38625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann struct timeval stimeout; /* select() timeout */ 38725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 38825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann do 38925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 39025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann FD_ZERO(&input_set); 39125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann FD_SET(fd, &input_set); 39225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 39325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann stimeout.tv_sec = (int)timeout; 39425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann stimeout.tv_usec = (int)((timeout - stimeout.tv_sec) * 1000000); 39525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 39625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ready = select(fd + 1, &input_set, NULL, NULL, &stimeout); 39725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 39825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# ifdef WIN32 39925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (ready < 0 && WSAGetLastError() == WSAEINTR); 40025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# else 40125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (ready < 0 && (errno == EINTR || errno == EAGAIN)); 40225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# endif /* WIN32 */ 40325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_POLL */ 40425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 40525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 40625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * If we don't have any data ready, return right away... 40725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 40825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 40925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (ready <= 0) 41025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 41125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPRead: Returning NULL (timeout)"); 41225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 41325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 41425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 41525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 41625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 41725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 41825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Read the response data... 41925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 42025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 42125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addrlen = sizeof(address); 42225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 42325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((bytes = recvfrom(fd, buffer, sizeof(buffer), 0, (void *)&address, 42425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann &addrlen)) < 0) 42525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 42625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5_cupsSNMPRead: Returning NULL (%s)", strerror(errno))); 42725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 42825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 42925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 43025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 43125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 43225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Look for the response status code in the SNMP message header... 43325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 43425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 43525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_debug("DEBUG: IN ", buffer, (size_t)bytes, 0); 43625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 43725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_decode_snmp(buffer, (size_t)bytes, packet); 43825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 43925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(&(packet->address), &address, sizeof(packet->address)); 44025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 44125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 44225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return decoded data packet... 44325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 44425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 44525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPRead: Returning packet"); 44625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 44725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (packet); 44825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 44925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 45025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 45125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 45225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPSetDebug()' - Enable/disable debug logging to stderr. 45325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 45425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 45525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid 45625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPSetDebug(int level) /* I - 1 to enable debug output, 0 otherwise */ 45725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 45825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_globals_t *cg = _cupsGlobals(); /* Global data */ 45925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 46025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 46125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4_cupsSNMPSetDebug(level=%d)", level)); 46225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 46325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->snmp_debug = level; 46425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 46525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 46625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 46725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 46825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPStringToOID()' - Convert a numeric OID string to an OID array. 46925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 47025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function converts a string of the form ".N.N.N.N.N" to the 47125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * corresponding OID array terminated by -1. 47225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 47325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @code NULL@ is returned if the array is not large enough or the string is 47425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * not a valid OID number. 47525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 47625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 47725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint * /* O - Pointer to OID array or @code NULL@ on error */ 47825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPStringToOID(const char *src, /* I - OID string */ 47925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int *dst, /* I - OID array */ 48025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int dstsize)/* I - Number of integers in OID array */ 48125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 48225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int *dstptr, /* Pointer into OID array */ 48325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *dstend; /* End of OID array */ 48425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 48525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 48625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4_cupsSNMPStringToOID(src=\"%s\", dst=%p, dstsize=%d)", 48725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann src, dst, dstsize)); 48825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 48925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 49025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 49125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 49225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 49325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!src || !dst || dstsize < 2) 49425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 49525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 49625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 49725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Skip leading "."... 49825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 49925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 50025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*src == '.') 50125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann src ++; 50225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 50325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 50425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Loop to the end of the string... 50525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 50625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 50725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (dstend = dst + dstsize - 1, dstptr = dst, *dstptr = 0; 50825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *src && dstptr < dstend; 50925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann src ++) 51025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 51125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*src == '.') 51225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 51325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann dstptr ++; 51425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *dstptr = 0; 51525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 51625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (isdigit(*src & 255)) 51725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *dstptr = *dstptr * 10 + *src - '0'; 51825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 51925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 52025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 52125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 52225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*src) 52325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 52425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 52525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 52625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Terminate the end of the OID array and return... 52725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 52825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 52925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann dstptr[1] = -1; 53025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 53125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (dst); 53225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 53325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 53425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 53525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 53625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPWalk()' - Enumerate a group of OIDs. 53725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 53825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This function queries all of the OIDs with the specified OID prefix, 53925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * calling the "cb" function for every response that is received. 54025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 54125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The array pointed to by "prefix" is terminated by the value -1. 54225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 54325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * If "timeout" is negative, @code _cupsSNMPWalk@ will wait for a response 54425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * indefinitely. 54525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 54625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 54725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - Number of OIDs found or -1 on error */ 54825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPWalk(int fd, /* I - SNMP socket */ 54925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann http_addr_t *address, /* I - Address to query */ 55025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int version, /* I - SNMP version */ 55125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *community,/* I - Community name */ 55225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const int *prefix, /* I - OID prefix */ 55325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann double timeout, /* I - Timeout for each response in seconds */ 55425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_snmp_cb_t cb, /* I - Function to call for each response */ 55525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann void *data) /* I - User data pointer that is passed to the callback function */ 55625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 55725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int count = 0; /* Number of OIDs found */ 55825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned request_id = 0; /* Current request ID */ 55925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_snmp_t packet; /* Current response packet */ 56025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int lastoid[CUPS_SNMP_MAX_OID]; 56125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* Last OID we got */ 56225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 56325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 56425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 56525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 56625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 56725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 56825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4_cupsSNMPWalk(fd=%d, address=%p, version=%d, " 56925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "community=\"%s\", prefix=%p, timeout=%.1f, cb=%p, data=%p)", 57025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fd, address, version, community, prefix, timeout, cb, data)); 57125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 57225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fd < 0 || !address || version != CUPS_SNMP_VERSION_1 || !community || 57325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann !prefix || !cb) 57425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 57525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPWalk: Returning -1"); 57625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 57725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 57825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 57925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 58025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 58125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy the OID prefix and then loop until we have no more OIDs... 58225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 58325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 58425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSNMPCopyOID(packet.object_name, prefix, CUPS_SNMP_MAX_OID); 58525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann lastoid[0] = -1; 58625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 58725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (;;) 58825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 58925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann request_id ++; 59025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 59125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!_cupsSNMPWrite(fd, address, version, community, 59225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann CUPS_ASN1_GET_NEXT_REQUEST, request_id, 59325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet.object_name)) 59425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 59525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPWalk: Returning -1"); 59625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 59725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 59825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 59925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!_cupsSNMPRead(fd, &packet, timeout)) 60125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 60225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPWalk: Returning -1"); 60325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 60525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 60625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!_cupsSNMPIsOIDPrefixed(&packet, prefix) || 60825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSNMPIsOID(&packet, lastoid)) 60925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 61025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5_cupsSNMPWalk: Returning %d", count)); 61125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 61225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (count); 61325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 61425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 61525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (packet.error || packet.error_status) 61625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 61725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("5_cupsSNMPWalk: Returning %d", count > 0 ? count : -1)); 61825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 61925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (count > 0 ? count : -1); 62025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 62125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 62225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSNMPCopyOID(lastoid, packet.object_name, CUPS_SNMP_MAX_OID); 62325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 62425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count ++; 62525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 62625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*cb)(&packet, data); 62725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 62825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 62925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 63025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 63125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 63225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * '_cupsSNMPWrite()' - Send an SNMP query packet. 63325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 63425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * The array pointed to by "oid" is terminated by the value -1. 63525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 63625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 63725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannint /* O - 1 on success, 0 on error */ 63825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann_cupsSNMPWrite( 63925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int fd, /* I - SNMP socket */ 64025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann http_addr_t *address, /* I - Address to send to */ 64125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int version, /* I - SNMP version */ 64225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *community, /* I - Community name */ 64325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_asn1_t request_type, /* I - Request type */ 64425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const unsigned request_id, /* I - Request ID */ 64525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const int *oid) /* I - OID */ 64625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 64725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int i; /* Looping var */ 64825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_snmp_t packet; /* SNMP message packet */ 64925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char buffer[CUPS_SNMP_MAX_PACKET]; 65025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* SNMP message buffer */ 65125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ssize_t bytes; /* Size of message */ 65225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann http_addr_t temp; /* Copy of address */ 65325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 65425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 65525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 65625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Range check input... 65725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 65825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 65925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("4_cupsSNMPWrite(fd=%d, address=%p, version=%d, " 66025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "community=\"%s\", request_type=%d, request_id=%u, oid=%p)", 66125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fd, address, version, community, request_type, request_id, oid)); 66225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 66325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (fd < 0 || !address || version != CUPS_SNMP_VERSION_1 || !community || 66425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (request_type != CUPS_ASN1_GET_REQUEST && 66525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann request_type != CUPS_ASN1_GET_NEXT_REQUEST) || request_id < 1 || !oid) 66625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 66725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPWrite: Returning 0 (bad arguments)"); 66825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 66925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 67025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 67125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 67225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 67325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Create the SNMP message... 67425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 67525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 67625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memset(&packet, 0, sizeof(packet)); 67725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 67825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet.version = version; 67925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet.request_type = request_type; 68025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet.request_id = request_id; 68125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet.object_type = CUPS_ASN1_NULL_VALUE; 68225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 68325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(packet.community, community, sizeof(packet.community)); 68425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 68525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (i = 0; oid[i] >= 0 && i < (CUPS_SNMP_MAX_OID - 1); i ++) 68625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet.object_name[i] = oid[i]; 68725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet.object_name[i] = -1; 68825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 68925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (oid[i] >= 0) 69025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 69125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPWrite: Returning 0 (OID too big)"); 69225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 69325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = E2BIG; 69425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 69525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 69625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 69725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bytes = asn1_encode_snmp(buffer, sizeof(buffer), &packet); 69825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 69925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (bytes < 0) 70025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 70125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_puts("5_cupsSNMPWrite: Returning 0 (request too big)"); 70225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 70325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann errno = E2BIG; 70425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 70525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 70625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 70725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_debug("DEBUG: OUT ", buffer, (size_t)bytes, 0); 70825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 70925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 71025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Send the message... 71125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 71225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 71325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp = *address; 71425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 71525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _httpAddrSetPort(&temp, CUPS_SNMP_PORT); 71625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 71725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (sendto(fd, buffer, (size_t)bytes, 0, (void *)&temp, (socklen_t)httpAddrLength(&temp)) == bytes); 71825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 71925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 72025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 72125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 72225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_debug()' - Decode an ASN1-encoded message. 72325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 72425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 72525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void 72625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_debug(const char *prefix, /* I - Prefix string */ 72725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *buffer, /* I - Buffer */ 72825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t len, /* I - Length of buffer */ 72925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int indent) /* I - Indentation */ 73025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 73125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t i; /* Looping var */ 73225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend; /* End of buffer */ 73325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int integer; /* Number value */ 73425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int oid[CUPS_SNMP_MAX_OID]; /* OID value */ 73525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char string[CUPS_SNMP_MAX_STRING]; 73625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* String value */ 73725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char value_type; /* Type of value */ 73825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned value_length; /* Length of value */ 73925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_globals_t *cg = _cupsGlobals(); /* Global data */ 74025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 74125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 74225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cg->snmp_debug <= 0) 74325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return; 74425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 74525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cg->snmp_debug > 1 && indent == 0) 74625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 74725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 74825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Do a hex dump of the packet... 74925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 75025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 75125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t j; 75225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 75325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%sHex Dump (%d bytes):\n", prefix, (int)len); 75425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 75525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (i = 0; i < len; i += 16) 75625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 75725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%04x:", prefix, (unsigned)i); 75825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 75925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (j = 0; j < 16 && (i + j) < len; j ++) 76025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 76125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (j && !(j & 3)) 76225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, " %02x", buffer[i + j]); 76325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 76425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, " %02x", buffer[i + j]); 76525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 76625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 76725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (j < 16) 76825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 76925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (j && !(j & 3)) 77025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fputs(" ", stderr); 77125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 77225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fputs(" ", stderr); 77325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 77425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann j ++; 77525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 77625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 77725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fputs(" ", stderr); 77825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 77925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (j = 0; j < 16 && (i + j) < len; j ++) 78025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (buffer[i + j] < ' ' || buffer[i + j] >= 0x7f) 78125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann putc('.', stderr); 78225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 78325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann putc(buffer[i + j], stderr); 78425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 78525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann putc('\n', stderr); 78625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 78725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 78825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 78925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (indent == 0) 79025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%sMessage:\n", prefix); 79125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 79225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufend = buffer + len; 79325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 79425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (buffer < bufend) 79525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 79625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 79725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Get value type... 79825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 79925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 80025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_type = (unsigned char)asn1_get_type(&buffer, bufend); 80125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_length = asn1_get_length(&buffer, bufend); 80225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 80325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (value_type) 80425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 80525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_BOOLEAN : 80625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann integer = asn1_get_integer(&buffer, bufend, value_length); 80725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 80825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sBOOLEAN %d bytes %d\n", prefix, indent, "", 80925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_length, integer); 81025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 81125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 81225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_INTEGER : 81325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann integer = asn1_get_integer(&buffer, bufend, value_length); 81425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 81525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sINTEGER %d bytes %d\n", prefix, indent, "", 81625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_length, integer); 81725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 81825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 81925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_COUNTER : 82025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann integer = asn1_get_integer(&buffer, bufend, value_length); 82125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 82225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sCOUNTER %d bytes %u\n", prefix, indent, "", 82325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_length, (unsigned)integer); 82425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 82525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 82625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_GAUGE : 82725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann integer = asn1_get_integer(&buffer, bufend, value_length); 82825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 82925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sGAUGE %d bytes %u\n", prefix, indent, "", 83025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_length, (unsigned)integer); 83125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 83225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 83325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_TIMETICKS : 83425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann integer = asn1_get_integer(&buffer, bufend, value_length); 83525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 83625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sTIMETICKS %d bytes %u\n", prefix, indent, "", 83725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_length, (unsigned)integer); 83825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 83925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 84025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_OCTET_STRING : 84125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sOCTET STRING %d bytes \"%s\"\n", prefix, 84225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann indent, "", value_length, 84325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_get_string(&buffer, bufend, value_length, string, 84425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(string))); 84525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 84625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 84725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_HEX_STRING : 84825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_get_string(&buffer, bufend, value_length, string, 84925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(string)); 85025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sHex-STRING %d bytes", prefix, 85125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann indent, "", value_length); 85225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (i = 0; i < value_length; i ++) 85325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, " %02X", string[i] & 255); 85425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann putc('\n', stderr); 85525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 85625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 85725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_NULL_VALUE : 85825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sNULL VALUE %d bytes\n", prefix, indent, "", 85925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_length); 86025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 86125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann buffer += value_length; 86225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 86325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 86425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_OID : 86525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann integer = asn1_get_oid(&buffer, bufend, value_length, oid, 86625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann CUPS_SNMP_MAX_OID); 86725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 86825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sOID %d bytes ", prefix, indent, "", 86925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_length); 87025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (i = 0; i < (unsigned)integer; i ++) 87125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, ".%d", oid[i]); 87225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann putc('\n', stderr); 87325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 87425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 87525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_SEQUENCE : 87625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sSEQUENCE %d bytes\n", prefix, indent, "", 87725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_length); 87825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_debug(prefix, buffer, value_length, indent + 4); 87925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 88025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann buffer += value_length; 88125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 88225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 88325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_GET_NEXT_REQUEST : 88425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sGet-Next-Request-PDU %d bytes\n", prefix, 88525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann indent, "", value_length); 88625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_debug(prefix, buffer, value_length, indent + 4); 88725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 88825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann buffer += value_length; 88925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 89025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 89125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_GET_REQUEST : 89225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sGet-Request-PDU %d bytes\n", prefix, indent, "", 89325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_length); 89425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_debug(prefix, buffer, value_length, indent + 4); 89525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 89625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann buffer += value_length; 89725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 89825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 89925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_GET_RESPONSE : 90025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sGet-Response-PDU %d bytes\n", prefix, indent, 90125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "", value_length); 90225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_debug(prefix, buffer, value_length, indent + 4); 90325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 90425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann buffer += value_length; 90525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 90625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 90725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann default : 90825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann fprintf(stderr, "%s%*sUNKNOWN(%x) %d bytes\n", prefix, indent, "", 90925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value_type, value_length); 91025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 91125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann buffer += value_length; 91225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 91325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 91425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 91525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 91625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 91725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 91825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 91925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_decode_snmp()' - Decode a SNMP packet. 92025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 92125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 92225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int /* O - 0 on success, -1 on error */ 92325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_decode_snmp(unsigned char *buffer, /* I - Buffer */ 92425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t len, /* I - Size of buffer */ 92525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_snmp_t *packet) /* I - SNMP packet */ 92625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 92725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufptr, /* Pointer into the data */ 92825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufend; /* End of data */ 92925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned length; /* Length of value */ 93025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 93125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 93225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 93325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Initialize the decoding... 93425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 93525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 93625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memset(packet, 0, sizeof(cups_snmp_t)); 93725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->object_name[0] = -1; 93825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 93925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufptr = buffer; 94025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufend = buffer + len; 94125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 94225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE) 94325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("Packet does not start with SEQUENCE")); 94425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (asn1_get_length(&bufptr, bufend) == 0) 94525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("SEQUENCE uses indefinite length")); 94625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) 94725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("No version number")); 94825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if ((length = asn1_get_length(&bufptr, bufend)) == 0) 94925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("Version uses indefinite length")); 95025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if ((packet->version = asn1_get_integer(&bufptr, bufend, length)) 95125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann != CUPS_SNMP_VERSION_1) 95225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("Bad SNMP version number")); 95325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_OCTET_STRING) 95425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("No community name")); 95525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if ((length = asn1_get_length(&bufptr, bufend)) == 0) 95625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("Community name uses indefinite length")); 95725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 95825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 95925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_get_string(&bufptr, bufend, length, packet->community, 96025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(packet->community)); 96125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 96225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((packet->request_type = (cups_asn1_t)asn1_get_type(&bufptr, bufend)) 96325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann != CUPS_ASN1_GET_RESPONSE) 96425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("Packet does not contain a Get-Response-PDU")); 96525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (asn1_get_length(&bufptr, bufend) == 0) 96625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("Get-Response-PDU uses indefinite length")); 96725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) 96825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("No request-id")); 96925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if ((length = asn1_get_length(&bufptr, bufend)) == 0) 97025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("request-id uses indefinite length")); 97125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 97225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 97325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->request_id = (unsigned)asn1_get_integer(&bufptr, bufend, length); 97425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 97525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) 97625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("No error-status")); 97725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if ((length = asn1_get_length(&bufptr, bufend)) == 0) 97825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("error-status uses indefinite length")); 97925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 98025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 98125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->error_status = asn1_get_integer(&bufptr, bufend, length); 98225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 98325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) 98425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("No error-index")); 98525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if ((length = asn1_get_length(&bufptr, bufend)) == 0) 98625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("error-index uses indefinite length")); 98725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 98825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 98925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->error_index = asn1_get_integer(&bufptr, bufend, length); 99025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 99125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE) 99225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("No variable-bindings SEQUENCE")); 99325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (asn1_get_length(&bufptr, bufend) == 0) 99425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, 99525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _("variable-bindings uses indefinite length")); 99625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE) 99725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("No VarBind SEQUENCE")); 99825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (asn1_get_length(&bufptr, bufend) == 0) 99925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("VarBind uses indefinite length")); 100025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_OID) 100125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("No name OID")); 100225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if ((length = asn1_get_length(&bufptr, bufend)) == 0) 100325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("Name OID uses indefinite length")); 100425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 100525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 100625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_get_oid(&bufptr, bufend, length, packet->object_name, 100725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann CUPS_SNMP_MAX_OID); 100825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 100925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->object_type = (cups_asn1_t)asn1_get_type(&bufptr, bufend); 101025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 101125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((length = asn1_get_length(&bufptr, bufend)) == 0 && 101225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->object_type != CUPS_ASN1_NULL_VALUE && 101325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->object_type != CUPS_ASN1_OCTET_STRING) 101425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("Value uses indefinite length")); 101525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 101625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 101725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (packet->object_type) 101825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 101925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_BOOLEAN : 102025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->object_value.boolean = 102125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_get_integer(&bufptr, bufend, length); 102225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 102325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 102425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_INTEGER : 102525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->object_value.integer = 102625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_get_integer(&bufptr, bufend, length); 102725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 102825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 102925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_NULL_VALUE : 103025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 103125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 103225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_OCTET_STRING : 103325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_BIT_STRING : 103425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_HEX_STRING : 103525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->object_value.string.num_bytes = length; 103625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_get_string(&bufptr, bufend, length, 103725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (char *)packet->object_value.string.bytes, 103825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(packet->object_value.string.bytes)); 103925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 104025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 104125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_OID : 104225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_get_oid(&bufptr, bufend, length, 104325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->object_value.oid, CUPS_SNMP_MAX_OID); 104425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 104525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 104625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_COUNTER : 104725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->object_value.counter = 104825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_get_integer(&bufptr, bufend, length); 104925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 105025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 105125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_GAUGE : 105225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->object_value.gauge = 105325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (unsigned)asn1_get_integer(&bufptr, bufend, length); 105425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 105525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 105625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_TIMETICKS : 105725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->object_value.timeticks = 105825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (unsigned)asn1_get_integer(&bufptr, bufend, length); 105925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 106025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 106125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann default : 106225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann snmp_set_error(packet, _("Unsupported value type")); 106325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 106425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 106525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 106625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 106725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 106825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 106925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 107025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 107125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 107225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (packet->error ? -1 : 0); 107325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 107425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 107525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 107625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 107725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_encode_snmp()' - Encode a SNMP packet. 107825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 107925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 108025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int /* O - Length on success, -1 on error */ 108125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_encode_snmp(unsigned char *buffer, /* I - Buffer */ 108225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t bufsize, /* I - Size of buffer */ 108325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cups_snmp_t *packet) /* I - SNMP packet */ 108425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 108525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufptr; /* Pointer into buffer */ 108625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned total, /* Total length */ 108725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann msglen, /* Length of entire message */ 108825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann commlen, /* Length of community string */ 108925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann reqlen, /* Length of request */ 109025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann listlen, /* Length of variable list */ 109125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann varlen, /* Length of variable */ 109225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann namelen, /* Length of object name OID */ 109325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann valuelen; /* Length of object value */ 109425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 109525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 109625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 109725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Get the lengths of the community string, OID, and message... 109825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 109925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 110025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 110125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann namelen = asn1_size_oid(packet->object_name); 110225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 110325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (packet->object_type) 110425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 110525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_NULL_VALUE : 110625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann valuelen = 0; 110725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 110825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 110925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_BOOLEAN : 111025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann valuelen = asn1_size_integer(packet->object_value.boolean); 111125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 111225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 111325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_INTEGER : 111425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann valuelen = asn1_size_integer(packet->object_value.integer); 111525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 111625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 111725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_OCTET_STRING : 111825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann valuelen = packet->object_value.string.num_bytes; 111925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 112025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 112125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_OID : 112225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann valuelen = asn1_size_oid(packet->object_value.oid); 112325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 112425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 112525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann default : 112625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->error = "Unknown object type"; 112725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 112825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 112925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 113025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann varlen = 1 + asn1_size_length(namelen) + namelen + 113125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 1 + asn1_size_length(valuelen) + valuelen; 113225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann listlen = 1 + asn1_size_length(varlen) + varlen; 113325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann reqlen = 2 + asn1_size_integer((int)packet->request_id) + 113425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2 + asn1_size_integer(packet->error_status) + 113525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 2 + asn1_size_integer(packet->error_index) + 113625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 1 + asn1_size_length(listlen) + listlen; 113725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann commlen = (unsigned)strlen(packet->community); 113825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann msglen = 2 + asn1_size_integer(packet->version) + 113925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 1 + asn1_size_length(commlen) + commlen + 114025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 1 + asn1_size_length(reqlen) + reqlen; 114125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann total = 1 + asn1_size_length(msglen) + msglen; 114225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 114325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (total > bufsize) 114425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 114525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->error = "Message too large for buffer"; 114625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (-1); 114725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 114825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 114925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 115025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Then format the message... 115125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 115225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 115325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufptr = buffer; 115425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 115525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr++ = CUPS_ASN1_SEQUENCE; /* SNMPv1 message header */ 115625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_length(&bufptr, msglen); 115725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 115825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_integer(&bufptr, packet->version); 115925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* version */ 116025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 116125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr++ = CUPS_ASN1_OCTET_STRING; /* community */ 116225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_length(&bufptr, commlen); 116325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(bufptr, packet->community, commlen); 116425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufptr += commlen; 116525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 116625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr++ = packet->request_type; /* Get-Request-PDU/Get-Next-Request-PDU */ 116725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_length(&bufptr, reqlen); 116825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 116925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_integer(&bufptr, (int)packet->request_id); 117025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 117125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_integer(&bufptr, packet->error_status); 117225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 117325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_integer(&bufptr, packet->error_index); 117425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 117525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr++ = CUPS_ASN1_SEQUENCE; /* variable-bindings */ 117625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_length(&bufptr, listlen); 117725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 117825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr++ = CUPS_ASN1_SEQUENCE; /* variable */ 117925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_length(&bufptr, varlen); 118025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 118125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_oid(&bufptr, packet->object_name); 118225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* ObjectName */ 118325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 118425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann switch (packet->object_type) 118525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 118625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_NULL_VALUE : 118725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr++ = CUPS_ASN1_NULL_VALUE; 118825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* ObjectValue */ 118925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr++ = 0; /* Length */ 119025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 119125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 119225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_BOOLEAN : 119325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_integer(&bufptr, packet->object_value.boolean); 119425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 119525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 119625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_INTEGER : 119725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_integer(&bufptr, packet->object_value.integer); 119825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 119925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 120025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_OCTET_STRING : 120125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *bufptr++ = CUPS_ASN1_OCTET_STRING; 120225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_length(&bufptr, valuelen); 120325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(bufptr, packet->object_value.string.bytes, valuelen); 120425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann bufptr += valuelen; 120525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 120625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 120725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann case CUPS_ASN1_OID : 120825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_oid(&bufptr, packet->object_value.oid); 120925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 121025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 121125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann default : 121225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann break; 121325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 121425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 121525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((int)(bufptr - buffer)); 121625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 121725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 121825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 121925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 122025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_get_integer()' - Get an integer value. 122125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 122225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 122325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int /* O - Integer value */ 122425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_get_integer( 122525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char **buffer, /* IO - Pointer in buffer */ 122625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend, /* I - End of buffer */ 122725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned length) /* I - Length of value */ 122825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 122925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int value; /* Integer value */ 123025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 123125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 123225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (length > sizeof(int)) 123325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 123425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) += length; 123525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 123625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 123725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 123825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (value = (**buffer & 0x80) ? -1 : 0; 123925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann length > 0 && *buffer < bufend; 124025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann length --, (*buffer) ++) 124125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value = (value << 8) | **buffer; 124225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 124325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (value); 124425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 124525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 124625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 124725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 124825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_get_length()' - Get a value length. 124925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 125025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 125125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned /* O - Length */ 125225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_get_length(unsigned char **buffer, /* IO - Pointer in buffer */ 125325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend) /* I - End of buffer */ 125425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 125525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned length; /* Length */ 125625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 125725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 125825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann length = **buffer; 125925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 126025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 126125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (length & 128) 126225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 126325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int count; /* Number of bytes for length */ 126425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 126525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 126625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((count = length & 127) > sizeof(unsigned)) 126725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 126825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) += count; 126925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (0); 127025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 127125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 127225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (length = 0; 127325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count > 0 && *buffer < bufend; 127425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann count --, (*buffer) ++) 127525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann length = (length << 8) | **buffer; 127625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 127725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 127825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (length); 127925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 128025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 128125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 128225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 128325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_get_oid()' - Get an OID value. 128425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 128525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 128625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int /* O - Number of OIDs */ 128725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_get_oid( 128825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char **buffer, /* IO - Pointer in buffer */ 128925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend, /* I - End of buffer */ 129025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned length, /* I - Length of value */ 129125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int *oid, /* I - OID buffer */ 129225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int oidsize) /* I - Size of OID buffer */ 129325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 129425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *valend; /* End of value */ 129525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int *oidptr, /* Current OID */ 129625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *oidend; /* End of OID buffer */ 129725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int number; /* OID number */ 129825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 129925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 130025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann valend = *buffer + length; 130125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann oidptr = oid; 130225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann oidend = oid + oidsize - 1; 130325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 130425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (valend > bufend) 130525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann valend = bufend; 130625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 130725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann number = asn1_get_packed(buffer, bufend); 130825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 130925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (number < 80) 131025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 131125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *oidptr++ = number / 40; 131225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann number = number % 40; 131325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *oidptr++ = number; 131425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 131525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 131625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 131725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *oidptr++ = 2; 131825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann number -= 80; 131925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *oidptr++ = number; 132025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 132125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 132225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (*buffer < valend) 132325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 132425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann number = asn1_get_packed(buffer, bufend); 132525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 132625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (oidptr < oidend) 132725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *oidptr++ = number; 132825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 132925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 133025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *oidptr = -1; 133125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 133225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return ((int)(oidptr - oid)); 133325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 133425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 133525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 133625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 133725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_get_packed()' - Get a packed integer value. 133825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 133925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 134025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int /* O - Value */ 134125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_get_packed( 134225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char **buffer, /* IO - Pointer in buffer */ 134325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend) /* I - End of buffer */ 134425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 134525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int value; /* Value */ 134625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 134725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 134825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value = 0; 134925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 135025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while ((**buffer & 128) && *buffer < bufend) 135125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 135225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value = (value << 7) | (**buffer & 127); 135325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 135425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 135525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 135625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (*buffer < bufend) 135725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 135825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann value = (value << 7) | **buffer; 135925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 136025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 136125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 136225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (value); 136325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 136425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 136525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 136625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 136725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_get_string()' - Get a string value. 136825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 136925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 137025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic char * /* O - String */ 137125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_get_string( 137225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char **buffer, /* IO - Pointer in buffer */ 137325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend, /* I - End of buffer */ 137425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned length, /* I - Value length */ 137525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char *string, /* I - String buffer */ 137625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann size_t strsize) /* I - String buffer size */ 137725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 137825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (length > (unsigned)(bufend - *buffer)) 137925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann length = (unsigned)(bufend - *buffer); 138025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 138125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (length < strsize) 138225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 138325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 138425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * String is smaller than the buffer... 138525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 138625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 138725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (length > 0) 138825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(string, *buffer, length); 138925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 139025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann string[length] = '\0'; 139125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 139225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 139325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 139425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 139525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * String is larger than the buffer... 139625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 139725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 139825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(string, *buffer, strsize - 1); 139925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann string[strsize - 1] = '\0'; 140025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 140125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 140225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (length > 0) 140325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) += length; 140425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 140525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (string); 140625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 140725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 140825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 140925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 141025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_get_type()' - Get a value type. 141125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 141225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 141325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic int /* O - Type */ 141425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_get_type(unsigned char **buffer, /* IO - Pointer in buffer */ 141525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned char *bufend) /* I - End of buffer */ 141625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 141725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int type; /* Type */ 141825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 141925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 142025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann type = **buffer; 142125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 142225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 142325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((type & 31) == 31) 142425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann type = asn1_get_packed(buffer, bufend); 142525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 142625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (type); 142725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 142825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 142925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 143025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 143125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_set_integer()' - Set an integer value. 143225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 143325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 143425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void 143525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_set_integer(unsigned char **buffer,/* IO - Pointer in buffer */ 143625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int integer) /* I - Integer value */ 143725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 143825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = CUPS_ASN1_INTEGER; 143925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 144025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 144125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (integer > 0x7fffff || integer < -0x800000) 144225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 144325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = 4; 144425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 144525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)(integer >> 24); 144625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 144725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)(integer >> 16); 144825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 144925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)(integer >> 8); 145025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 145125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)integer; 145225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 145325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 145425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (integer > 0x7fff || integer < -0x8000) 145525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 145625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = 3; 145725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 145825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)(integer >> 16); 145925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 146025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)(integer >> 8); 146125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 146225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)integer; 146325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 146425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 146525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (integer > 0x7f || integer < -0x80) 146625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 146725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = 2; 146825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 146925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)(integer >> 8); 147025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 147125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)integer; 147225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 147325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 147425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 147525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 147625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = 1; 147725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 147825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)integer; 147925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 148025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 148125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 148225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 148325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 148425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 148525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_set_length()' - Set a value length. 148625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 148725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 148825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void 148925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_set_length(unsigned char **buffer, /* IO - Pointer in buffer */ 149025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned length) /* I - Length value */ 149125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 149225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (length > 255) 149325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 149425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = 0x82; /* 2-byte length */ 149525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 149625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)(length >> 8); 149725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 149825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)length; 149925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 150025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 150125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (length > 127) 150225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 150325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = 0x81; /* 1-byte length */ 150425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 150525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)length; 150625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 150725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 150825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 150925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 151025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = (unsigned char)length; /* Length */ 151125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 151225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 151325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 151425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 151525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 151625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 151725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_set_oid()' - Set an OID value. 151825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 151925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 152025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void 152125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_set_oid(unsigned char **buffer, /* IO - Pointer in buffer */ 152225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const int *oid) /* I - OID value */ 152325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 152425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = CUPS_ASN1_OID; 152525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 152625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 152725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_length(buffer, asn1_size_oid(oid)); 152825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 152925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (oid[1] < 0) 153025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 153125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_packed(buffer, oid[0] * 40); 153225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return; 153325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 153425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 153525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_packed(buffer, oid[0] * 40 + oid[1]); 153625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 153725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (oid += 2; *oid >= 0; oid ++) 153825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann asn1_set_packed(buffer, *oid); 153925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 154025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 154125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 154225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 154325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_set_packed()' - Set a packed integer value. 154425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 154525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 154625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void 154725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_set_packed(unsigned char **buffer, /* IO - Pointer in buffer */ 154825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int integer) /* I - Integer value */ 154925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 155025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (integer > 0xfffffff) 155125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 155225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = ((integer >> 28) & 0x7f) | 0x80; 155325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 155425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 155525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 155625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (integer > 0x1fffff) 155725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 155825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = ((integer >> 21) & 0x7f) | 0x80; 155925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 156025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 156125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 156225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (integer > 0x3fff) 156325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 156425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = ((integer >> 14) & 0x7f) | 0x80; 156525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 156625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 156725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 156825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (integer > 0x7f) 156925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 157025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = ((integer >> 7) & 0x7f) | 0x80; 157125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 157225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 157325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 157425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann **buffer = integer & 0x7f; 157525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (*buffer) ++; 157625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 157725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 157825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 157925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 158025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_size_integer()' - Figure out the number of bytes needed for an 158125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * integer value. 158225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 158325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 158425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned /* O - Size in bytes */ 158525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_size_integer(int integer) /* I - Integer value */ 158625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 158725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (integer > 0x7fffff || integer < -0x800000) 158825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (4); 158925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (integer > 0x7fff || integer < -0x8000) 159025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (3); 159125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (integer > 0x7f || integer < -0x80) 159225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (2); 159325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 159425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (1); 159525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 159625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 159725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 159825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 159925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_size_length()' - Figure out the number of bytes needed for a 160025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * length value. 160125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 160225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 160325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned /* O - Size in bytes */ 160425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_size_length(unsigned length) /* I - Length value */ 160525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 160625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (length > 0xff) 160725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (3); 160825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (length > 0x7f) 160925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (2); 161025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 161125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (1); 161225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 161325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 161425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 161525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 161625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_size_oid()' - Figure out the numebr of bytes needed for an 161725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * OID value. 161825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 161925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 162025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned /* O - Size in bytes */ 162125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_size_oid(const int *oid) /* I - OID value */ 162225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 162325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned length; /* Length of value */ 162425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 162525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 162625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (oid[1] < 0) 162725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (asn1_size_packed(oid[0] * 40)); 162825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 162925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (length = asn1_size_packed(oid[0] * 40 + oid[1]), oid += 2; 163025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *oid >= 0; 163125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann oid ++) 163225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann length += asn1_size_packed(*oid); 163325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 163425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (length); 163525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 163625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 163725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 163825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 163925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'asn1_size_packed()' - Figure out the number of bytes needed for a 164025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * packed integer value. 164125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 164225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 164325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic unsigned /* O - Size in bytes */ 164425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannasn1_size_packed(int integer) /* I - Integer value */ 164525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 164625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (integer > 0xfffffff) 164725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (5); 164825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (integer > 0x1fffff) 164925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (4); 165025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (integer > 0x3fff) 165125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (3); 165225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (integer > 0x7f) 165325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (2); 165425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 165525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (1); 165625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 165725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 165825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 165925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 166025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'snmp_set_error()' - Set the localized error for a packet. 166125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 166225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 166325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannstatic void 166425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannsnmp_set_error(cups_snmp_t *packet, /* I - Packet */ 166525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *message) /* I - Error message */ 166625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 166725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_globals_t *cg = _cupsGlobals(); /* Global data */ 166825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 166925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 167025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!cg->lang_default) 167125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->lang_default = cupsLangDefault(); 167225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 167325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann packet->error = _cupsLangString(cg->lang_default, message); 167425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 1675