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