-CHANGES.txt - 2006-04-07
+CHANGES.txt - 2006-04-24
------------------------
-CHANGES IN CUPS V1.2
+CHANGES IN CUPS V1.2rc3
+
+ - The cups-lpd program always did reverse lookups on the
+ client address, which could be a performance problem.
+ Added a "-n" option to disable lookups.
+ - When configured with SSL support, require encryption by
+ default when displaying the /admin location (STR #1592)
+ - The next job ID was not computed correctly if the job
+ cache file got out of sync with the spool directory
+ (STR #1582)
+ - The PNG image handling code used deprecated functions
+ from libpng (STR #1587)
+ - Added a Polish translation (STR #1584, STR #1586)
+ - More changes to the scheduler to improve battery life
+ on portable devices (STR #1583)
+ - Changed the default log level for status messages back
+ to "DEBUG" to be consistent with CUPS 1.1.x (STR #1579)
+ - The error string was not set properly when
+ cupsDoFileRequest() was given the name of a directory
+ (STR #1578)
+ - Fixed handling of job-hold-until (STR #1581)
+ - Added explicit notes to the cupsaddsmb man page
+ explaining that the driver filenames are case-sensitive
+ under UNIX and that they must be all lowercase (Windows
+ 2000) or all UPPERCASE (Windows 95/98/Me) to work (STR
+ #1568)
+ - The USB backend incorrectly split the manufacturer name
+ if it contained spaces (STR #1566)
+ - The scheduler would hang when listing PPD files for a
+ manufacturer whose name contained spaces (STR #1567)
+ - Added the SNMP backend for network printer discovery
+ (STR #1555)
+ - cupstestppd now fails PPD files with 1284DeviceId
+ instead of 1284DeviceID, and cups-driverd uses a
+ case-insensitive comparison when looking for it (STR
+ #1573)
+ - cupsDoFileRequest() and cupsDoRequest() now work
+ properly with non-blocking HTTP connections.
+ - Added Swedish translation (STR #1569)
+ - "make install" now installs the MIME files with world
+ read permissions (STR #1565)
+ - More CDSA encryption support fixes (STR #1563)
+ - Updated the default mime.types file to support printing
+ of files that do not have a locally-recognized MIME
+ media type to raw or System V queues.
+ - Updated the serial port detection code on Linux (STR
+ #1562)
+ - Added some more error checking to httpGetHostname()
+ (STR #1561)
+ - The title of some administration pages was not
+ localized (STR #1548)
+ - The edit-config.tmpl file was not generated or
+ installed for the Spanish or Japanese localizations
+ (STR #1547)
+ - The mimeDelete() function freed the types before the
+ filters, but the filters needed the type data (STR #1558)
+ - The scheduler didn't keep track of the status pipes
+ properly, leading to a bad select() for multi-file jobs
+ (STR #1559)
+ - The cupstestdsc program didn't validate the ordinal
+ page number value for %%Page: comments.
+
+
+CHANGES IN CUPS V1.2rc2
- The scheduler was not always using the string pool,
causing random crashes.
#1488)
- ppdOpen2() now converts the NickName and all UI text to
UTF-8 (STR #1475)
- - The Set Allows Users web page did not work (STR #1486)
+ - The Set Allowed Users web page did not work (STR #1486)
- When the default policy was not set or set to a non-
existing policy, the scheduler did not set the default
policy name to "default" (STR #1484)
-CREDITS.txt - 2006-02-23
+CREDITS.txt - 2006-04-17
------------------------
Few projects are completed by one person, and CUPS is no exception. We'd
Jeff Licquia - Bug fixes, beta testing, evangelism.
Jason McMullan - Original CUPS RPM distributions.
Wes Morgan - *BSD fixes.
- Ulrich Oldendorf - German locale.
+ Daniel Nylander - Swedish localization.
Giulio Orsero - Bug fixes and testing.
+ Michal Osowiecki - Polish localization.
Kurt Pfeifle - Bug fixes, beta testing, evangelism.
- Gilles QUERRET - French man pages.
Petter Reinholdtsen - HP-UX compiler stuff.
Juan Pablo González Riopedre - Spanish localization
Stuart Stevens - HP JetDirect IPP information.
serial.o: ../cups/backend.h ../cups/cups.h ../cups/ipp.h ../cups/http.h
serial.o: ../cups/md5.h ../cups/ppd.h ../cups/array.h ../cups/file.h
serial.o: ../cups/language.h ../cups/string.h ../config.h
+snmp.o: ../cups/backend.h ../cups/http-private.h ../config.h ../cups/http.h
+snmp.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
+snmp.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
+snmp.o: ../cups/string.h ../cups/array.h ../cups/file.h ieee1284.c
+snmp.o: ../cups/debug.h
socket.o: ../cups/backend.h ../cups/http-private.h ../config.h ../cups/http.h
socket.o: ../cups/md5.h ../cups/ipp-private.h ../cups/ipp.h ../cups/cups.h
socket.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h
#
-# "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $"
+# "$Id: Makefile 5429 2006-04-18 21:18:51Z mike $"
#
# Backend makefile for the Common UNIX Printing System (CUPS).
#
include ../Makedefs
RBACKENDS = ipp lpd
-UBACKENDS = parallel scsi serial socket usb
+UBACKENDS = parallel scsi serial snmp socket usb
TARGETS = betest test1284 $(RBACKENDS) $(UBACKENDS)
OBJS = betest.o ipp.o lpd.o parallel.o scsi.o \
- serial.o socket.o test1284.o usb.o
+ serial.o snmp.o socket.o test1284.o usb.o
#
$(CC) $(LDFLAGS) -o serial serial.o $(BACKLIBS) $(LIBS)
+#
+# snmp
+#
+
+snmp: snmp.o ../cups/$(LIBCUPS)
+ echo Linking $@...
+ $(CC) $(LDFLAGS) -o snmp snmp.o $(LIBS)
+
+
#
# socket
#
#
-# End of "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $".
+# End of "$Id: Makefile 5429 2006-04-18 21:18:51Z mike $".
#
/*
- * "$Id: ieee1284.c 5198 2006-02-27 21:58:43Z mike $"
+ * "$Id: ieee1284.c 5440 2006-04-19 21:36:43Z mike $"
*
* IEEE-1284 support functions for the Common UNIX Printing System (CUPS).
*
*
* Contents:
*
- * get_device_id() - Get the IEEE-1284 device ID string and corresponding
- * URI.
+ * get_device_id() - Get the IEEE-1284 device ID string and corresponding
+ * URI.
+ * get_make_model() - Get the make and model string from the device ID.
*/
/*
*/
#include <cups/debug.h>
-#ifdef __linux
-# include <sys/ioctl.h>
-# include <linux/lp.h>
-# define IOCNR_GET_DEVICE_ID 1
-# define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
-#endif /* __linux */
-#ifdef __sun
-# ifdef __sparc
-# include <sys/ecppio.h>
-# else
-# include <sys/ioccom.h>
-# include <sys/ecppsys.h>
-# endif /* __sparc */
-#endif /* __sun */
+
+/*
+ * Prototypes...
+ */
+
+static int get_make_model(const char *device_id, char *make_model,
+ int make_model_size);
/*
* corresponding URI.
*/
+#ifndef SNMP_BACKEND
+# ifdef __linux
+# include <sys/ioctl.h>
+# include <linux/lp.h>
+# define IOCNR_GET_DEVICE_ID 1
+# define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
+# endif /* __linux */
+
+# ifdef __sun
+# ifdef __sparc
+# include <sys/ecppio.h>
+# else
+# include <sys/ioccom.h>
+# include <sys/ecppsys.h>
+# endif /* __sparc */
+# endif /* __sun */
+
+
int /* O - 0 on success, -1 on failure */
get_device_id(
int fd, /* I - File descriptor */
char *attr, /* 1284 attribute */
*delim, /* 1284 delimiter */
*uriptr, /* Pointer into URI */
- *mfg, /* Manufacturer string */
- *mdl, /* Model string */
+ manufacturer[256], /* Manufacturer string */
serial_number[1024]; /* Serial number string */
+ int manulen; /* Length of manufacturer string */
#ifdef __linux
int length; /* Length of device ID info */
#endif /* __linux */
struct ecpp_device_id did; /* Device ID buffer */
#endif /* __sun && ECPPIOC_GETDEVID */
+
DEBUG_printf(("get_device_id(fd=%d, device_id=%p, device_id_size=%d, "
"make_model=%p, make_model_size=%d, scheme=\"%s\", "
"uri=%p, uri_size=%d)\n", fd, device_id, device_id_size,
if (!*device_id)
return (-1);
+ /*
+ * Get the make and model...
+ */
+
+ get_make_model(device_id, make_model, make_model_size);
+
+ /*
+ * Then generate a device URI...
+ */
+
+ if (scheme && uri && uri_size > 32)
+ {
+ /*
+ * Look for the serial number field...
+ */
+
+ if ((attr = strstr(device_id, "SERN:")) != NULL)
+ attr += 5;
+ else if ((attr = strstr(device_id, "SERIALNUMBER:")) != NULL)
+ attr += 13;
+ else if ((attr = strstr(device_id, ";SN:")) != NULL)
+ attr += 4;
+
+ if (attr)
+ {
+ strlcpy(serial_number, attr, sizeof(serial_number));
+
+ if ((delim = strchr(serial_number, ';')) != NULL)
+ *delim = '\0';
+ }
+ else
+ serial_number[0] = '\0';
+
+ /*
+ * Generate the device URI from the manufacturer, make_model, and
+ * serial number strings.
+ */
+
+ snprintf(uri, uri_size, "%s://", scheme);
+
+ if ((attr = strstr(device_id, "MANUFACTURER:")) != NULL)
+ attr += 13;
+ else if ((attr = strstr(device_id, "Manufacturer:")) != NULL)
+ attr += 13;
+ else if ((attr = strstr(device_id, "MFG:")) != NULL)
+ attr += 4;
+
+ if (attr)
+ {
+ strlcpy(manufacturer, attr, sizeof(manufacturer));
+
+ if ((delim = strchr(manufacturer, ';')) != NULL)
+ *delim = '\0';
+
+ if (!strcasecmp(manufacturer, "Hewlett-Packard"))
+ strcpy(manufacturer, "HP");
+ }
+ else
+ {
+ strlcpy(manufacturer, make_model, sizeof(manufacturer));
+
+ if ((delim = strchr(manufacturer, ' ')) != NULL)
+ *delim = '\0';
+ }
+
+ manulen = strlen(manufacturer);
+
+ for (uriptr = uri + strlen(uri), delim = manufacturer;
+ *delim && uriptr < (uri + uri_size - 3);
+ delim ++)
+ if (*delim == ' ')
+ {
+ *uriptr++ = '%';
+ *uriptr++ = '2';
+ *uriptr++ = '0';
+ }
+ else
+ *uriptr++ = *delim;
+
+ *uriptr++ = '/';
+
+ if (!strncasecmp(make_model, manufacturer, manulen))
+ {
+ delim = make_model + manulen;
+
+ while (isspace(*delim & 255))
+ delim ++;
+ }
+ else
+ delim = make_model;
+
+ for (; *delim && uriptr < (uri + uri_size - 3); delim ++)
+ if (*delim == ' ')
+ {
+ *uriptr++ = '%';
+ *uriptr++ = '2';
+ *uriptr++ = '0';
+ }
+ else
+ *uriptr++ = *delim;
+
+ if (serial_number[0])
+ {
+ /*
+ * Add the serial number to the URI...
+ */
+
+ strlcpy(uriptr, "?serial=", uri_size - (uriptr - uri));
+ strlcat(uriptr, serial_number, uri_size - (uriptr - uri));
+ }
+ else
+ *uriptr = '\0';
+ }
+
+ return (0);
+}
+#endif /* !SNMP_BACKEND */
+
+
+/*
+ * 'get_make_model()' - Get the make and model string from the device ID.
+ */
+
+int /* O - 0 on success, -1 on failure */
+get_make_model(
+ const char *device_id, /* O - 1284 device ID */
+ char *make_model, /* O - Make/model */
+ int make_model_size) /* I - Size of buffer */
+{
+ char *attr, /* 1284 attribute */
+ *delim, /* 1284 delimiter */
+ *mfg, /* Manufacturer string */
+ *mdl; /* Model string */
+
+
+ DEBUG_printf(("get_make_model(device_id=\"%s\", "
+ "make_model=%p, make_model_size=%d)\n", device_id,
+ make_model, make_model_size));
+
+ /*
+ * Range check input...
+ */
+
+ if (!device_id || !*device_id || !make_model || make_model_size < 32)
+ {
+ DEBUG_puts("get_make_model: Bad args!");
+ return (-1);
+ }
+
+ *make_model = '\0';
+
/*
* Look for the description field...
*/
if ((mfg = strstr(device_id, "MANUFACTURER:")) != NULL)
mfg += 13;
+ else if ((mfg = strstr(device_id, "Manufacturer:")) != NULL)
+ mfg += 13;
else if ((mfg = strstr(device_id, "MFG:")) != NULL)
mfg += 4;
if ((mdl = strstr(device_id, "MODEL:")) != NULL)
mdl += 6;
+ else if ((mdl = strstr(device_id, "Model:")) != NULL)
+ mdl += 6;
else if ((mdl = strstr(device_id, "MDL:")) != NULL)
mdl += 4;
- if (attr)
+ if (mdl)
{
/*
- * Use description...
+ * Build a make-model string from the manufacturer and model attributes...
*/
- if (!strncasecmp(attr, "Hewlett-Packard hp ", 19))
+ if (mfg)
{
- /*
- * Check for a common HP bug...
- */
+ if (!strncasecmp(mfg, "Hewlett-Packard", 15))
+ strlcpy(make_model, "HP", make_model_size);
+ else
+ strlcpy(make_model, mfg, make_model_size);
- strlcpy(make_model, "HP ", make_model_size);
- strlcpy(make_model + 3, attr + 19, make_model_size - 3);
- }
- else if (!strncasecmp(attr, "Hewlett-Packard ", 16))
- {
- strlcpy(make_model, "HP ", make_model_size);
- strlcpy(make_model + 3, attr + 16, make_model_size - 3);
+ if ((delim = strchr(make_model, ';')) != NULL)
+ *delim = '\0';
+
+ if (!strncasecmp(make_model, mdl, strlen(make_model)))
+ {
+ /*
+ * Just copy model string, since it has the manufacturer...
+ */
+
+ strlcpy(make_model, mdl, make_model_size);
+ }
+ else
+ {
+ /*
+ * Concatenate the make and model...
+ */
+
+ strlcat(make_model, " ", make_model_size);
+ strlcat(make_model, mdl, make_model_size);
+ }
}
else
{
- strlcpy(make_model, attr, make_model_size);
+ /*
+ * Just copy model string, since it has the manufacturer...
+ */
+
+ strlcpy(make_model, mdl, make_model_size);
}
}
- else if (mfg && mdl)
+ else if (attr)
{
/*
- * Build a make-model string from the manufacturer and model attributes...
+ * Use description...
*/
- if (!strncasecmp(mfg, "Hewlett-Packard", 15))
- strlcpy(make_model, "HP", make_model_size);
- else
- strlcpy(make_model, mfg, make_model_size);
-
- if ((delim = strchr(make_model, ';')) != NULL)
- *delim = '\0';
-
- if (!strncasecmp(make_model, mdl, strlen(make_model)))
+ if (!strncasecmp(attr, "Hewlett-Packard hp ", 19))
{
/*
- * Just copy model string, since it has the manufacturer...
+ * Check for a common HP bug...
*/
- strlcpy(make_model, mdl, make_model_size);
+ strlcpy(make_model, "HP ", make_model_size);
+ strlcpy(make_model + 3, attr + 19, make_model_size - 3);
+ }
+ else if (!strncasecmp(attr, "Hewlett-Packard ", 16))
+ {
+ strlcpy(make_model, "HP ", make_model_size);
+ strlcpy(make_model + 3, attr + 16, make_model_size - 3);
}
else
{
- /*
- * Concatenate the make and model...
- */
-
- strlcat(make_model, " ", make_model_size);
- strlcat(make_model, mdl, make_model_size);
+ strlcpy(make_model, attr, make_model_size);
}
}
else
strlcpy(make_model, "Unknown", make_model_size);
}
+ /*
+ * Strip trailing data...
+ */
+
if ((delim = strchr(make_model, ';')) != NULL)
*delim = '\0';
- if (scheme && uri && uri_size > 32)
- {
- /*
- * Look for the serial number field...
- */
-
- if ((attr = strstr(device_id, "SERN:")) != NULL)
- attr += 5;
- else if ((attr = strstr(device_id, "SERIALNUMBER:")) != NULL)
- attr += 13;
- else if ((attr = strstr(device_id, ";SN:")) != NULL)
- attr += 4;
-
- if (attr)
- {
- strlcpy(serial_number, attr, sizeof(serial_number));
+ /*
+ * Strip trailing whitespace...
+ */
- if ((delim = strchr(serial_number, ';')) != NULL)
- *delim = '\0';
- }
+ for (delim = make_model + strlen(make_model) - 1; delim >= make_model; delim --)
+ if (isspace(*delim & 255))
+ *delim = '\0';
else
- serial_number[0] = '\0';
-
- /*
- * Generate the device URI from the make_model and serial number strings.
- */
+ break;
- snprintf(uri, uri_size, "%s://", scheme);
- for (uriptr = uri + strlen(uri), delim = make_model;
- *delim && uriptr < (uri + uri_size - 1);
- delim ++)
- if (*delim == ' ')
- {
- delim ++;
- *uriptr++ = '/';
- break;
- }
- else
- *uriptr++ = *delim;
-
- for (; *delim && uriptr < (uri + uri_size - 3); delim ++)
- if (*delim == ' ')
- {
- *uriptr++ = '%';
- *uriptr++ = '2';
- *uriptr++ = '0';
- }
- else
- *uriptr++ = *delim;
-
- *uriptr = '\0';
-
- if (serial_number[0])
- {
- /*
- * Add the serial number to the URI...
- */
-
- strlcat(uri, "?serial=", uri_size);
- strlcat(uri, serial_number, uri_size);
- }
- }
+ /*
+ * Return...
+ */
- return (0);
+ if (make_model[0])
+ return (0);
+ else
+ return (-1);
}
/*
- * End of "$Id: ieee1284.c 5198 2006-02-27 21:58:43Z mike $".
+ * End of "$Id: ieee1284.c 5440 2006-04-19 21:36:43Z mike $".
*/
/*
- * "$Id: parallel.c 5241 2006-03-07 22:07:44Z mike $"
+ * "$Id: parallel.c 5387 2006-04-10 02:51:12Z mike $"
*
* Parallel port backend for the Common UNIX Printing System (CUPS).
*
strcpy(basedevice, "/dev/parallel/");
else if (!access("/dev/printers/", 0))
strcpy(basedevice, "/dev/printers/");
- else if (!access("/dev/par0", 0))
- strcpy(basedevice, "/dev/par");
else
strcpy(basedevice, "/dev/lp");
/*
- * End of "$Id: parallel.c 5241 2006-03-07 22:07:44Z mike $".
+ * End of "$Id: parallel.c 5387 2006-04-10 02:51:12Z mike $".
*/
/*
- * "$Id: serial.c 5241 2006-03-07 22:07:44Z mike $"
+ * "$Id: serial.c 5400 2006-04-14 19:04:02Z mike $"
*
* Serial port backend for the Common UNIX Printing System (CUPS).
*
# include <IOKit/IOBSD.h>
#endif /* __APPLE__ */
+#if defined(__linux) && defined(TIOCGSERIAL)
+# include <linux/serial.h>
+# include <linux/ioctl.h>
+#endif /* __linux && TIOCGSERIAL */
+
/*
* Local functions...
{
#if defined(__hpux) || defined(__sgi) || defined(__sun) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
static char *funky_hex = "0123456789abcdefghijklmnopqrstuvwxyz";
- /* Funky hex numbering used for some devices */
+ /* Funky hex numbering used for some *
+ * devices */
#endif /* __hpux || __sgi || __sun || __FreeBSD__ || __OpenBSD__ */
-#if defined(__linux) || defined(linux) || defined(__linux__)
- int i, j; /* Looping vars */
- int fd; /* File descriptor */
- char device[255]; /* Device filename */
+#ifdef __linux
+ int i, j; /* Looping vars */
+ int fd; /* File descriptor */
+ char device[255]; /* Device filename */
+# ifdef TIOCGSERIAL
+ struct serial_struct serinfo; /* serial port info */
+# endif /* TIOCGSERIAL */
for (i = 0; i < 100; i ++)
{
sprintf(device, "/dev/ttyS%d", i);
+
if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0)
{
+# ifdef TIOCGSERIAL
+ /*
+ * See if this port exists...
+ */
+
+ serinfo.reserved_char[0] = 0;
+
+ if (!ioctl(fd, TIOCGSERIAL, &serinfo))
+ {
+ if (serinfo.type == PORT_UNKNOWN)
+ {
+ /*
+ * Nope...
+ */
+
+ close(fd);
+ continue;
+ }
+ }
+# endif /* TIOCGSERIAL */
+
close(fd);
+
# if defined(_ARCH_PPC) || defined(powerpc) || defined(__powerpc)
printf("serial serial:%s?baud=230400 \"Unknown\" \"Serial Port #%d\"\n",
device, i + 1);
{
sprintf(device, "/dev/cua/%c", 'a' + i);
if (access(device, 0) == 0)
-#ifdef B115200
+# ifdef B115200
printf("serial serial:%s?baud=115200 \"Unknown\" \"Serial Port #%d\"\n",
device, i + 1);
-#else
+# else
printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n",
device, i + 1);
-#endif /* B115200 */
+# endif /* B115200 */
}
/*
CFMutableDictionaryRef classesToMatch;
io_object_t serialService;
- printf("serial serial \"Unknown\" \"Serial Printer (serial)\"\n");
kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort);
if (KERN_SUCCESS != kernResult)
CFRelease(bsdPathAsCFString);
if (result)
- printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", bsdPath,
- serialName);
+ printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n",
+ bsdPath, serialName);
}
}
}
IOObjectRelease(serialService);
}
- IOObjectRelease(serialPortIterator); /* Release the iterator. */
+ /*
+ * Release the iterator.
+ */
+
+ IOObjectRelease(serialPortIterator);
}
}
#endif
/*
- * End of "$Id: serial.c 5241 2006-03-07 22:07:44Z mike $".
+ * End of "$Id: serial.c 5400 2006-04-14 19:04:02Z mike $".
*/
--- /dev/null
+/*
+ * "$Id: snmp.c 5453 2006-04-23 12:08:18Z mike $"
+ *
+ * SNMP discovery backend for the Common UNIX Printing System (CUPS).
+ *
+ * Copyright 2006 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Easy Software Products and are protected by Federal
+ * copyright law. Distribution and use rights are outlined in the file
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged please contact Easy Software Products
+ * at:
+ *
+ * Attn: CUPS Licensing Information
+ * Easy Software Products
+ * 44141 Airport View Drive, Suite 204
+ * Hollywood, Maryland 20636 USA
+ *
+ * Voice: (301) 373-9600
+ * EMail: cups-info@cups.org
+ * WWW: http://www.cups.org
+ *
+ * This file is subject to the Apple OS-Developed Software exception.
+ *
+ * Contents:
+ *
+ * main() - Discover printers via SNMP.
+ * add_array() - Add a string to an array.
+ * add_cache() - Add a cached device...
+ * alarm_handler() - Handle alarm signals...
+ * asn1_decode_snmp() - Decode a SNMP packet.
+ * asn1_debug() - Decode an ASN1-encoded message.
+ * asn1_encode_snmp() - Encode a SNMP packet.
+ * asn1_get_integer() - Get an integer value.
+ * asn1_get_length() - Get a value length.
+ * asn1_get_oid() - Get an OID value.
+ * asn1_get_packed() - Get a packed integer value.
+ * asn1_get_string() - Get a string value.
+ * asn1_get_type() - Get a value type.
+ * asn1_set_integer() - Set an integer value.
+ * asn1_set_length() - Set a value length.
+ * asn1_set_oid() - Set an OID value.
+ * asn1_set_packed() - Set a packed integer value.
+ * asn1_size_integer() - Figure out the number of bytes needed for an
+ * integer value.
+ * asn1_size_length() - Figure out the number of bytes needed for a
+ * length value.
+ * asn1_size_oid() - Figure out the numebr of bytes needed for an
+ * OID value.
+ * asn1_size_packed() - Figure out the number of bytes needed for a
+ * packed integer value.
+ * compare_cache() - Compare two cache entries.
+ * debug_printf() - Display some debugging information.
+ * fix_make_model() - Fix common problems in the make-and-model
+ * string.
+ * free_array() - Free an array of strings.
+ * free_cache() - Free the array of cached devices.
+ * get_interface_addresses() - Get the broadcast address(es) associated
+ * with an interface.
+ * hex_debug() - Output hex debugging data...
+ * list_devices() - List all of the devices we found...
+ * open_snmp_socket() - Open the SNMP broadcast socket.
+ * password_cb() - Handle authentication requests.
+ * probe_device() - Probe a device to discover whether it is a
+ * printer.
+ * read_snmp_conf() - Read the snmp.conf file.
+ * read_snmp_response() - Read and parse a SNMP response...
+ * run_time() - Return the total running time...
+ * scan_devices() - Scan for devices using SNMP.
+ * send_snmp_query() - Send an SNMP query packet.
+ * try_connect() - Try connecting on a port...
+ * update_cache() - Update a cached device...
+ */
+
+/*
+ * Include necessary headers.
+ */
+
+#include <cups/backend.h>
+#include <cups/http-private.h>
+#include <cups/cups.h>
+#include <cups/string.h>
+#include <cups/array.h>
+#include <cups/file.h>
+#include <errno.h>
+#include <signal.h>
+
+#define SNMP_BACKEND
+#include "ieee1284.c"
+
+
+/*
+ * This backend implements SNMP printer discovery. It uses a broadcast-
+ * based approach to get SNMP response packets from potential printers
+ * and then interrogates each responder by trying to connect on port
+ * 631, 9100, and 515.
+ *
+ * The current focus is on printers with internal network cards, although
+ * the code also works with many external print servers as well. Future
+ * versions will support scanning for vendor-specific SNMP OIDs and the
+ * new PWG Port Monitor MIB and not just the Host MIB OIDs.
+ *
+ * The backend reads the snmp.conf file from the CUPS_SERVERROOT directory
+ * which can contain comments, blank lines, or any number of the following
+ * directives:
+ *
+ * Address ip-address
+ * Address @LOCAL
+ * Address @IF(name)
+ * Community name
+ * DebugLevel N
+ * HostNameLookups on
+ * HostNameLookups off
+ *
+ * The default is to use:
+ *
+ * Address @LOCAL
+ * Community public
+ * DebugLevel 0
+ * HostNameLookups off
+ *
+ * This backend is known to work with the following network printers and
+ * print servers:
+ *
+ * Axis OfficeBasic, 5400, 5600
+ * EPSON
+ * Genicom
+ * HP JetDirect
+ * Lexmark
+ * Sharp
+ * Tektronix
+ * Xerox
+ *
+ * It does not currently work with:
+ *
+ * DLink
+ * Linksys
+ * Netgear
+ * Okidata
+ *
+ * (for all of these, they do not support the Host MIB)
+ */
+
+/*
+ * Constants...
+ */
+
+#define SNMP_PORT 161 /* SNMP well-known port */
+#define SNMP_MAX_OID 64 /* Maximum number of OID numbers */
+#define SNMP_MAX_PACKET 1472 /* Maximum size of SNMP packet */
+#define SNMP_MAX_STRING 512 /* Maximum size of string */
+#define SNMP_VERSION_1 0 /* SNMPv1 */
+
+#define ASN1_END_OF_CONTENTS 0x00 /* End-of-contents */
+#define ASN1_BOOLEAN 0x01 /* BOOLEAN */
+#define ASN1_INTEGER 0x02 /* INTEGER or ENUMERATION */
+#define ASN1_BIT_STRING 0x03 /* BIT STRING */
+#define ASN1_OCTET_STRING 0x04 /* OCTET STRING */
+#define ASN1_NULL_VALUE 0x05 /* NULL VALUE */
+#define ASN1_OID 0x06 /* OBJECT IDENTIFIER */
+#define ASN1_SEQUENCE 0x30 /* SEQUENCE */
+#define ASN1_GET_REQUEST 0xa0 /* Get-Request-PDU */
+#define ASN1_GET_RESPONSE 0xa2 /* Get-Response-PDU */
+
+
+/*
+ * Types...
+ */
+
+typedef struct snmp_cache_s /**** SNMP scan cache ****/
+{
+ http_addr_t address; /* Address of device */
+ char *addrname, /* Name of device */
+ *uri, /* device-uri */
+ *id, /* device-id */
+ *make_and_model; /* device-make-and-model */
+} snmp_cache_t;
+
+typedef struct snmp_packet_s /**** SNMP packet ****/
+{
+ const char *error; /* Encode/decode error */
+ int version; /* Version number */
+ char community[SNMP_MAX_STRING];
+ /* Community name */
+ int request_type; /* Request type */
+ int request_id; /* request-id value */
+ int error_status; /* error-status value */
+ int error_index; /* error-index value */
+ int object_name[SNMP_MAX_OID];
+ /* object-name value */
+ int object_type; /* object-value type */
+ union
+ {
+ int boolean; /* Boolean value */
+ int integer; /* Integer value */
+ int oid[SNMP_MAX_OID]; /* OID value */
+ char string[SNMP_MAX_STRING];/* String value */
+ } object_value; /* object-value value */
+} snmp_packet_t;
+
+
+/*
+ * Local functions...
+ */
+
+static char *add_array(cups_array_t *a, const char *s);
+static void add_cache(http_addr_t *addr, const char *addrname,
+ const char *uri, const char *id,
+ const char *make_and_model);
+static void alarm_handler(int sig);
+static int asn1_decode_snmp(unsigned char *buffer, size_t len,
+ snmp_packet_t *packet);
+static void asn1_debug(unsigned char *buffer, size_t len,
+ int indent);
+static int asn1_encode_snmp(unsigned char *buffer, size_t len,
+ snmp_packet_t *packet);
+static int asn1_get_integer(unsigned char **buffer,
+ unsigned char *bufend,
+ int length);
+static int asn1_get_oid(unsigned char **buffer,
+ unsigned char *bufend,
+ int length, int *oid, int oidsize);
+static int asn1_get_packed(unsigned char **buffer,
+ unsigned char *bufend);
+static char *asn1_get_string(unsigned char **buffer,
+ unsigned char *bufend,
+ int length, char *string,
+ int strsize);
+static int asn1_get_length(unsigned char **buffer,
+ unsigned char *bufend);
+static int asn1_get_type(unsigned char **buffer,
+ unsigned char *bufend);
+static void asn1_set_integer(unsigned char **buffer,
+ int integer);
+static void asn1_set_length(unsigned char **buffer,
+ int length);
+static void asn1_set_oid(unsigned char **buffer,
+ const int *oid);
+static void asn1_set_packed(unsigned char **buffer,
+ int integer);
+static int asn1_size_integer(int integer);
+static int asn1_size_length(int length);
+static int asn1_size_oid(const int *oid);
+static int asn1_size_packed(int integer);
+static int compare_cache(snmp_cache_t *a, snmp_cache_t *b);
+static void debug_printf(const char *format, ...);
+static void fix_make_model(char *make_model,
+ const char *old_make_model,
+ int make_model_size);
+static void free_array(cups_array_t *a);
+static void free_cache(void);
+static http_addrlist_t *get_interface_addresses(const char *ifname);
+static void hex_debug(unsigned char *buffer, size_t len);
+static void list_devices(void);
+static int open_snmp_socket(void);
+static const char *password_cb(const char *prompt);
+static void probe_device(snmp_cache_t *device);
+static void read_snmp_conf(const char *address);
+static void read_snmp_response(int fd);
+static double run_time(void);
+static void scan_devices(int fd);
+static void send_snmp_query(int fd, http_addr_t *addr, int version,
+ const char *community,
+ const unsigned request_id,
+ const int *oid);
+static int try_connect(http_addr_t *addr, const char *addrname,
+ int port);
+static void update_cache(snmp_cache_t *device, const char *uri,
+ const char *id, const char *make_model);
+
+
+/*
+ * Local globals...
+ */
+
+static cups_array_t *Addresses = NULL;
+static cups_array_t *Communities = NULL;
+static cups_array_t *Devices = NULL;
+static int DebugLevel = 0;
+static int DeviceTypeOID[] = { 1, 3, 6, 1, 2, 1, 25, 3,
+ 2, 1, 2, 1, 0 };
+static int DeviceDescOID[] = { 1, 3, 6, 1, 2, 1, 25, 3,
+ 2, 1, 3, 1, 0 };
+static unsigned DeviceTypeRequest;
+static unsigned DeviceDescRequest;
+static int HostNameLookups = 0;
+static struct timeval StartTime;
+
+
+/*
+ * 'main()' - Discover printers via SNMP.
+ */
+
+int /* O - Exit status */
+main(int argc, /* I - Number of command-line arguments (6 or 7) */
+ char *argv[]) /* I - Command-line arguments */
+{
+ int fd; /* SNMP socket */
+
+
+ /*
+ * Check command-line options...
+ */
+
+ if (argc > 2)
+ {
+ fputs("Usage: snmp [host-or-ip-address]\n", stderr);
+ return (1);
+ }
+
+ /*
+ * Set the password callback for IPP operations...
+ */
+
+ cupsSetPasswordCB(password_cb);
+
+ /*
+ * Open the SNMP socket...
+ */
+
+ if ((fd = open_snmp_socket()) < 0)
+ return (1);
+
+ /*
+ * Read the configuration file and any cache data...
+ */
+
+ read_snmp_conf(argv[1]);
+
+ Devices = cupsArrayNew((cups_array_func_t)compare_cache, NULL);
+
+ /*
+ * Scan for devices...
+ */
+
+ scan_devices(fd);
+
+ /*
+ * Display the results...
+ */
+
+ list_devices();
+
+ /*
+ * Close, free, and return with no errors...
+ */
+
+ close(fd);
+
+ free_array(Addresses);
+ free_array(Communities);
+ free_cache();
+
+ return (0);
+}
+
+
+/*
+ * 'add_array()' - Add a string to an array.
+ */
+
+static char * /* O - New string */
+add_array(cups_array_t *a, /* I - Array */
+ const char *s) /* I - String to add */
+{
+ char *dups; /* New string */
+
+
+ dups = strdup(s);
+
+ cupsArrayAdd(a, dups);
+
+ return (dups);
+}
+
+
+/*
+ * 'add_cache()' - Add a cached device...
+ */
+
+static void
+add_cache(http_addr_t *addr, /* I - Device IP address */
+ const char *addrname, /* I - IP address or name string */
+ const char *uri, /* I - Device URI */
+ const char *id, /* I - 1284 device ID */
+ const char *make_and_model) /* I - Make and model */
+{
+ snmp_cache_t *temp; /* New device entry */
+
+
+ debug_printf("DEBUG: add_cache(addr=%p, addrname=\"%s\", uri=\"%s\", "
+ "id=\"%s\", make_and_model=\"%s\")\n",
+ addr, addrname, uri, id ? id : "(null)",
+ make_and_model ? make_and_model : "(null)");
+
+ temp = calloc(1, sizeof(snmp_cache_t));
+ memcpy(&(temp->address), addr, sizeof(temp->address));
+
+ temp->addrname = strdup(addrname);
+
+ if (uri)
+ temp->uri = strdup(uri);
+
+ if (id)
+ temp->id = strdup(id);
+
+ if (make_and_model)
+ temp->make_and_model = strdup(make_and_model);
+
+ cupsArrayAdd(Devices, temp);
+}
+
+
+/*
+ * 'alarm_handler()' - Handle alarm signals...
+ */
+
+static void
+alarm_handler(int sig) /* I - Signal number */
+{
+ /*
+ * Do nothing...
+ */
+
+ (void)sig;
+
+ if (DebugLevel)
+ write(2, "DEBUG: ALARM!\n", 14);
+}
+
+
+/*
+ * 'asn1_decode_snmp()' - Decode a SNMP packet.
+ */
+
+static int /* O - 0 on success, -1 on error */
+asn1_decode_snmp(unsigned char *buffer, /* I - Buffer */
+ size_t len, /* I - Size of buffer */
+ snmp_packet_t *packet) /* I - SNMP packet */
+{
+ unsigned char *bufptr, /* Pointer into the data */
+ *bufend; /* End of data */
+ int length; /* Length of value */
+
+
+ /*
+ * Initialize the decoding...
+ */
+
+ memset(packet, 0, sizeof(snmp_packet_t));
+
+ bufptr = buffer;
+ bufend = buffer + len;
+
+ if (asn1_get_type(&bufptr, bufend) != ASN1_SEQUENCE)
+ packet->error = "Packet does not start with SEQUENCE";
+ else if (asn1_get_length(&bufptr, bufend) == 0)
+ packet->error = "SEQUENCE uses indefinite length";
+ else if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
+ packet->error = "No version number";
+ else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+ packet->error = "Version uses indefinite length";
+ else if ((packet->version = asn1_get_integer(&bufptr, bufend, length))
+ != SNMP_VERSION_1)
+ packet->error = "Bad SNMP version number";
+ else if (asn1_get_type(&bufptr, bufend) != ASN1_OCTET_STRING)
+ packet->error = "No community name";
+ else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+ packet->error = "Community name uses indefinite length";
+ else
+ {
+ asn1_get_string(&bufptr, bufend, length, packet->community,
+ sizeof(packet->community));
+
+ if ((packet->request_type = asn1_get_type(&bufptr, bufend))
+ != ASN1_GET_RESPONSE)
+ packet->error = "Packet does not contain a Get-Response-PDU";
+ else if (asn1_get_length(&bufptr, bufend) == 0)
+ packet->error = "Get-Response-PDU uses indefinite length";
+ else if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
+ packet->error = "No request-id";
+ else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+ packet->error = "request-id uses indefinite length";
+ else
+ {
+ packet->request_id = asn1_get_integer(&bufptr, bufend, length);
+
+ if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
+ packet->error = "No error-status";
+ else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+ packet->error = "error-status uses indefinite length";
+ else
+ {
+ packet->error_status = asn1_get_integer(&bufptr, bufend, length);
+
+ if (asn1_get_type(&bufptr, bufend) != ASN1_INTEGER)
+ packet->error = "No error-index";
+ else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+ packet->error = "error-index uses indefinite length";
+ else
+ {
+ packet->error_index = asn1_get_integer(&bufptr, bufend, length);
+
+ if (asn1_get_type(&bufptr, bufend) != ASN1_SEQUENCE)
+ packet->error = "No variable-bindings SEQUENCE";
+ else if (asn1_get_length(&bufptr, bufend) == 0)
+ packet->error = "variable-bindings uses indefinite length";
+ else if (asn1_get_type(&bufptr, bufend) != ASN1_SEQUENCE)
+ packet->error = "No VarBind SEQUENCE";
+ else if (asn1_get_length(&bufptr, bufend) == 0)
+ packet->error = "VarBind uses indefinite length";
+ else if (asn1_get_type(&bufptr, bufend) != ASN1_OID)
+ packet->error = "No name OID";
+ else if ((length = asn1_get_length(&bufptr, bufend)) == 0)
+ packet->error = "Name OID uses indefinite length";
+ else
+ {
+ asn1_get_oid(&bufptr, bufend, length, packet->object_name,
+ SNMP_MAX_OID);
+
+ packet->object_type = asn1_get_type(&bufptr, bufend);
+
+ if ((length = asn1_get_length(&bufptr, bufend)) == 0 &&
+ packet->object_type != ASN1_NULL_VALUE &&
+ packet->object_type != ASN1_OCTET_STRING)
+ packet->error = "Value uses indefinite length";
+ else
+ {
+ switch (packet->object_type)
+ {
+ case ASN1_BOOLEAN :
+ packet->object_value.boolean =
+ asn1_get_integer(&bufptr, bufend, length);
+ break;
+
+ case ASN1_INTEGER :
+ packet->object_value.integer =
+ asn1_get_integer(&bufptr, bufend, length);
+ break;
+
+ case ASN1_NULL_VALUE :
+ break;
+
+ case ASN1_OCTET_STRING :
+ asn1_get_string(&bufptr, bufend, length,
+ packet->object_value.string,
+ SNMP_MAX_STRING);
+ break;
+
+ case ASN1_OID :
+ asn1_get_oid(&bufptr, bufend, length,
+ packet->object_value.oid, SNMP_MAX_OID);
+ break;
+
+ default :
+ packet->error = "Unsupported value type";
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return (packet->error ? -1 : 0);
+}
+
+
+/*
+ * 'asn1_debug()' - Decode an ASN1-encoded message.
+ */
+
+static void
+asn1_debug(unsigned char *buffer, /* I - Buffer */
+ size_t len, /* I - Length of buffer */
+ int indent) /* I - Indentation */
+{
+ int i; /* Looping var */
+ unsigned char *bufend; /* End of buffer */
+ int integer; /* Number value */
+ int oid[SNMP_MAX_OID]; /* OID value */
+ char string[SNMP_MAX_STRING];/* String value */
+ unsigned char value_type; /* Type of value */
+ int value_length; /* Length of value */
+
+
+ bufend = buffer + len;
+
+ while (buffer < bufend)
+ {
+ /*
+ * Get value type...
+ */
+
+ value_type = asn1_get_type(&buffer, bufend);
+ value_length = asn1_get_length(&buffer, bufend);
+
+ switch (value_type)
+ {
+ case ASN1_BOOLEAN :
+ integer = asn1_get_integer(&buffer, bufend, value_length);
+
+ fprintf(stderr, "DEBUG: %*sBOOLEAN %d bytes %d\n", indent, "",
+ value_length, integer);
+ break;
+
+ case ASN1_INTEGER :
+ integer = asn1_get_integer(&buffer, bufend, value_length);
+
+ fprintf(stderr, "DEBUG: %*sINTEGER %d bytes %d\n", indent, "",
+ value_length, integer);
+ break;
+
+ case ASN1_OCTET_STRING :
+ fprintf(stderr, "DEBUG: %*sOCTET STRING %d bytes \"%s\"\n", indent, "",
+ value_length, asn1_get_string(&buffer, bufend,
+ value_length, string,
+ sizeof(string)));
+ break;
+
+ case ASN1_NULL_VALUE :
+ fprintf(stderr, "DEBUG: %*sNULL VALUE %d bytes\n", indent, "",
+ value_length);
+
+ buffer += value_length;
+ break;
+
+ case ASN1_OID :
+ asn1_get_oid(&buffer, bufend, value_length, oid, SNMP_MAX_OID);
+
+ fprintf(stderr, "DEBUG: %*sOID %d bytes ", indent, "",
+ value_length);
+ for (i = 0; oid[i]; i ++)
+ fprintf(stderr, ".%d", oid[i]);
+ putc('\n', stderr);
+ break;
+
+ case ASN1_SEQUENCE :
+ fprintf(stderr, "DEBUG: %*sSEQUENCE %d bytes\n", indent, "",
+ value_length);
+ asn1_debug(buffer, value_length, indent + 4);
+
+ buffer += value_length;
+ break;
+
+ case ASN1_GET_REQUEST :
+ fprintf(stderr, "DEBUG: %*sGet-Request-PDU %d bytes\n", indent, "",
+ value_length);
+ asn1_debug(buffer, value_length, indent + 4);
+
+ buffer += value_length;
+ break;
+
+ case ASN1_GET_RESPONSE :
+ fprintf(stderr, "DEBUG: %*sGet-Response-PDU %d bytes\n", indent, "",
+ value_length);
+ asn1_debug(buffer, value_length, indent + 4);
+
+ buffer += value_length;
+ break;
+
+ default :
+ fprintf(stderr, "DEBUG: %*sUNKNOWN(%x) %d bytes\n", indent, "",
+ value_type, value_length);
+
+ buffer += value_length;
+ break;
+ }
+ }
+}
+
+
+/*
+ * 'asn1_encode_snmp()' - Encode a SNMP packet.
+ */
+
+static int /* O - Length on success, -1 on error */
+asn1_encode_snmp(unsigned char *buffer, /* I - Buffer */
+ size_t bufsize, /* I - Size of buffer */
+ snmp_packet_t *packet) /* I - SNMP packet */
+{
+ unsigned char *bufptr; /* Pointer into buffer */
+ int total, /* Total length */
+ msglen, /* Length of entire message */
+ commlen, /* Length of community string */
+ reqlen, /* Length of request */
+ listlen, /* Length of variable list */
+ varlen, /* Length of variable */
+ namelen, /* Length of object name OID */
+ valuelen; /* Length of object value */
+
+
+ /*
+ * Get the lengths of the community string, OID, and message...
+ */
+
+ namelen = asn1_size_oid(packet->object_name);
+
+ switch (packet->object_type)
+ {
+ case ASN1_NULL_VALUE :
+ valuelen = 0;
+ break;
+
+ case ASN1_BOOLEAN :
+ valuelen = asn1_size_integer(packet->object_value.boolean);
+ break;
+
+ case ASN1_INTEGER :
+ valuelen = asn1_size_integer(packet->object_value.integer);
+ break;
+
+ case ASN1_OCTET_STRING :
+ valuelen = strlen(packet->object_value.string);
+ break;
+
+ case ASN1_OID :
+ valuelen = asn1_size_oid(packet->object_value.oid);
+ break;
+
+ default :
+ packet->error = "Unknown object type";
+ return (-1);
+ }
+
+ varlen = 1 + asn1_size_length(namelen) + namelen +
+ 1 + asn1_size_length(valuelen) + valuelen;
+ listlen = 1 + asn1_size_length(varlen) + varlen;
+ reqlen = 2 + asn1_size_integer(packet->request_id) +
+ 2 + asn1_size_integer(packet->error_status) +
+ 2 + asn1_size_integer(packet->error_index) +
+ 1 + asn1_size_length(listlen) + listlen;
+ commlen = strlen(packet->community);
+ msglen = 2 + asn1_size_integer(packet->version) +
+ 1 + asn1_size_length(commlen) + commlen +
+ 1 + asn1_size_length(reqlen) + reqlen;
+ total = 1 + asn1_size_length(msglen) + msglen;
+
+ if (total > bufsize)
+ {
+ packet->error = "Message too large for buffer";
+ return (-1);
+ }
+
+ /*
+ * Then format the message...
+ */
+
+ bufptr = buffer;
+
+ *bufptr++ = ASN1_SEQUENCE; /* SNMPv1 message header */
+ asn1_set_length(&bufptr, msglen);
+
+ asn1_set_integer(&bufptr, packet->version);
+ /* version */
+
+ *bufptr++ = ASN1_OCTET_STRING; /* community */
+ asn1_set_length(&bufptr, commlen);
+ memcpy(bufptr, packet->community, commlen);
+ bufptr += commlen;
+
+ *bufptr++ = packet->request_type; /* Get-Request-PDU */
+ asn1_set_length(&bufptr, reqlen);
+
+ asn1_set_integer(&bufptr, packet->request_id);
+
+ asn1_set_integer(&bufptr, packet->error_status);
+
+ asn1_set_integer(&bufptr, packet->error_index);
+
+ *bufptr++ = ASN1_SEQUENCE; /* variable-bindings */
+ asn1_set_length(&bufptr, listlen);
+
+ *bufptr++ = ASN1_SEQUENCE; /* variable */
+ asn1_set_length(&bufptr, varlen);
+
+ asn1_set_oid(&bufptr, packet->object_name);
+ /* ObjectName */
+
+ switch (packet->object_type)
+ {
+ case ASN1_NULL_VALUE :
+ *bufptr++ = ASN1_NULL_VALUE; /* ObjectValue */
+ *bufptr++ = 0; /* Length */
+ break;
+
+ case ASN1_BOOLEAN :
+ asn1_set_integer(&bufptr, packet->object_value.boolean);
+ break;
+
+ case ASN1_INTEGER :
+ asn1_set_integer(&bufptr, packet->object_value.integer);
+ break;
+
+ case ASN1_OCTET_STRING :
+ *bufptr++ = ASN1_OCTET_STRING;
+ asn1_set_length(&bufptr, valuelen);
+ memcpy(bufptr, packet->object_value.string, valuelen);
+ bufptr += valuelen;
+ break;
+
+ case ASN1_OID :
+ asn1_set_oid(&bufptr, packet->object_value.oid);
+ break;
+ }
+
+ return (bufptr - buffer);
+}
+
+
+/*
+ * 'asn1_get_integer()' - Get an integer value.
+ */
+
+static int /* O - Integer value */
+asn1_get_integer(
+ unsigned char **buffer, /* IO - Pointer in buffer */
+ unsigned char *bufend, /* I - End of buffer */
+ int length) /* I - Length of value */
+{
+ int value; /* Integer value */
+
+
+ for (value = 0;
+ length > 0 && *buffer < bufend;
+ length --, (*buffer) ++)
+ value = (value << 8) | **buffer;
+
+ return (value);
+}
+
+
+/*
+ * 'asn1_get_length()' - Get a value length.
+ */
+
+static int /* O - Length */
+asn1_get_length(unsigned char **buffer, /* IO - Pointer in buffer */
+ unsigned char *bufend) /* I - End of buffer */
+{
+ int length; /* Length */
+
+
+ length = **buffer;
+ (*buffer) ++;
+
+ if (length & 128)
+ length = asn1_get_integer(buffer, bufend, length & 127);
+
+ return (length);
+}
+
+
+/*
+ * 'asn1_get_oid()' - Get an OID value.
+ */
+
+static int /* O - Last OID number */
+asn1_get_oid(
+ unsigned char **buffer, /* IO - Pointer in buffer */
+ unsigned char *bufend, /* I - End of buffer */
+ int length, /* I - Length of value */
+ int *oid, /* I - OID buffer */
+ int oidsize) /* I - Size of OID buffer */
+{
+ unsigned char *valend; /* End of value */
+ int *oidend; /* End of OID buffer */
+ int number; /* OID number */
+
+
+ valend = *buffer + length;
+ oidend = oid + oidsize - 1;
+
+ if (valend > bufend)
+ valend = bufend;
+
+ number = asn1_get_packed(buffer, bufend);
+
+ if (number < 80)
+ {
+ *oid++ = number / 40;
+ number = number % 40;
+ *oid++ = number;
+ }
+ else
+ {
+ *oid++ = 2;
+ number -= 80;
+ *oid++ = number;
+ }
+
+ while (*buffer < valend)
+ {
+ number = asn1_get_packed(buffer, bufend);
+
+ if (oid < oidend)
+ *oid++ = number;
+ }
+
+ *oid = 0;
+
+ return (number);
+}
+
+
+/*
+ * 'asn1_get_packed()' - Get a packed integer value.
+ */
+
+static int /* O - Value */
+asn1_get_packed(
+ unsigned char **buffer, /* IO - Pointer in buffer */
+ unsigned char *bufend) /* I - End of buffer */
+{
+ int value; /* Value */
+
+
+ value = 0;
+
+ while ((**buffer & 128) && *buffer < bufend)
+ {
+ value = (value << 7) | (**buffer & 127);
+ (*buffer) ++;
+ }
+
+ if (*buffer < bufend)
+ {
+ value = (value << 7) | **buffer;
+ (*buffer) ++;
+ }
+
+ return (value);
+}
+
+
+/*
+ * 'asn1_get_string()' - Get a string value.
+ */
+
+static char * /* O - String */
+asn1_get_string(
+ unsigned char **buffer, /* IO - Pointer in buffer */
+ unsigned char *bufend, /* I - End of buffer */
+ int length, /* I - Value length */
+ char *string, /* I - String buffer */
+ int strsize) /* I - String buffer size */
+{
+ if (length < strsize)
+ {
+ memcpy(string, *buffer, length);
+ string[length] = '\0';
+ }
+ else
+ {
+ memcpy(string, buffer, strsize - 1);
+ string[strsize - 1] = '\0';
+ }
+
+ (*buffer) += length;
+
+ return (string);
+}
+
+
+/*
+ * 'asn1_get_type()' - Get a value type.
+ */
+
+static int /* O - Type */
+asn1_get_type(unsigned char **buffer, /* IO - Pointer in buffer */
+ unsigned char *bufend) /* I - End of buffer */
+{
+ int type; /* Type */
+
+
+ type = **buffer;
+ (*buffer) ++;
+
+ if ((type & 31) == 31)
+ type = asn1_get_packed(buffer, bufend);
+
+ return (type);
+}
+
+
+/*
+ * 'asn1_set_integer()' - Set an integer value.
+ */
+
+static void
+asn1_set_integer(unsigned char **buffer,/* IO - Pointer in buffer */
+ int integer) /* I - Integer value */
+{
+ **buffer = ASN1_INTEGER;
+ (*buffer) ++;
+
+ if (integer > 0x7fffff || integer < -0x800000)
+ {
+ **buffer = 4;
+ (*buffer) ++;
+ **buffer = integer >> 24;
+ (*buffer) ++;
+ **buffer = integer >> 16;
+ (*buffer) ++;
+ **buffer = integer >> 8;
+ (*buffer) ++;
+ **buffer = integer;
+ (*buffer) ++;
+ }
+ else if (integer > 0x7fff || integer < -0x8000)
+ {
+ **buffer = 3;
+ (*buffer) ++;
+ **buffer = integer >> 16;
+ (*buffer) ++;
+ **buffer = integer >> 8;
+ (*buffer) ++;
+ **buffer = integer;
+ (*buffer) ++;
+ }
+ else if (integer > 0x7f || integer < -0x80)
+ {
+ **buffer = 2;
+ (*buffer) ++;
+ **buffer = integer >> 8;
+ (*buffer) ++;
+ **buffer = integer;
+ (*buffer) ++;
+ }
+ else
+ {
+ **buffer = 1;
+ (*buffer) ++;
+ **buffer = integer;
+ (*buffer) ++;
+ }
+}
+
+
+/*
+ * 'asn1_set_length()' - Set a value length.
+ */
+
+static void
+asn1_set_length(unsigned char **buffer, /* IO - Pointer in buffer */
+ int length) /* I - Length value */
+{
+ if (length > 255)
+ {
+ **buffer = 0x82; /* 2-byte length */
+ (*buffer) ++;
+ **buffer = length >> 8;
+ (*buffer) ++;
+ **buffer = length;
+ (*buffer) ++;
+ }
+ else if (length > 127)
+ {
+ **buffer = 0x81; /* 1-byte length */
+ (*buffer) ++;
+ **buffer = length;
+ (*buffer) ++;
+ }
+ else
+ {
+ **buffer = length; /* Length */
+ (*buffer) ++;
+ }
+}
+
+
+/*
+ * 'asn1_set_oid()' - Set an OID value.
+ */
+
+static void
+asn1_set_oid(unsigned char **buffer, /* IO - Pointer in buffer */
+ const int *oid) /* I - OID value */
+{
+ **buffer = ASN1_OID;
+ (*buffer) ++;
+
+ asn1_set_length(buffer, asn1_size_oid(oid));
+
+ asn1_set_packed(buffer, oid[0] * 40 + oid[1]);
+
+ for (oid += 2; *oid; oid ++)
+ asn1_set_packed(buffer, *oid);
+}
+
+
+/*
+ * 'asn1_set_packed()' - Set a packed integer value.
+ */
+
+static void
+asn1_set_packed(unsigned char **buffer, /* IO - Pointer in buffer */
+ int integer) /* I - Integer value */
+{
+ if (integer > 0xfffffff)
+ {
+ **buffer = (integer >> 14) & 0x7f;
+ (*buffer) ++;
+ }
+
+ if (integer > 0x1fffff)
+ {
+ **buffer = (integer >> 21) & 0x7f;
+ (*buffer) ++;
+ }
+
+ if (integer > 0x3fff)
+ {
+ **buffer = (integer >> 14) & 0x7f;
+ (*buffer) ++;
+ }
+
+ if (integer > 0x7f)
+ {
+ **buffer = (integer >> 7) & 0x7f;
+ (*buffer) ++;
+ }
+
+ **buffer = integer & 0x7f;
+ (*buffer) ++;
+}
+
+/*
+ * 'asn1_size_integer()' - Figure out the number of bytes needed for an
+ * integer value.
+ */
+
+static int /* O - Size in bytes */
+asn1_size_integer(int integer) /* I - Integer value */
+{
+ if (integer > 0x7fffff || integer < -0x800000)
+ return (4);
+ else if (integer > 0x7fff || integer < -0x8000)
+ return (3);
+ else if (integer > 0x7f || integer < -0x80)
+ return (2);
+ else
+ return (1);
+}
+
+
+/*
+ * 'asn1_size_length()' - Figure out the number of bytes needed for a
+ * length value.
+ */
+
+static int /* O - Size in bytes */
+asn1_size_length(int length) /* I - Length value */
+{
+ if (length > 0xff)
+ return (3);
+ else if (length > 0x7f)
+ return (2);
+ else
+ return (1);
+}
+
+
+/*
+ * 'asn1_size_oid()' - Figure out the numebr of bytes needed for an
+ * OID value.
+ */
+
+static int /* O - Size in bytes */
+asn1_size_oid(const int *oid) /* I - OID value */
+{
+ int length; /* Length of value */
+
+
+ for (length = asn1_size_packed(oid[0] * 40 + oid[1]), oid += 2; *oid; oid ++)
+ length += asn1_size_packed(*oid);
+
+ return (length);
+}
+
+
+/*
+ * 'asn1_size_packed()' - Figure out the number of bytes needed for a
+ * packed integer value.
+ */
+
+static int /* O - Size in bytes */
+asn1_size_packed(int integer) /* I - Integer value */
+{
+ if (integer > 0xfffffff)
+ return (5);
+ else if (integer > 0x1fffff)
+ return (4);
+ else if (integer > 0x3fff)
+ return (3);
+ else if (integer > 0x7f)
+ return (2);
+ else
+ return (1);
+}
+
+
+/*
+ * 'compare_cache()' - Compare two cache entries.
+ */
+
+static int /* O - Result of comparison */
+compare_cache(snmp_cache_t *a, /* I - First cache entry */
+ snmp_cache_t *b) /* I - Second cache entry */
+{
+ return (a->address.ipv4.sin_addr.s_addr - b->address.ipv4.sin_addr.s_addr);
+}
+
+
+/*
+ * 'debug_printf()' - Display some debugging information.
+ */
+
+static void
+debug_printf(const char *format, /* I - Printf-style format string */
+ ...) /* I - Additional arguments as needed */
+{
+ va_list ap; /* Pointer to arguments */
+
+
+ if (!DebugLevel)
+ return;
+
+ va_start(ap, format);
+ vfprintf(stderr, format, ap);
+ va_end(ap);
+}
+
+
+/*
+ * 'fix_make_model()' - Fix common problems in the make-and-model string.
+ */
+
+static void
+fix_make_model(
+ char *make_model, /* I - New make-and-model string */
+ const char *old_make_model, /* I - Old make-and-model string */
+ int make_model_size) /* I - Size of new string buffer */
+{
+ const char *mmptr; /* Pointer into make-and-model string */
+
+
+ /*
+ * Fix some common problems with the make-and-model string so
+ * that printer driver detection works better...
+ */
+
+ if (!strncasecmp(old_make_model, "Hewlett-Packard", 15))
+ {
+ /*
+ * Strip leading Hewlett-Packard and hp prefixes and replace
+ * with a single HP manufacturer prefix...
+ */
+
+ mmptr = old_make_model + 15;
+
+ while (isspace(*mmptr & 255))
+ mmptr ++;
+
+ if (!strncasecmp(mmptr, "hp", 2))
+ {
+ mmptr += 2;
+
+ while (isspace(*mmptr & 255))
+ mmptr ++;
+ }
+
+ make_model[0] = 'H';
+ make_model[1] = 'P';
+ make_model[2] = ' ';
+ strlcpy(make_model + 3, mmptr, make_model_size - 3);
+ }
+ else if (!strncasecmp(old_make_model, "deskjet", 7))
+ snprintf(make_model, make_model_size, "HP DeskJet%s", old_make_model + 7);
+ else if (!strncasecmp(old_make_model, "stylus_pro_", 11))
+ snprintf(make_model, make_model_size, "EPSON Stylus Pro %s",
+ old_make_model + 11);
+ else
+ strlcpy(make_model, old_make_model, make_model_size);
+
+ if ((mmptr = strstr(make_model, ", Inc.,")) != NULL)
+ {
+ /*
+ * Strip inc. from name, e.g. "Tektronix, Inc., Phaser 560"
+ * becomes "Tektronix Phaser 560"...
+ */
+
+ _cups_strcpy((char *)mmptr, mmptr + 7);
+ }
+}
+
+
+/*
+ * 'free_array()' - Free an array of strings.
+ */
+
+static void
+free_array(cups_array_t *a) /* I - Array */
+{
+ char *s; /* Current string */
+
+
+ for (s = (char *)cupsArrayFirst(a); s; s = (char *)cupsArrayNext(a))
+ free(s);
+
+ cupsArrayDelete(a);
+}
+
+
+/*
+ * 'free_cache()' - Free the array of cached devices.
+ */
+
+static void
+free_cache(void)
+{
+ snmp_cache_t *cache; /* Cached device */
+
+
+ for (cache = (snmp_cache_t *)cupsArrayFirst(Devices);
+ cache;
+ cache = (snmp_cache_t *)cupsArrayNext(Devices))
+ {
+ free(cache->addrname);
+
+ if (cache->uri)
+ free(cache->uri);
+
+ if (cache->id)
+ free(cache->id);
+
+ if (cache->make_and_model)
+ free(cache->make_and_model);
+
+ free(cache);
+ }
+
+ cupsArrayDelete(Devices);
+ Devices = NULL;
+}
+
+
+/*
+ * 'get_interface_addresses()' - Get the broadcast address(es) associated
+ * with an interface.
+ */
+
+static http_addrlist_t * /* O - List of addresses */
+get_interface_addresses(
+ const char *ifname) /* I - Interface name */
+{
+ struct ifaddrs *addrs, /* Interface address list */
+ *addr; /* Current interface address */
+ http_addrlist_t *first, /* First address in list */
+ *last, /* Last address in list */
+ *current; /* Current address */
+
+
+ if (getifaddrs(&addrs) < 0)
+ return (NULL);
+
+ for (addr = addrs, first = NULL, last = NULL; addr; addr = addr->ifa_next)
+ if ((addr->ifa_flags & IFF_BROADCAST) && addr->ifa_broadaddr &&
+ addr->ifa_broadaddr->sa_family == AF_INET &&
+ (!ifname || !strcmp(ifname, addr->ifa_name)))
+ {
+ current = calloc(1, sizeof(http_addrlist_t));
+
+ memcpy(&(current->addr), addr->ifa_broadaddr,
+ sizeof(struct sockaddr_in));
+
+ if (!last)
+ first = current;
+ else
+ last->next = current;
+
+ last = current;
+ }
+
+ freeifaddrs(addrs);
+
+ return (first);
+}
+
+
+/*
+ * 'hex_debug()' - Output hex debugging data...
+ */
+
+static void
+hex_debug(unsigned char *buffer, /* I - Buffer */
+ size_t len) /* I - Number of bytes */
+{
+ int col; /* Current column */
+
+
+ fputs("DEBUG: Hex dump of packet:\n", stderr);
+
+ for (col = 0; len > 0; col ++, buffer ++, len --)
+ {
+ if ((col & 15) == 0)
+ fprintf(stderr, "DEBUG: %04X ", col);
+
+ fprintf(stderr, " %02X", *buffer);
+
+ if ((col & 15) == 15)
+ putc('\n', stderr);
+ }
+
+ if (col & 15)
+ putc('\n', stderr);
+}
+
+
+/*
+ * 'list_devices()' - List all of the devices we found...
+ */
+
+static void
+list_devices(void)
+{
+ snmp_cache_t *cache; /* Cached device */
+
+
+ for (cache = (snmp_cache_t *)cupsArrayFirst(Devices);
+ cache;
+ cache = (snmp_cache_t *)cupsArrayNext(Devices))
+ if (cache->uri)
+ printf("network %s \"%s\" \"%s\" \"%s\"\n",
+ cache->uri,
+ cache->make_and_model ? cache->make_and_model : "Unknown",
+ cache->addrname, cache->id ? cache->id : "");
+}
+
+
+/*
+ * 'open_snmp_socket()' - Open the SNMP broadcast socket.
+ */
+
+static int /* O - SNMP socket file descriptor */
+open_snmp_socket(void)
+{
+ int fd; /* SNMP socket file descriptor */
+ int val; /* Socket option value */
+
+
+ /*
+ * Create the SNMP socket...
+ */
+
+ if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+ {
+ fprintf(stderr, "ERROR: Unable to create SNMP socket - %s\n",
+ strerror(errno));
+
+ return (-1);
+ }
+
+ /*
+ * Set the "broadcast" flag...
+ */
+
+ val = 1;
+
+ if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val)))
+ {
+ fprintf(stderr, "ERROR: Unable to set broadcast mode - %s\n",
+ strerror(errno));
+
+ close(fd);
+
+ return (-1);
+ }
+
+ return (fd);
+}
+
+
+/*
+ * 'password_cb()' - Handle authentication requests.
+ *
+ * All we do right now is return NULL, indicating that no authentication
+ * is possible.
+ */
+
+static const char * /* O - Password (NULL) */
+password_cb(const char *prompt) /* I - Prompt message */
+{
+ (void)prompt; /* Anti-compiler-warning-code */
+
+ return (NULL);
+}
+
+
+/*
+ * 'probe_device()' - Probe a device to discover whether it is a printer.
+ *
+ * TODO: Try using the Port Monitor MIB to discover the correct protocol
+ * to use - first need a commercially-available printer that supports
+ * it, though...
+ */
+
+static void
+probe_device(snmp_cache_t *device) /* I - Device */
+{
+ int i, j; /* Looping vars */
+ http_t *http; /* HTTP connection for IPP */
+ char uri[1024]; /* Full device URI */
+
+
+ /*
+ * Try connecting via IPP first...
+ */
+
+ debug_printf("DEBUG: %.3f Probing %s...\n", run_time(), device->addrname);
+
+ if ((http = httpConnect(device->addrname, 631)) != NULL)
+ {
+ /*
+ * IPP is supported...
+ */
+
+ ipp_t *request, /* IPP request */
+ *response; /* IPP response */
+ ipp_attribute_t *model, /* printer-make-and-model attribute */
+ *info, /* printer-info attribute */
+ *supported; /* printer-uri-supported attribute */
+ char make_model[256],/* Make and model string to use */
+ temp[256]; /* Temporary make/model string */
+ int num_uris; /* Number of good URIs */
+ static const char * const resources[] =
+ { /* Common resource paths for IPP */
+ "/ipp",
+ "/ipp/port2",
+ "/ipp/port3",
+ "/EPSON_IPP_Printer",
+ "/LPT1",
+ "/LPT2",
+ "/COM1",
+ "/"
+ };
+
+
+ debug_printf("DEBUG: %s supports IPP!\n", device->addrname);
+
+ /*
+ * Use non-blocking IO...
+ */
+
+ httpBlocking(http, 0);
+
+ /*
+ * Loop through a list of common resources that covers 99% of the
+ * IPP-capable printers on the market today...
+ */
+
+ for (i = 0, num_uris = 0;
+ i < (int)(sizeof(resources) / sizeof(resources[0]));
+ i ++)
+ {
+ /*
+ * Don't look past /ipp if we have found a working URI...
+ */
+
+ if (num_uris > 0 && strncmp(resources[i], "/ipp", 4))
+ break;
+
+ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL,
+ device->addrname, 631, resources[i]);
+
+ debug_printf("DEBUG: Trying %s (num_uris=%d)\n", uri, num_uris);
+
+ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES);
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
+ NULL, uri);
+
+ response = cupsDoRequest(http, request, resources[i]);
+
+ debug_printf("DEBUG: %s %s (%s)\n", uri,
+ ippErrorString(cupsLastError()), cupsLastErrorString());
+
+ if (response && response->request.status.status_code == IPP_OK)
+ {
+ model = ippFindAttribute(response, "printer-make-and-model",
+ IPP_TAG_TEXT);
+ info = ippFindAttribute(response, "printer-info", IPP_TAG_TEXT);
+ supported = ippFindAttribute(response, "printer-uri-supported",
+ IPP_TAG_URI);
+
+ if (!supported)
+ {
+ fprintf(stderr, "ERROR: Missing printer-uri-supported from %s!\n",
+ device->addrname);
+
+ httpClose(http);
+ return;
+ }
+
+ debug_printf("DEBUG: printer-info=\"%s\"\n",
+ info ? info->values[0].string.text : "(null)");
+ debug_printf("DEBUG: printer-make-and-model=\"%s\"\n",
+ model ? model->values[0].string.text : "(null)");
+
+ /*
+ * Don't advertise this port if the printer actually only supports
+ * a more generic version...
+ */
+
+ if (!strncmp(resources[i], "/ipp/", 5))
+ {
+ for (j = 0; j < supported->num_values; j ++)
+ if (strstr(supported->values[j].string.text, "/ipp/"))
+ break;
+
+ if (j >= supported->num_values)
+ {
+ ippDelete(response);
+ break;
+ }
+ }
+
+ /*
+ * Don't use the printer-info attribute if it does not contain the
+ * IEEE-1284 device ID data...
+ */
+
+ if (info &&
+ (!strchr(info->values[0].string.text, ':') ||
+ !strchr(info->values[0].string.text, ';')))
+ info = NULL;
+
+ /*
+ * If we don't have a printer-make-and-model string from the printer
+ * but do have the 1284 device ID string, generate a make-and-model
+ * string from the device ID info...
+ */
+
+ if (model)
+ strlcpy(temp, model->values[0].string.text, sizeof(temp));
+ else if (info)
+ get_make_model(info->values[0].string.text, temp, sizeof(temp));
+
+ fix_make_model(make_model, temp, sizeof(make_model));
+
+ /*
+ * Update the current device or add a new printer to the cache...
+ */
+
+ if (num_uris == 0)
+ update_cache(device, uri,
+ info ? info->values[0].string.text : NULL,
+ make_model[0] ? make_model : NULL);
+ else
+ add_cache(&(device->address), device->addrname, uri,
+ info ? info->values[0].string.text : NULL,
+ make_model[0] ? make_model : NULL);
+
+ num_uris ++;
+ }
+
+ ippDelete(response);
+
+ if (num_uris > 0 && cupsLastError() != IPP_OK)
+ break;
+ }
+
+ httpClose(http);
+
+ if (num_uris > 0)
+ return;
+ }
+
+ /*
+ * OK, now try the standard ports...
+ */
+
+ if (!try_connect(&(device->address), device->addrname, 9100))
+ {
+ debug_printf("DEBUG: %s supports AppSocket!\n", device->addrname);
+
+ snprintf(uri, sizeof(uri), "socket://%s", device->addrname);
+ update_cache(device, uri, NULL, NULL);
+ }
+ else if (!try_connect(&(device->address), device->addrname, 515))
+ {
+ debug_printf("DEBUG: %s supports LPD!\n", device->addrname);
+
+ snprintf(uri, sizeof(uri), "lpd://%s/", device->addrname);
+ update_cache(device, uri, NULL, NULL);
+ }
+}
+
+
+/*
+ * 'read_snmp_conf()' - Read the snmp.conf file.
+ */
+
+static void
+read_snmp_conf(const char *address) /* I - Single address to probe */
+{
+ cups_file_t *fp; /* File pointer */
+ char filename[1024], /* Filename */
+ line[1024], /* Line from file */
+ *value; /* Value on line */
+ int linenum; /* Line number */
+ const char *cups_serverroot; /* CUPS_SERVERROOT env var */
+ const char *debug; /* CUPS_DEBUG_LEVEL env var */
+
+
+ /*
+ * Initialize the global address and community lists...
+ */
+
+ Addresses = cupsArrayNew(NULL, NULL);
+ Communities = cupsArrayNew(NULL, NULL);
+
+ if (address)
+ add_array(Addresses, address);
+
+ if ((debug = getenv("CUPS_DEBUG_LEVEL")) != NULL)
+ DebugLevel = atoi(debug);
+
+ /*
+ * Find the snmp.conf file...
+ */
+
+ if ((cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL)
+ cups_serverroot = CUPS_SERVERROOT;
+
+ snprintf(filename, sizeof(filename), "%s/snmp.conf", cups_serverroot);
+
+ if ((fp = cupsFileOpen(filename, "r")) != NULL)
+ {
+ /*
+ * Read the snmp.conf file...
+ */
+
+ linenum = 0;
+
+ while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum))
+ {
+ if (!value)
+ fprintf(stderr, "ERROR: Missing value on line %d of %s!\n", linenum,
+ filename);
+ else if (!strcasecmp(line, "Address"))
+ {
+ if (!address)
+ add_array(Addresses, value);
+ }
+ else if (!strcasecmp(line, "Community"))
+ add_array(Communities, value);
+ else if (!strcasecmp(line, "DebugLevel"))
+ DebugLevel = atoi(value);
+ else if (!strcasecmp(line, "HostNameLookups"))
+ HostNameLookups = !strcasecmp(value, "on") ||
+ !strcasecmp(value, "yes") ||
+ !strcasecmp(value, "true") ||
+ !strcasecmp(value, "double");
+ else
+ fprintf(stderr, "ERROR: Unknown directive %s on line %d of %s!\n",
+ line, linenum, filename);
+ }
+
+ cupsFileClose(fp);
+ }
+
+ /*
+ * Use defaults if parameters are undefined...
+ */
+
+ if (cupsArrayCount(Addresses) == 0)
+ {
+ fputs("INFO: Using default SNMP Address @LOCAL\n", stderr);
+ add_array(Addresses, "@LOCAL");
+ }
+
+ if (cupsArrayCount(Communities) == 0)
+ {
+ fputs("INFO: Using default SNMP Community public\n", stderr);
+ add_array(Communities, "public");
+ }
+}
+
+
+/*
+ * 'read_snmp_response()' - Read and parse a SNMP response...
+ */
+
+static void
+read_snmp_response(int fd) /* I - SNMP socket file descriptor */
+{
+ unsigned char buffer[SNMP_MAX_PACKET];/* Data packet */
+ int bytes; /* Number of bytes received */
+ http_addr_t addr; /* Source address */
+ socklen_t addrlen; /* Source address length */
+ char addrname[256]; /* Source address name */
+ snmp_packet_t packet; /* Decoded packet */
+ snmp_cache_t key, /* Search key */
+ *device; /* Matching device */
+
+
+ /*
+ * Read the response data...
+ */
+
+ addrlen = sizeof(addr);
+
+ if ((bytes = recvfrom(fd, buffer, sizeof(buffer), 0, (void *)&addr,
+ &addrlen)) < 0)
+ {
+ fprintf(stderr, "ERROR: Unable to read data from socket: %s\n",
+ strerror(errno));
+ return;
+ }
+
+ if (HostNameLookups)
+ httpAddrLookup(&addr, addrname, sizeof(addrname));
+ else
+ httpAddrString(&addr, addrname, sizeof(addrname));
+
+ debug_printf("DEBUG: %.3f Received %d bytes from %s...\n", run_time(),
+ bytes, addrname);
+
+ /*
+ * Look for the response status code in the SNMP message header...
+ */
+
+ if (asn1_decode_snmp(buffer, bytes, &packet))
+ {
+ fprintf(stderr, "ERROR: Bad SNMP packet from %s: %s\n", addrname,
+ packet.error);
+
+ asn1_debug(buffer, bytes, 0);
+ hex_debug(buffer, bytes);
+
+ return;
+ }
+
+ debug_printf("DEBUG: community=\"%s\"\n", packet.community);
+ debug_printf("DEBUG: request-id=%d\n", packet.request_id);
+ debug_printf("DEBUG: error-status=%d\n", packet.error_status);
+
+ if (DebugLevel > 1)
+ asn1_debug(buffer, bytes, 0);
+
+ if (DebugLevel > 2)
+ hex_debug(buffer, bytes);
+
+ if (packet.error_status)
+ return;
+
+ /*
+ * Find a matching device in the cache...
+ */
+
+ key.address = addr;
+ device = (snmp_cache_t *)cupsArrayFind(Devices, &key);
+
+ /*
+ * Process the message...
+ */
+
+ if (packet.request_id == DeviceTypeRequest)
+ {
+ /*
+ * Got the device type response...
+ */
+
+ if (device)
+ {
+ debug_printf("DEBUG: Discarding duplicate device type for \"%s\"...\n",
+ addrname);
+ return;
+ }
+
+ /*
+ * Add the device and request the device description...
+ */
+
+ add_cache(&addr, addrname, NULL, NULL, NULL);
+
+ send_snmp_query(fd, &addr, SNMP_VERSION_1, packet.community,
+ DeviceDescRequest, DeviceDescOID);
+ }
+ else if (packet.request_id == DeviceDescRequest &&
+ packet.object_type == ASN1_OCTET_STRING)
+ {
+ /*
+ * Update an existing cache entry...
+ */
+
+ char make_model[256]; /* Make and model */
+
+
+ if (!device)
+ {
+ debug_printf("DEBUG: Discarding device description for \"%s\"...\n",
+ addrname);
+ return;
+ }
+
+ /*
+ * Convert the description to a make and model string...
+ */
+
+ if (strchr(packet.object_value.string, ':') &&
+ strchr(packet.object_value.string, ';'))
+ {
+ /*
+ * Description is the IEEE-1284 device ID...
+ */
+
+ get_make_model(packet.object_value.string, make_model,
+ sizeof(make_model));
+ }
+ else
+ {
+ /*
+ * Description is plain text...
+ */
+
+ fix_make_model(make_model, packet.object_value.string,
+ sizeof(make_model));
+ }
+
+ if (device->make_and_model)
+ free(device->make_and_model);
+
+ device->make_and_model = strdup(make_model);
+ }
+}
+
+
+/*
+ * 'run_time()' - Return the total running time...
+ */
+
+static double /* O - Number of seconds */
+run_time(void)
+{
+ struct timeval curtime; /* Current time */
+
+
+ gettimeofday(&curtime, NULL);
+
+ return (curtime.tv_sec - StartTime.tv_sec +
+ 0.000001 * (curtime.tv_usec - StartTime.tv_usec));
+}
+
+
+/*
+ * 'scan_devices()' - Scan for devices using SNMP.
+ */
+
+static void
+scan_devices(int fd) /* I - SNMP socket */
+{
+ char *address, /* Current address */
+ *community; /* Current community */
+ fd_set input; /* Input set for select() */
+ struct timeval timeout; /* Timeout for select() */
+ time_t endtime; /* End time for scan */
+ http_addrlist_t *addrs, /* List of addresses */
+ *addr; /* Current address */
+ snmp_cache_t *device; /* Current device */
+
+
+ /*
+ * Setup the request IDs...
+ */
+
+ gettimeofday(&StartTime, NULL);
+
+ DeviceTypeRequest = StartTime.tv_sec;
+ DeviceDescRequest = StartTime.tv_sec + 1;
+
+ /*
+ * First send all of the broadcast queries...
+ */
+
+ for (address = (char *)cupsArrayFirst(Addresses);
+ address;
+ address = (char *)cupsArrayNext(Addresses))
+ {
+ if (!strcmp(address, "@LOCAL"))
+ addrs = get_interface_addresses(NULL);
+ else if (!strncmp(address, "@IF(", 4))
+ {
+ char ifname[255]; /* Interface name */
+
+
+ strlcpy(ifname, address + 4, sizeof(ifname));
+ if (ifname[0])
+ ifname[strlen(ifname) - 1] = '\0';
+
+ addrs = get_interface_addresses(ifname);
+ }
+ else
+ addrs = httpAddrGetList(address, AF_INET, NULL);
+
+ if (!addrs)
+ {
+ fprintf(stderr, "ERROR: Unable to scan \"%s\"!\n", address);
+ continue;
+ }
+
+ for (community = (char *)cupsArrayFirst(Communities);
+ community;
+ community = (char *)cupsArrayNext(Communities))
+ {
+ debug_printf("DEBUG: Scanning for devices in \"%s\" via \"%s\"...\n",
+ community, address);
+
+ for (addr = addrs; addr; addr = addr->next)
+ send_snmp_query(fd, &(addr->addr), SNMP_VERSION_1, community,
+ DeviceTypeRequest, DeviceTypeOID);
+ }
+
+ httpAddrFreeList(addrs);
+ }
+
+ /*
+ * Then read any responses that come in over the next 3 seconds...
+ */
+
+ endtime = time(NULL) + 3;
+
+ FD_ZERO(&input);
+
+ while (time(NULL) < endtime)
+ {
+ timeout.tv_sec = 1;
+ timeout.tv_usec = 0;
+
+ FD_SET(fd, &input);
+ if (select(fd + 1, &input, NULL, NULL, &timeout) < 0)
+ {
+ fprintf(stderr, "ERROR: %.3f select() for %d failed: %s\n", run_time(),
+ fd, strerror(errno));
+ break;
+ }
+
+ if (FD_ISSET(fd, &input))
+ read_snmp_response(fd);
+ else
+ break;
+ }
+
+ /*
+ * Finally, probe all of the printers we discovered to see how they are
+ * connected...
+ */
+
+ for (device = (snmp_cache_t *)cupsArrayFirst(Devices);
+ device;
+ device = (snmp_cache_t *)cupsArrayNext(Devices))
+ if (!device->uri)
+ probe_device(device);
+
+ debug_printf("DEBUG: %.3f Scan complete!\n", run_time());
+}
+
+
+/*
+ * 'send_snmp_query()' - Send an SNMP query packet.
+ */
+
+static void
+send_snmp_query(
+ int fd, /* I - SNMP socket */
+ http_addr_t *addr, /* I - Address to send to */
+ int version, /* I - SNMP version */
+ const char *community, /* I - Community name */
+ const unsigned request_id, /* I - Request ID */
+ const int *oid) /* I - OID */
+{
+ int i; /* Looping var */
+ snmp_packet_t packet; /* SNMP message packet */
+ unsigned char buffer[SNMP_MAX_PACKET];/* SNMP message buffer */
+ int bytes; /* Size of message */
+ char addrname[32]; /* Address name */
+
+
+ /*
+ * Create the SNMP message...
+ */
+
+ memset(&packet, 0, sizeof(packet));
+
+ packet.version = version;
+ packet.request_type = ASN1_GET_REQUEST;
+ packet.request_id = request_id;
+ packet.object_type = ASN1_NULL_VALUE;
+
+ strlcpy(packet.community, community, sizeof(packet.community));
+
+ for (i = 0; oid[i]; i ++)
+ packet.object_name[i] = oid[i];
+
+ bytes = asn1_encode_snmp(buffer, sizeof(buffer), &packet);
+
+ if (bytes < 0)
+ {
+ fprintf(stderr, "ERROR: Unable to send SNMP query: %s\n", packet.error);
+ return;
+ }
+
+ /*
+ * Send the message...
+ */
+
+ debug_printf("DEBUG: %.3f Sending %d bytes to %s...\n", run_time(),
+ bytes, httpAddrString(addr, addrname, sizeof(addrname)));
+ if (DebugLevel > 1)
+ asn1_debug(buffer, bytes, 0);
+ if (DebugLevel > 2)
+ hex_debug(buffer, bytes);
+
+ addr->ipv4.sin_port = htons(SNMP_PORT);
+
+ if (sendto(fd, buffer, bytes, 0, (void *)addr, sizeof(addr->ipv4)) < bytes)
+ fprintf(stderr, "ERROR: Unable to send %d bytes to %s: %s\n",
+ bytes, addrname, strerror(errno));
+}
+
+
+/*
+ * 'try_connect()' - Try connecting on a port...
+ */
+
+static int /* O - 0 on success or -1 on error */
+try_connect(http_addr_t *addr, /* I - Socket address */
+ const char *addrname, /* I - Hostname or IP address */
+ int port) /* I - Port number */
+{
+ int fd; /* Socket */
+ int status; /* Connection status */
+
+
+ debug_printf("DEBUG: %.3f Trying %s://%s:%d...\n", run_time(),
+ port == 515 ? "lpd" : "socket", addrname, port);
+
+ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+ {
+ fprintf(stderr, "ERROR: Unable to create socket: %s\n", strerror(errno));
+ return (-1);
+ }
+
+ addr->ipv4.sin_port = htons(port);
+
+ signal(SIGALRM, alarm_handler);
+ alarm(1);
+
+ status = connect(fd, (void *)addr, httpAddrLength(addr));
+
+ close(fd);
+ alarm(0);
+
+ return (status);
+}
+
+
+/*
+ * 'update_cache()' - Update a cached device...
+ */
+
+static void
+update_cache(snmp_cache_t *device, /* I - Device */
+ const char *uri, /* I - Device URI */
+ const char *id, /* I - Device ID */
+ const char *make_model) /* I - Device make and model */
+{
+ if (device->uri)
+ free(device->uri);
+
+ device->uri = strdup(uri);
+
+ if (id)
+ {
+ if (device->id)
+ free(device->id);
+
+ device->id = strdup(id);
+ }
+
+ if (make_model)
+ {
+ if (device->make_and_model)
+ free(device->make_and_model);
+
+ device->make_and_model = strdup(make_model);
+ }
+}
+
+
+/*
+ * End of "$Id: snmp.c 5453 2006-04-23 12:08:18Z mike $".
+ */
--- /dev/null
+snmp.txt - 2006-04-19
+---------------------
+
+This file lists the "interesting" bits from the command:
+
+ snmpwalk -v 1 -c public HOST .1
+
+for many network print servers and internal cards. It is mainly here
+for SNMP documentation and development purposes.
+
+
+AXIS 5600
+
+SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM J.sp.00,JETDIRECT EX,JD28,EEPROM 6.16.5
+SNMPv2-MIB::sysName.0 = STRING:
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceType.3 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: Hewlett-Packard hp LaserJet 3380
+HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: Axis AXIS 5600
+HOST-RESOURCES-MIB::hrDeviceDescr.3 = STRING: Axis AXIS 5600
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.2 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.3 = OID: SNMPv2-SMI::zeroDotZero
+SNMPv2-SMI::enterprises.11.2.4.3.10.8.0 = STRING: "AXIS433AE8"
+SNMPv2-SMI::enterprises.368.2.3.2.601.0 = INTEGER: 9100
+SNMPv2-SMI::enterprises.368.2.3.2.602.0 = INTEGER: 9101
+SNMPv2-SMI::enterprises.368.2.3.2.603.0 = INTEGER: 9102
+SNMPv2-SMI::enterprises.368.2.3.10.901.0 = STRING: "AXIS433AE8"
+
+
+AXIS OfficeBasic
+
+SNMPv2-MIB::sysDescr.0 = STRING: AXIS OfficeBasic Parallel Network Print Server V6.43 Sep 4 2003
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: EPSON Stylus Photo 870
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero
+
+
+DLink DP-301P+
+
+SNMPv2-MIB::sysDescr.0 = STRING: D-Link DP-301P+ Print Server
+
+
+Genicom ML280
+
+SNMPv2-MIB::sysDescr.0 = STRING: GENICOM microLaser 280
+SNMPv2-MIB::sysName.0 = STRING: PRQ_004F75
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: MANUFACTURER:GENICOM;MODEL:microLaser 280;
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.3369.1.1.2.4
+
+
+EPSON Type-B Network Card
+
+SNMPv2-MIB::sysDescr.0 = STRING: EPSON Type-B 10Base-T/100Base-TX Print Server
+SNMPv2-MIB::sysName.0 = STRING: StylusPro7600-BB87A8
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: EPSON Stylus Pro 7600
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.1248.1.2.1.22.69.109.117.108.97.116.101.83.116.121.108.117.115.32.80.114.111.32.55.54.48.48
+SNMPv2-SMI::enterprises.11.2.3.9.1.1.7.0 = STRING: "MFG:EPSON;CMD:ESCPL2,BDC;MDL:Stylus Pro 7600;CLS:PRINTER;DES:EPSON Stylus Pro 7600;"
+SNMPv2-SMI::enterprises.1248.1.2.2.1.1.1.1.1 = STRING: "MFG:EPSON;CMD:ESCPL2,BDC;MDL:Stylus Pro 7600;CLS:PRINTER;DES:EPSON Stylus Pro 7600;"
+
+
+EPSON Wireless 802.11b Print Server
+
+SNMPv2-MIB::sysDescr.0 = STRING: EPSON Wireless LAN Print Interface compatible with an HP JETDIRECT EX
+SNMPv2-MIB::sysName.0 = STRING: EAI_0F550B
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING:
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero
+
+
+HP JetDirect EX3plus
+
+SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM D.04.03,JETDIRECT EX,JD26,EEPROM D.05.22
+SNMPv2-MIB::sysName.0 = STRING: NPID1EC0F
+
+
+HP LJ4000
+
+SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM G.05.34,JETDIRECT,JD30,EEPROM G.08.32
+SNMPv2-MIB::sysName.0 = STRING:
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: HP LaserJet 4000 Series
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.11.2.3.9.1.2.5
+
+
+HP CLJ4550
+
+SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM L.20.07,JETDIRECT,JD84,EEPROM L.21.22,CIDATE 07/06/2001
+SNMPv2-MIB::sysName.0 = STRING: NPI02FDE7
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: HP Color LaserJet 4550
+HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: Hewlett-Packard Dynamic RAM Disk
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.11.2.3.9.1.2.14
+
+
+Lexmark C522
+
+SNMPv2-MIB::sysDescr.0 = STRING: Lexmark C522 version NS.NP.N212 kernel 2.6.6 All-N-1
+SNMPv2-MIB::sysName.0 = STRING: ET0004000D0CCA
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDeviceNonVolatileMemory
+HOST-RESOURCES-MIB::hrDeviceType.3 = OID: HOST-RESOURCES-TYPES::hrDeviceProcessor
+HOST-RESOURCES-MIB::hrDeviceType.4 = OID: HOST-RESOURCES-TYPES::hrDeviceSerialPort
+HOST-RESOURCES-MIB::hrDeviceType.5 = OID: HOST-RESOURCES-TYPES::hrDeviceNetwork
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: Lexmark C522 9421TTV LS.FA.P129
+HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: Nonvolatile RAM
+HOST-RESOURCES-MIB::hrDeviceDescr.3 = STRING: IBM 750 Rev CXr
+HOST-RESOURCES-MIB::hrDeviceDescr.4 = STRING: USB Interface
+HOST-RESOURCES-MIB::hrDeviceDescr.5 = STRING: Network Interface
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.2 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.3 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.4 = OID: SNMPv2-SMI::zeroDotZero
+HOST-RESOURCES-MIB::hrDeviceID.5 = OID: SNMPv2-SMI::enterprises.641.1
+SNMPv2-SMI::enterprises.641.2.1.2.1.2.1 = STRING: "Lexmark C522"
+SNMPv2-SMI::enterprises.641.2.1.2.1.3.1 = STRING: "MANUFACTURER:Lexmark International;COMMAND SET:;MODEL:Lexmark C522"
+
+
+Linksys EPSX3
+
+SNMPv2-MIB::sysDescr.0 = STRING: ETHERNET MULTI-ENVIRONMENT.ROM, JETDIRECT EX, EEPROM 6016
+
+
+NetGear PS113
+
+SNMPv2-MIB::sysDescr.0 = STRING: A SNMP proxy agent.
+
+
+Okidata C7200
+
+SNMPv2-MIB::sysDescr.0 = STRING: OkiLAN 6200e
+SNMPv2-MIB::sysName.0 = STRING: OKI7009715
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDeviceNonVolat
+ileMemory
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: C7200
+HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: FLASH0
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.2001.1.1.1.1
+HOST-RESOURCES-MIB::hrDeviceID.2 = OID: SNMPv2-SMI::zeroDotZero
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.1 = STRING: "IEEE 1284"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.2 = STRING: "EtherTalk Phase 2"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.3 = STRING: "LPD"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.4 = STRING: "Netware Rprinter"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.5 = STRING: "Netware Bindery or NDS Pserver"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.6 = STRING: "Raw TCP Port 9100"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.7 = STRING: "FTP"
+SNMPv2-SMI::mib-2.43.14.1.1.3.1.8 = STRING: "DLC/LLC"
+SNMPv2-SMI::enterprises.2001.1.1.1.1.1.3530.0 = STRING: "C7200"
+
+
+Xerox N2025
+
+SNMPv2-MIB::sysDescr.0 = STRING: Xerox DocuPrint N2025 Network Laser Printer - 2.12-02
+SNMPv2-MIB::sysName.0 = STRING:
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDeviceParallelPort
+HOST-RESOURCES-MIB::hrDeviceType.3 = OID: HOST-RESOURCES-TYPES::hrDeviceNetwork
+HOST-RESOURCES-MIB::hrDeviceType.6 = OID: HOST-RESOURCES-TYPES::hrDeviceProcessor
+HOST-RESOURCES-MIB::hrDeviceType.7 = OID: HOST-RESOURCES-TYPES::hrDeviceOther
+HOST-RESOURCES-MIB::hrDeviceType.9 = OID: HOST-RESOURCES-TYPES::hrDeviceVolatileMemory
+HOST-RESOURCES-MIB::hrDeviceType.10 = OID: HOST-RESOURCES-TYPES::hrDeviceNonVolatileMemory
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: Xerox DocuPrint N2025 Network Laser Printer - 2.12-02
+HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: IEEE 1284 port
+HOST-RESOURCES-MIB::hrDeviceDescr.3 = STRING: Ethernet port
+HOST-RESOURCES-MIB::hrDeviceDescr.6 = STRING: Motorola Power PC
+HOST-RESOURCES-MIB::hrDeviceDescr.7 = STRING: USB Port
+HOST-RESOURCES-MIB::hrDeviceDescr.9 = STRING: RAM Memory
+HOST-RESOURCES-MIB::hrDeviceDescr.10 = STRING: ROM Memory
+HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.253.8.62.1.3.2.17.1
+
/*
- * "$Id: admin.c 5360 2006-03-30 17:02:17Z mike $"
+ * "$Id: admin.c 5425 2006-04-18 19:59:05Z mike $"
*
* Administration CGI for the Common UNIX Printing System (CUPS).
*
int modify) /* I - Modify the printer? */
{
int i; /* Looping var */
- int element; /* Element number */
- ipp_attribute_t *attr, /* Current attribute */
- *last; /* Last attribute */
+ ipp_attribute_t *attr; /* Current attribute */
ipp_t *request, /* IPP request */
*response, /* IPP response */
*oldinfo; /* Old printer information */
* Got the list of PPDs, see if the user has selected a make...
*/
- cgiSetIPPVars(response, NULL, NULL, NULL, 0);
-
- if (var == NULL)
+ if (cgiSetIPPVars(response, NULL, NULL, NULL, 0) == 0)
{
/*
- * Let the user choose a make...
+ * No PPD files with this make, try again with all makes...
*/
- for (element = 0, attr = response->attrs, last = NULL;
- attr != NULL;
- attr = attr->next)
- if (attr->name && strcmp(attr->name, "ppd-make") == 0)
- if (last == NULL ||
- strcasecmp(last->values[0].string.text,
- attr->values[0].string.text) != 0)
- {
- cgiSetArray("PPD_MAKE", element, attr->values[0].string.text);
- element ++;
- last = attr;
- }
+ ippDelete(response);
+
+ request = ippNewRequest(CUPS_GET_PPDS);
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
+ NULL, "ipp://localhost/printers/");
+
+ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD,
+ "requested-attributes", NULL, "ppd-make");
+ if ((response = cupsDoRequest(http, request, "/")) != NULL)
+ cgiSetIPPVars(response, NULL, NULL, NULL, 0);
+
+ cgiStartHTML(title);
+ cgiCopyTemplateLang("choose-make.tmpl");
+ cgiEndHTML();
+ }
+ else if (!var)
+ {
cgiStartHTML(title);
cgiCopyTemplateLang("choose-make.tmpl");
cgiEndHTML();
cgiEndHTML();
}
-
ippDelete(response);
}
else
ppdLocalize(ppd);
- cgiStartHTML("Set Printer Options");
+ cgiStartHTML(cgiText(_("Set Printer Options")));
cgiCopyTemplateLang("set-printer-options-header.tmpl");
if (ppdConflicts(ppd))
if (!in || !out)
{
cgiSetVariable("ERROR", strerror(errno));
- cgiStartHTML("Set Printer Options");
+ cgiStartHTML(cgiText(_("Set Printer Options")));
cgiCopyTemplateLang("error.tmpl");
cgiEndHTML();
* Show the current config file...
*/
- cgiStartHTML("Edit Configuration File");
+ cgiStartHTML(cgiText(_("Edit Configuration File")));
printf("<!-- \"%s\" -->\n", filename);
const char *pclass; /* Printer class name */
- cgiStartHTML(cgiText(_("Delete Class")));
+ /*
+ * Get form variables...
+ */
if (cgiGetVariable("CONFIRM") == NULL)
{
+ cgiStartHTML(cgiText(_("Delete Class")));
cgiCopyTemplateLang("class-confirm.tmpl");
cgiEndHTML();
return;
"localhost", 0, "/classes/%s", pclass);
else
{
+ cgiStartHTML(cgiText(_("Delete Class")));
cgiSetVariable("ERROR", cgiText(_("Missing form variable!")));
cgiCopyTemplateLang("error.tmpl");
cgiEndHTML();
ippDelete(cupsDoRequest(http, request, "/admin/"));
+ /*
+ * Show the results...
+ */
+
+ cgiStartHTML(cgiText(_("Delete Class")));
+
if (cupsLastError() > IPP_OK_CONFLICT)
cgiShowIPPError(_("Unable to delete class:"));
else
const char *printer; /* Printer printer name */
- cgiStartHTML(cgiText(_("Delete Printer")));
+ /*
+ * Get form variables...
+ */
if (cgiGetVariable("CONFIRM") == NULL)
{
+ cgiStartHTML(cgiText(_("Delete Printer")));
cgiCopyTemplateLang("printer-confirm.tmpl");
cgiEndHTML();
return;
"localhost", 0, "/printers/%s", printer);
else
{
+ cgiStartHTML(cgiText(_("Delete Printer")));
cgiSetVariable("ERROR", cgiText(_("Missing form variable!")));
cgiCopyTemplateLang("error.tmpl");
cgiEndHTML();
ippDelete(cupsDoRequest(http, request, "/admin/"));
+ /*
+ * Show the results...
+ */
+
+ cgiStartHTML(cgiText(_("Delete Printer")));
+
if (cupsLastError() > IPP_OK_CONFLICT)
cgiShowIPPError(_("Unable to delete printer:"));
else
/*
- * End of "$Id: admin.c 5360 2006-03-30 17:02:17Z mike $".
+ * End of "$Id: admin.c 5425 2006-04-18 19:59:05Z mike $".
*/
/*
- * "$Id: ipp-var.c 5235 2006-03-06 13:02:23Z mike $"
+ * "$Id: ipp-var.c 5425 2006-04-18 19:59:05Z mike $"
*
* CGI <-> IPP variable routines for the Common UNIX Printing System (CUPS).
*
attr = cgiSetIPPObjectVars(attr, prefix, element);
}
- fprintf(stderr, "DEBUG2: Returing %d from cgiSetIPPVars()...\n", element + 1);
+ fprintf(stderr, "DEBUG2: Returing %d from cgiSetIPPVars()...\n", element);
- return (element + 1);
+ return (element);
}
/*
- * End of "$Id: ipp-var.c 5235 2006-03-06 13:02:23Z mike $".
+ * End of "$Id: ipp-var.c 5425 2006-04-18 19:59:05Z mike $".
*/
#
-# "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $"
+# "$Id: Makefile 5412 2006-04-17 14:30:53Z mike $"
#
# Configuration file makefile for the Common UNIX Printing System (CUPS).
#
if test -r $(SERVERROOT)/$$file ; then \
$(MV) $(SERVERROOT)/$$file $(SERVERROOT)/$$file.O ; \
fi ; \
- $(INSTALL_CONFIG) $$file $(SERVERROOT) ; \
- chgrp $(CUPS_GROUP) $(SERVERROOT)/$$file || true; \
+ $(INSTALL_DATA) $$file $(SERVERROOT) ; \
done
-if test x$(PAMDIR) != x; then \
$(INSTALL_DIR) -m 755 $(BUILDROOT)$(PAMDIR); \
#
-# End of "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $".
+# End of "$Id: Makefile 5412 2006-04-17 14:30:53Z mike $".
#
#
-# "$Id: cupsd.conf.in 5114 2006-02-16 12:28:29Z mike $"
+# "$Id: cupsd.conf.in 5454 2006-04-23 21:46:38Z mike $"
#
# Sample configuration file for the Common UNIX Printing System (CUPS)
# scheduler. See "man cupsd.conf" for a complete description of this
# Restrict access to the admin pages...
<Location /admin>
+@ENCRYPTION_REQUIRED@
Order allow,deny
Allow localhost
</Location>
</Policy>
#
-# End of "$Id: cupsd.conf.in 5114 2006-02-16 12:28:29Z mike $".
+# End of "$Id: cupsd.conf.in 5454 2006-04-23 21:46:38Z mike $".
#
#
-# "$Id: mime.convs 4559 2005-08-04 18:40:13Z mike $"
+# "$Id: mime.convs 5402 2006-04-14 19:21:03Z mike $"
#
# MIME converts file for the Common UNIX Printing System (CUPS).
#
#
# Raw filter...
#
-# Uncomment the following filter and the application/octet-stream type
-# in mime.types to allow printing of arbitrary files without the -oraw
-# option.
+# Uncomment the following filter to allow printing of arbitrary files
+# without the -oraw option.
#
#application/octet-stream application/vnd.cups-raw 0 -
#
-# End of "$Id: mime.convs 4559 2005-08-04 18:40:13Z mike $".
+# End of "$Id: mime.convs 5402 2006-04-14 19:21:03Z mike $".
#
#
-# "$Id: mime.types 5375 2006-04-06 20:10:55Z mike $"
+# "$Id: mime.types 5402 2006-04-14 19:21:03Z mike $"
#
# MIME types file for the Common UNIX Printing System (CUPS).
#
application/vnd.cups-command string(0,'#CUPS-COMMAND')
application/vnd.cups-form string(0,"<CUPSFORM>")
+application/vnd.cups-pdf
application/vnd.cups-postscript
+application/vnd.cups-ppd ppd string(0,"*PPD-Adobe:")
application/vnd.cups-raster string(0,"RaSt") string(0,"tSaR")
application/vnd.cups-raw (string(0,<1B>E) + !string(2,<1B>%0B)) \
string(0,<1B>@) \
#
# Raw print file support...
#
-# Uncomment the following type and the application/octet-stream
-# filter line in mime.convs to allow raw file printing without the
-# -oraw option.
+# Comment the following type to prevent raw file printing.
#
-#application/octet-stream
+application/octet-stream
#
-# End of "$Id: mime.types 5375 2006-04-06 20:10:55Z mike $".
+# End of "$Id: mime.types 5402 2006-04-14 19:21:03Z mike $".
#
dnl Default langugages...
AC_ARG_WITH(languages, [ --with-languages set installed languages, default="es ja" ],
LANGUAGES="$withval",
- LANGUAGES="es ja")
+ LANGUAGES="es ja pl sv")
AC_SUBST(LANGUAGES)
dnl Default ConfigFilePerm
dnl
-dnl "$Id: cups-image.m4 5311 2006-03-19 13:21:42Z mike $"
+dnl "$Id: cups-image.m4 5451 2006-04-22 21:54:49Z mike $"
dnl
dnl Image library/filter stuff for the Common UNIX Printing System (CUPS).
dnl
if test x$enable_png != xno; then
AC_CHECK_HEADER(png.h,
- AC_CHECK_LIB(png, png_set_tRNS_to_alpha,
+ AC_CHECK_LIB(png, png_create_read_struct,
AC_DEFINE(HAVE_LIBPNG)
LIBPNG="-lpng -lm"))
else
AC_CHECK_HEADER(stdlib.h,AC_DEFINE(HAVE_STDLIB_H))
dnl
-dnl End of "$Id: cups-image.m4 5311 2006-03-19 13:21:42Z mike $".
+dnl End of "$Id: cups-image.m4 5451 2006-04-22 21:54:49Z mike $".
dnl
dnl
-dnl "$Id: cups-ssl.m4 5264 2006-03-10 01:10:36Z mike $"
+dnl "$Id: cups-ssl.m4 5457 2006-04-24 15:36:12Z mike $"
dnl
dnl OpenSSL/GNUTLS stuff for the Common UNIX Printing System (CUPS).
dnl
-dnl Copyright 1997-2005 by Easy Software Products, all rights reserved.
+dnl Copyright 1997-2006 by Easy Software Products, all rights reserved.
dnl
dnl These coded instructions, statements, and computer programs are the
dnl property of Easy Software Products and are protected by Federal
SSLFLAGS=""
SSLLIBS=""
+ENCRYPTION_REQUIRED=""
if test x$enable_ssl != xno; then
dnl Look for CDSA...
if test $uname = Darwin; then
AC_CHECK_HEADER(Security/SecureTransport.h,
[SSLLIBS="-framework CoreFoundation -framework Security"
+ # MacOS X doesn't (yet) come with pre-installed encryption
+ # certificates for CUPS, so don't enable encryption on
+ # /admin just yet...
+ #ENCRYPTION_REQUIRED=" Encryption Required"
AC_DEFINE(HAVE_SSL)
AC_DEFINE(HAVE_CDSASSL)])
fi
AC_CHECK_LIB(gnutls, gnutls_x509_crt_set_dn_by_oid,
[SSLLIBS="-lgnutls"
+ ENCRYPTION_REQUIRED=" Encryption Required"
AC_DEFINE(HAVE_SSL)
AC_DEFINE(HAVE_GNUTLS)])
AC_CHECK_LIB(ssl,SSL_new,
[SSLFLAGS="-DOPENSSL_DISABLE_OLD_DES_SUPPORT"
SSLLIBS="-lssl $libcrypto"
+ ENCRYPTION_REQUIRED=" Encryption Required"
AC_DEFINE(HAVE_SSL)
AC_DEFINE(HAVE_LIBSSL)],,
$libcrypto)
AC_SUBST(SSLFLAGS)
AC_SUBST(SSLLIBS)
+AC_SUBST(ENCRYPTION_REQUIRED)
EXPORT_SSLLIBS="$SSLLIBS"
AC_SUBST(EXPORT_SSLLIBS)
dnl
-dnl End of "$Id: cups-ssl.m4 5264 2006-03-10 01:10:36Z mike $".
+dnl End of "$Id: cups-ssl.m4 5457 2006-04-24 15:36:12Z mike $".
dnl
dnl
-dnl "$Id: configure.in 5377 2006-04-06 20:39:41Z mike $"
+dnl "$Id: configure.in 5413 2006-04-17 14:50:45Z mike $"
dnl
dnl Configuration script for the Common UNIX Printing System (CUPS).
dnl
sinclude(config-scripts/cups-pdf.m4)
sinclude(config-scripts/cups-scripting.m4)
+LANGFILES=""
+if test "x$LANGUAGES" != x; then
+ for lang in $LANGUAGES; do
+ LANGFILES="$LANGFILES doc/$lang/index.html"
+ LANGFILES="$LANGFILES templates/$lang/edit-config.tmpl"
+ LANGFILES="$LANGFILES templates/$lang/header.tmpl"
+ done
+fi
+
AC_OUTPUT(Makedefs packaging/cups.list init/cups.sh init/cups-lpd cups-config
conf/cupsd.conf conf/pam.std doc/index.html
- doc/es/index.html doc/ja/index.html
doc/help/standard.html man/client.conf.man
man/cups-deviced.man man/cups-driverd.man
man/cups-lpd.man man/cupsaddsmb.man man/cupsd.man
man/cupsd.conf.man man/lpoptions.man
templates/edit-config.tmpl templates/header.tmpl
- templates/es/header.tmpl templates/ja/header.tmpl)
+ $LANGFILES)
chmod +x cups-config
dnl
-dnl End of "$Id: configure.in 5377 2006-04-06 20:39:41Z mike $".
+dnl End of "$Id: configure.in 5413 2006-04-17 14:50:45Z mike $".
dnl
file.o: http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
file.o: string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
file.o: debug.h
+getifaddrs.o: http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
getputfile.o: cups.h ipp.h http.h md5.h ppd.h array.h file.h language.h
getputfile.o: string.h ../config.h debug.h
globals.o: http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
globals.o: globals.h string.h cups.h ppd.h array.h file.h language.h i18n.h
-globals.o: transcode.h
+globals.o: transcode.h debug.h
http.o: http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
http.o: string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
http.o: debug.h
request.o: globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
request.o: array.h file.h language.h i18n.h transcode.h debug.h
snprintf.o: string.h ../config.h
-string.o: debug.h string.h ../config.h globals.h cups.h ipp.h http.h md5.h
-string.o: ppd.h array.h file.h language.h i18n.h transcode.h
+string.o: array.h debug.h string.h ../config.h
tempfile.o: globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
tempfile.o: array.h file.h language.h i18n.h transcode.h debug.h
transcode.o: globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
file.32.o: file.c http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
file.32.o: file.c string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
file.32.o: file.c debug.h
+getifaddrs.32.o: getifaddrs.c http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
getputfile.32.o: getputfile.c cups.h ipp.h http.h md5.h ppd.h array.h file.h language.h
getputfile.32.o: getputfile.c string.h ../config.h debug.h
globals.32.o: globals.c http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
globals.32.o: globals.c globals.h string.h cups.h ppd.h array.h file.h language.h i18n.h
-globals.32.o: globals.c transcode.h
+globals.32.o: globals.c transcode.h debug.h
http.32.o: http.c http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
http.32.o: http.c string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
http.32.o: http.c debug.h
request.32.o: request.c globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
request.32.o: request.c array.h file.h language.h i18n.h transcode.h debug.h
snprintf.32.o: snprintf.c string.h ../config.h
-string.32.o: string.c debug.h string.h ../config.h globals.h cups.h ipp.h http.h md5.h
-string.32.o: string.c ppd.h array.h file.h language.h i18n.h transcode.h
+string.32.o: string.c array.h debug.h string.h ../config.h
tempfile.32.o: tempfile.c globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
tempfile.32.o: tempfile.c array.h file.h language.h i18n.h transcode.h debug.h
transcode.32.o: transcode.c globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
file.64.o: file.c http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
file.64.o: file.c string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
file.64.o: file.c debug.h
+getifaddrs.64.o: getifaddrs.c http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
getputfile.64.o: getputfile.c cups.h ipp.h http.h md5.h ppd.h array.h file.h language.h
getputfile.64.o: getputfile.c string.h ../config.h debug.h
globals.64.o: globals.c http-private.h ../config.h http.h md5.h ipp-private.h ipp.h
globals.64.o: globals.c globals.h string.h cups.h ppd.h array.h file.h language.h i18n.h
-globals.64.o: globals.c transcode.h
+globals.64.o: globals.c transcode.h debug.h
http.64.o: http.c http-private.h ../config.h http.h md5.h ipp-private.h ipp.h globals.h
http.64.o: http.c string.h cups.h ppd.h array.h file.h language.h i18n.h transcode.h
http.64.o: http.c debug.h
request.64.o: request.c globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
request.64.o: request.c array.h file.h language.h i18n.h transcode.h debug.h
snprintf.64.o: snprintf.c string.h ../config.h
-string.64.o: string.c debug.h string.h ../config.h globals.h cups.h ipp.h http.h md5.h
-string.64.o: string.c ppd.h array.h file.h language.h i18n.h transcode.h
+string.64.o: string.c array.h debug.h string.h ../config.h
tempfile.64.o: tempfile.c globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
tempfile.64.o: tempfile.c array.h file.h language.h i18n.h transcode.h debug.h
transcode.64.o: transcode.c globals.h string.h ../config.h cups.h ipp.h http.h md5.h ppd.h
#
-# "$Id: Makefile 5354 2006-03-29 20:55:15Z mike $"
+# "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $"
#
# API library Makefile for the Common UNIX Printing System (CUPS).
#
emit.o \
encode.o \
file.o \
+ getifaddrs.o \
getputfile.o \
globals.o \
http.o \
file.h file.c dir.h dir.c >../doc/help/api-filedir.html
mxmldoc --section "Programming" --title "PPD API" \
--intro api-ppd.shtml \
- ppd.h attr.c emit.c mark.c page.c \
+ ppd.h attr.c custom.c emit.c localize.c mark.c page.c \
ppd.c >../doc/help/api-ppd.html
mxmldoc --section "Programming" --title "HTTP and IPP APIs" \
--intro api-httpipp.shtml \
#
-# End of "$Id: Makefile 5354 2006-03-29 20:55:15Z mike $".
+# End of "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $".
#
/*
- * "$Id: custom.c 4938 2006-01-17 15:11:15Z mike $"
+ * "$Id: custom.c 5391 2006-04-14 12:26:50Z mike $"
*
* PPD custom option routines for the Common UNIX Printing System (CUPS).
*
*
* Contents:
*
+ * ppdFindCustomOption() - Find a custom option.
+ * ppdFindCustomParam() - Find a parameter for a custom option.
+ * ppdFirstCustomParam() - Return the first parameter for a custom option.
+ * ppdNextCustomParam() - Return the next parameter for a custom option.
*/
/*
/*
* 'ppdFindCustomOption()' - Find a custom option.
+ *
+ * @since CUPS 1.2@
*/
ppd_coption_t * /* O - Custom option or NULL */
/*
* 'ppdFindCustomParam()' - Find a parameter for a custom option.
+ *
+ * @since CUPS 1.2@
*/
ppd_cparam_t * /* O - Custom parameter or NULL */
/*
* 'ppdFirstCustomParam()' - Return the first parameter for a custom option.
+ *
+ * @since CUPS 1.2@
*/
ppd_cparam_t * /* O - Custom parameter or NULL */
/*
* 'ppdNextCustomParam()' - Return the next parameter for a custom option.
+ *
+ * @since CUPS 1.2@
*/
ppd_cparam_t * /* O - Custom parameter or NULL */
/*
- * End of "$Id: custom.c 4938 2006-01-17 15:11:15Z mike $".
+ * End of "$Id: custom.c 5391 2006-04-14 12:26:50Z mike $".
*/
--- /dev/null
+/*
+ * "$Id: getifaddrs.c 5428 2006-04-18 20:45:30Z mike $"
+ *
+ * Network interface functions for the Common UNIX Printing System
+ * (CUPS) scheduler.
+ *
+ * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Easy Software Products and are protected by Federal
+ * copyright law. Distribution and use rights are outlined in the file
+ * "LICENSE" which should have been included with this file. If this
+ * file is missing or damaged please contact Easy Software Products
+ * at:
+ *
+ * Attn: CUPS Licensing Information
+ * Easy Software Products
+ * 44141 Airport View Drive, Suite 204
+ * Hollywood, Maryland 20636 USA
+ *
+ * Voice: (301) 373-9600
+ * EMail: cups-info@cups.org
+ * WWW: http://www.cups.org
+ *
+ * Contents:
+ *
+ * _cups_getifaddrs() - Get a list of network interfaces on the system.
+ * _cups_freeifaddrs() - Free an interface list...
+ */
+
+/*
+ * Include necessary headers.
+ */
+
+#include "http-private.h"
+
+
+#ifndef HAVE_GETIFADDRS
+/*
+ * '_cups_getifaddrs()' - Get a list of network interfaces on the system.
+ */
+
+static int /* O - 0 on success, -1 on error */
+_cups_getifaddrs(struct ifaddrs **addrs)/* O - List of interfaces */
+{
+ int sock; /* Socket */
+ char buffer[65536], /* Buffer for address info */
+ *bufptr, /* Pointer into buffer */
+ *bufend; /* End of buffer */
+ struct ifconf conf; /* Interface configurations */
+ struct sockaddr addr; /* Address data */
+ struct ifreq *ifp; /* Interface data */
+ int ifpsize; /* Size of interface data */
+ struct ifaddrs *temp; /* Pointer to current interface */
+ struct ifreq request; /* Interface request */
+
+
+ /*
+ * Start with an empty list...
+ */
+
+ if (addrs == NULL)
+ return (-1);
+
+ *addrs = NULL;
+
+ /*
+ * Create a UDP socket to get the interface data...
+ */
+
+ memset (&addr, 0, sizeof(addr));
+ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+ return (-1);
+
+ /*
+ * Try to get the list of interfaces...
+ */
+
+ conf.ifc_len = sizeof(buffer);
+ conf.ifc_buf = buffer;
+
+ if (ioctl(sock, SIOCGIFCONF, &conf) < 0)
+ {
+ /*
+ * Couldn't get the list of interfaces...
+ */
+
+ close(sock);
+ return (-1);
+ }
+
+ /*
+ * OK, got the list of interfaces, now lets step through the
+ * buffer to pull them out...
+ */
+
+# ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+# define sockaddr_len(a) ((a)->sa_len)
+# else
+# define sockaddr_len(a) (sizeof(struct sockaddr))
+# endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
+
+ for (bufptr = buffer, bufend = buffer + conf.ifc_len;
+ bufptr < bufend;
+ bufptr += ifpsize)
+ {
+ /*
+ * Get the current interface information...
+ */
+
+ ifp = (struct ifreq *)bufptr;
+ ifpsize = sizeof(ifp->ifr_name) + sockaddr_len(&(ifp->ifr_addr));
+
+ if (ifpsize < sizeof(struct ifreq))
+ ifpsize = sizeof(struct ifreq);
+
+ memset(&request, 0, sizeof(request));
+ memcpy(request.ifr_name, ifp->ifr_name, sizeof(ifp->ifr_name));
+
+ /*
+ * Check the status of the interface...
+ */
+
+ if (ioctl(sock, SIOCGIFFLAGS, &request) < 0)
+ continue;
+
+ /*
+ * Allocate memory for a single interface record...
+ */
+
+ if ((temp = calloc(1, sizeof(struct ifaddrs))) == NULL)
+ {
+ /*
+ * Unable to allocate memory...
+ */
+
+ close(sock);
+ return (-1);
+ }
+
+ /*
+ * Add this record to the front of the list and copy the name, flags,
+ * and network address...
+ */
+
+ temp->ifa_next = *addrs;
+ *addrs = temp;
+ temp->ifa_name = strdup(ifp->ifr_name);
+ temp->ifa_flags = request.ifr_flags;
+ if ((temp->ifa_addr = calloc(1, sockaddr_len(&(ifp->ifr_addr)))) != NULL)
+ memcpy(temp->ifa_addr, &(ifp->ifr_addr), sockaddr_len(&(ifp->ifr_addr)));
+
+ /*
+ * Try to get the netmask for the interface...
+ */
+
+ if (!ioctl(sock, SIOCGIFNETMASK, &request))
+ {
+ /*
+ * Got it, make a copy...
+ */
+
+ if ((temp->ifa_netmask = calloc(1, sizeof(request.ifr_netmask))) != NULL)
+ memcpy(temp->ifa_netmask, &(request.ifr_netmask),
+ sizeof(request.ifr_netmask));
+ }
+
+ /*
+ * Then get the broadcast or point-to-point (destination) address,
+ * if applicable...
+ */
+
+ if (temp->ifa_flags & IFF_BROADCAST)
+ {
+ /*
+ * Have a broadcast address, so get it!
+ */
+
+ if (!ioctl(sock, SIOCGIFBRDADDR, &request))
+ {
+ /*
+ * Got it, make a copy...
+ */
+
+ if ((temp->ifa_dstaddr = calloc(1, sizeof(request.ifr_broadaddr))) != NULL)
+ memcpy(temp->ifa_dstaddr, &(request.ifr_broadaddr),
+ sizeof(request.ifr_broadaddr));
+ }
+ }
+ else if (temp->ifa_flags & IFF_POINTOPOINT)
+ {
+ /*
+ * Point-to-point interface; grab the remote address...
+ */
+
+ if (!ioctl(sock, SIOCGIFDSTADDR, &request))
+ {
+ temp->ifa_dstaddr = malloc(sizeof(request.ifr_dstaddr));
+ memcpy(temp->ifa_dstaddr, &(request.ifr_dstaddr),
+ sizeof(request.ifr_dstaddr));
+ }
+ }
+ }
+
+ /*
+ * OK, we're done with the socket, close it and return 0...
+ */
+
+ close(sock);
+
+ return (0);
+}
+
+
+/*
+ * '_cups_freeifaddrs()' - Free an interface list...
+ */
+
+static void
+_cups_freeifaddrs(struct ifaddrs *addrs)/* I - Interface list to free */
+{
+ struct ifaddrs *next; /* Next interface in list */
+
+
+ while (addrs != NULL)
+ {
+ /*
+ * Make a copy of the next interface pointer...
+ */
+
+ next = addrs->ifa_next;
+
+ /*
+ * Free data values as needed...
+ */
+
+ if (addrs->ifa_name)
+ {
+ free(addrs->ifa_name);
+ addrs->ifa_name = NULL;
+ }
+
+ if (addrs->ifa_addr)
+ {
+ free(addrs->ifa_addr);
+ addrs->ifa_addr = NULL;
+ }
+
+ if (addrs->ifa_netmask)
+ {
+ free(addrs->ifa_netmask);
+ addrs->ifa_netmask = NULL;
+ }
+
+ if (addrs->ifa_dstaddr)
+ {
+ free(addrs->ifa_dstaddr);
+ addrs->ifa_dstaddr = NULL;
+ }
+
+ /*
+ * Free this node and continue to the next...
+ */
+
+ free(addrs);
+
+ addrs = next;
+ }
+}
+#endif /* !HAVE_GETIFADDRS */
+
+
+/*
+ * End of "$Id: getifaddrs.c 5428 2006-04-18 20:45:30Z mike $".
+ */
/*
- * "$Id: http-addr.c 5251 2006-03-08 18:34:07Z mike $"
+ * "$Id: http-addr.c 5443 2006-04-20 14:50:26Z mike $"
*
* HTTP address routines for the Common UNIX Printing System (CUPS).
*
int /* O - 1 if "any", 0 otherwise */
httpAddrAny(const http_addr_t *addr) /* I - Address to check */
{
+ if (!addr)
+ return (0);
+
#ifdef AF_INET6
if (addr->addr.sa_family == AF_INET6 &&
IN6_IS_ADDR_UNSPECIFIED(&(addr->ipv6.sin6_addr)))
httpAddrEqual(const http_addr_t *addr1, /* I - First address */
const http_addr_t *addr2) /* I - Second address */
{
+ if (!addr1 && !addr2)
+ return (1);
+
+ if (!addr1 || !addr2)
+ return (0);
+
if (addr1->addr.sa_family != addr2->addr.sa_family)
return (0);
int /* O - Length in bytes */
httpAddrLength(const http_addr_t *addr) /* I - Address */
{
+ if (!addr)
+ return (0);
+
#ifdef AF_INET6
if (addr->addr.sa_family == AF_INET6)
return (sizeof(addr->ipv6));
httpAddrLocalhost(
const http_addr_t *addr) /* I - Address to check */
{
+ if (!addr)
+ return (1);
+
#ifdef AF_INET6
if (addr->addr.sa_family == AF_INET6 &&
IN6_IS_ADDR_LOOPBACK(&(addr->ipv6.sin6_addr)))
struct hostent *host; /* Host entry to get FQDN */
+ if (!s || slen <= 1)
+ return (NULL);
+
if (http)
{
if (http->hostname[0] == '/')
* Get the hostname...
*/
- gethostname(s, slen);
+ if (gethostname(s, slen) < 0)
+ strlcpy(s, "localhost", slen);
if (!strchr(s, '.'))
{
* The hostname is not a FQDN, so look it up...
*/
- if ((host = gethostbyname(s)) != NULL)
+ if ((host = gethostbyname(s)) != NULL && host->h_name)
strlcpy(s, host->h_name, slen);
}
}
/*
- * End of "$Id: http-addr.c 5251 2006-03-08 18:34:07Z mike $".
+ * End of "$Id: http-addr.c 5443 2006-04-20 14:50:26Z mike $".
*/
/*
- * "$Id: http-private.h 5373 2006-04-06 20:03:32Z mike $"
+ * "$Id: http-private.h 5428 2006-04-18 20:45:30Z mike $"
*
* Private HTTP definitions for the Common UNIX Printing System (CUPS).
*
# include <Security/SecureTransport.h>
-typedef SSLConnectionRef http_tls_t;
+typedef struct /**** CDSA connection information ****/
+{
+ SSLContextRef session; /* CDSA session object */
+ CFArrayRef certsArray; /* Certificates array */
+} http_tls_t;
typedef union _cdsa_conn_ref_u /**** CDSA Connection reference union
**** used to resolve 64-bit casting
extern const char *hstrerror(int error);
# endif /* !HAVE_HSTRERROR */
+
+/*
+ * Some OS's don't have getifaddrs() and freeifaddrs()...
+ */
+
+# include <net/if.h>
+# ifdef HAVE_GETIFADDRS
+# include <ifaddrs.h>
+# else
+# include <sys/ioctl.h>
+# ifdef HAVE_SYS_SOCKIO_H
+# include <sys/sockio.h>
+# endif /* HAVE_SYS_SOCKIO_H */
+
+# ifdef ifa_dstaddr
+# undef ifa_dstaddr
+# endif /* ifa_dstaddr */
+# ifndef ifr_netmask
+# define ifr_netmask ifr_addr
+# endif /* !ifr_netmask */
+
+struct ifaddrs /**** Interface Structure ****/
+{
+ struct ifaddrs *ifa_next; /* Next interface in list */
+ char *ifa_name; /* Name of interface */
+ unsigned int ifa_flags; /* Flags (up, point-to-point, etc.) */
+ struct sockaddr *ifa_addr, /* Network address */
+ *ifa_netmask, /* Address mask */
+ *ifa_dstaddr; /* Broadcast or destination address */
+ void *ifa_data; /* Interface statistics */
+};
+
+static int _cups_getifaddrs(struct ifaddrs **addrs);
+# define getifaddrs _cups_getifaddrs
+static void _cups_freeifaddrs(struct ifaddrs *addrs);
+# define freeifaddrs _cups_freeifaddrs
+# endif /* HAVE_GETIFADDRS */
+
#endif /* !_CUPS_HTTP_PRIVATE_H_ */
/*
- * End of "$Id: http-private.h 5373 2006-04-06 20:03:32Z mike $".
+ * End of "$Id: http-private.h 5428 2006-04-18 20:45:30Z mike $".
*/
/*
- * "$Id: http.c 5373 2006-04-06 20:03:32Z mike $"
+ * "$Id: http.c 5416 2006-04-17 21:24:17Z mike $"
*
* HTTP routines for the Common UNIX Printing System (CUPS).
*
*/
if (!http->blocking && !http_wait(http, 1000))
+ {
+ DEBUG_puts("httpGets: Timed out!");
+ http->error = ETIMEDOUT;
return (NULL);
+ }
#ifdef HAVE_SSL
if (http->tls)
size_t processed; /* Number of bytes processed */
- error = SSLRead((SSLContextRef)http->tls, buf, len, &processed);
+ error = SSLRead(((http_tls_t *)http->tls)->session, buf, len, &processed);
switch (error)
{
http_setup_ssl(http_t *http) /* I - HTTP connection */
{
# ifdef HAVE_LIBSSL
- SSL_CTX *context; /* Context for encryption */
- SSL *conn; /* Connection for encryption */
+ SSL_CTX *context; /* Context for encryption */
+ SSL *conn; /* Connection for encryption */
# elif defined(HAVE_GNUTLS)
- http_tls_t *conn; /* TLS session object */
+ http_tls_t *conn; /* TLS session object */
gnutls_certificate_client_credentials *credentials;
- /* TLS credentials */
+ /* TLS credentials */
# elif defined(HAVE_CDSASSL)
- SSLContextRef conn; /* Context for encryption */
- OSStatus error; /* Error info */
+ OSStatus error; /* Error code */
+ http_tls_t *conn; /* CDSA connection information */
+ cdsa_conn_ref_t u; /* Connection reference union */
# endif /* HAVE_LIBSSL */
}
# elif defined(HAVE_GNUTLS)
- conn = (http_tls_t *)malloc(sizeof(http_tls_t));
-
- if (conn == NULL)
+ if ((conn = (http_tls_t *)malloc(sizeof(http_tls_t))) == NULL)
{
http->error = errno;
http->status = HTTP_ERROR;
conn->credentials = credentials;
# elif defined(HAVE_CDSASSL)
- cdsa_conn_ref_t u; /* Connection reference union */
+ conn = (http_tls_t *)calloc(1, sizeof(http_tls_t));
+ if (conn == NULL)
+ return (-1);
- error = SSLNewContext(false, &conn);
-
- if (!error)
- error = SSLSetIOFuncs(conn, _httpReadCDSA, _httpWriteCDSA);
-
- if (!error)
+ if ((error = SSLNewContext(false, &conn->session)))
{
- /*
- * Use a union to resolve warnings about int/pointer size mismatches...
- */
+ http->error = error;
+ http->status = HTTP_ERROR;
- u.connection = NULL;
- u.sock = http->fd;
- error = SSLSetConnection(conn, u.connection);
+ free(conn);
+ return (-1);
}
+ /*
+ * Use a union to resolve warnings about int/pointer size mismatches...
+ */
+
+ u.connection = NULL;
+ u.sock = http->fd;
+ error = SSLSetConnection(conn->session, u.connection);
+
+ if (!error)
+ error = SSLSetIOFuncs(conn->session, _httpReadCDSA, _httpWriteCDSA);
+
if (!error)
- error = SSLSetAllowsExpiredCerts(conn, true);
+ error = SSLSetAllowsExpiredCerts(conn->session, true);
if (!error)
- error = SSLSetAllowsAnyRoot(conn, true);
+ error = SSLSetAllowsAnyRoot(conn->session, true);
if (!error)
{
- while ((error = SSLHandshake(conn)) == errSSLWouldBlock)
+ while ((error = SSLHandshake(conn->session)) == errSSLWouldBlock)
usleep(1000);
}
- if (error != 0)
+ if (error)
{
http->error = error;
http->status = HTTP_ERROR;
- SSLDisposeContext(conn);
+ SSLDisposeContext(conn->session);
- close(http->fd);
+ free(conn);
return (-1);
}
*/
static void
-http_shutdown_ssl(http_t *http) /* I - HTTP connection */
+http_shutdown_ssl(http_t *http) /* I - HTTP connection */
{
# ifdef HAVE_LIBSSL
- SSL_CTX *context; /* Context for encryption */
- SSL *conn; /* Connection for encryption */
+ SSL_CTX *context; /* Context for encryption */
+ SSL *conn; /* Connection for encryption */
conn = (SSL *)(http->tls);
SSL_free(conn);
# elif defined(HAVE_GNUTLS)
- http_tls_t *conn; /* Encryption session */
+ http_tls_t *conn; /* Encryption session */
gnutls_certificate_client_credentials *credentials;
- /* TLS credentials */
+ /* TLS credentials */
conn = (http_tls_t *)(http->tls);
free(conn);
# elif defined(HAVE_CDSASSL)
- while (SSLClose((SSLContextRef)http->tls) == errSSLWouldBlock)
+ http_tls_t *conn; /* CDSA connection information */
+
+
+ conn = (http_tls_t *)(http->tls);
+
+ while (SSLClose(conn->session) == errSSLWouldBlock)
usleep(1000);
- SSLDisposeContext((SSLContextRef)http->tls);
+ SSLDisposeContext(conn->session);
+
+ if (conn->certsArray)
+ CFRelease(conn->certsArray);
+
+ free(conn);
# endif /* HAVE_LIBSSL */
http->tls = NULL;
* 'http_upgrade()' - Force upgrade to TLS encryption.
*/
-static int /* O - Status of connection */
-http_upgrade(http_t *http) /* I - HTTP connection */
+static int /* O - Status of connection */
+http_upgrade(http_t *http) /* I - HTTP connection */
{
- int ret; /* Return value */
- http_t myhttp; /* Local copy of HTTP data */
+ int ret; /* Return value */
+ http_t myhttp; /* Local copy of HTTP data */
DEBUG_printf(("http_upgrade(%p)\n", http));
# elif defined(HAVE_CDSASSL)
size_t bytes; /* Bytes that are available */
- if (!SSLGetBufferedReadSize((SSLContextRef)http->tls, &bytes) && bytes > 0)
+ if (!SSLGetBufferedReadSize(((http_tls_t *)http->tls)->session, &bytes) && bytes > 0)
return (1);
# endif /* HAVE_LIBSSL */
}
{
FD_SET(http->fd, http->input_set);
+ DEBUG_printf(("http_wait: msec=%d, http->fd=%d\n", msec, http->fd));
+
if (msec >= 0)
{
timeout.tv_sec = msec / 1000;
}
else
nfds = select(http->fd + 1, http->input_set, NULL, NULL, NULL);
+
+ DEBUG_printf(("http_wait: select() returned %d...\n", nfds));
}
#ifdef WIN32
while (nfds < 0 && WSAGetLastError() == WSAEINTR);
FD_CLR(http->fd, http->input_set);
+ DEBUG_printf(("http_wait: returning with nfds=%d...\n", nfds));
+
return (nfds > 0);
}
size_t processed; /* Number of bytes processed */
- error = SSLWrite((SSLContextRef)http->tls, buf, len, &processed);
+ error = SSLWrite(((http_tls_t *)http->tls)->session, buf, len, &processed);
switch (error)
{
/*
- * End of "$Id: http.c 5373 2006-04-06 20:03:32Z mike $".
+ * End of "$Id: http.c 5416 2006-04-17 21:24:17Z mike $".
*/
/*
- * "$Id: ipp.c 5329 2006-03-23 20:37:36Z mike $"
+ * "$Id: ipp.c 5415 2006-04-17 20:39:05Z mike $"
*
* Internet Printing Protocol support functions for the Common UNIX
* Printing System (CUPS).
DEBUG_printf(("ippReadIO(%p, %p, %d, %p, %p)\n", src, cb, blocking,
parent, ipp));
+ DEBUG_printf(("ippReadIO: ipp->state=%d\n", ipp->state));
if (src == NULL || ipp == NULL)
return (IPP_ERROR);
break; /* anti-compiler-warning-code */
}
+ DEBUG_printf(("ippReadIO: returning ipp->state=%d!\n", ipp->state));
+
return (ipp->state);
}
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP header...");
+ DEBUG_puts("ippWriteIO: Could not write IPP header...");
return (IPP_ERROR);
}
}
ipp->current = ipp->attrs;
ipp->curtag = IPP_TAG_ZERO;
- DEBUG_printf(("ippWrite: version=%d.%d\n", buffer[0], buffer[1]));
- DEBUG_printf(("ippWrite: op_status=%04x\n", ipp->request.any.op_status));
- DEBUG_printf(("ippWrite: request_id=%d\n", ipp->request.any.request_id));
+ DEBUG_printf(("ippWriteIO: version=%d.%d\n", buffer[0], buffer[1]));
+ DEBUG_printf(("ippWriteIO: op_status=%04x\n", ipp->request.any.op_status));
+ DEBUG_printf(("ippWriteIO: request_id=%d\n", ipp->request.any.request_id));
/*
* If blocking is disabled, stop here...
if (attr->group_tag == IPP_TAG_ZERO)
continue;
- DEBUG_printf(("ippWrite: wrote group tag = %x\n", attr->group_tag));
+ DEBUG_printf(("ippWriteIO: wrote group tag = %x\n", attr->group_tag));
*bufptr++ = attr->group_tag;
}
else if (attr->group_tag == IPP_TAG_ZERO)
* Write the value tag, name length, and name string...
*/
- DEBUG_printf(("ippWrite: writing value tag = %x\n", attr->value_tag));
- DEBUG_printf(("ippWrite: writing name = %d, \'%s\'\n", n, attr->name));
+ DEBUG_printf(("ippWriteIO: writing value tag = %x\n", attr->value_tag));
+ DEBUG_printf(("ippWriteIO: writing name = %d, \'%s\'\n", n, attr->name));
*bufptr++ = attr->value_tag;
*bufptr++ = n >> 8;
* and empty name for the collection member attribute...
*/
- DEBUG_printf(("ippWrite: writing value tag = %x\n",
+ DEBUG_printf(("ippWriteIO: writing value tag = %x\n",
IPP_TAG_MEMBERNAME));
- DEBUG_printf(("ippWrite: writing name = %d, \'%s\'\n", n, attr->name));
- DEBUG_printf(("ippWrite: writing value tag = %x\n", attr->value_tag));
- DEBUG_puts("ippWrite: writing name = 0, \'\'\n");
+ DEBUG_printf(("ippWriteIO: writing name = %d, \'%s\'\n", n, attr->name));
+ DEBUG_printf(("ippWriteIO: writing value tag = %x\n", attr->value_tag));
+ DEBUG_puts("ippWriteIO: writing name = 0, \'\'\n");
*bufptr++ = IPP_TAG_MEMBERNAME;
*bufptr++ = 0;
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
* values with a zero-length name...
*/
- DEBUG_printf(("ippWrite: writing value tag = %x\n",
+ DEBUG_printf(("ippWriteIO: writing value tag = %x\n",
attr->value_tag));
- DEBUG_printf(("ippWrite: writing name = 0, \'\'\n"));
+ DEBUG_printf(("ippWriteIO: writing name = 0, \'\'\n"));
if ((sizeof(buffer) - (bufptr - buffer)) < 3)
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
if (n > (sizeof(buffer) - 2))
return (IPP_ERROR);
- DEBUG_printf(("ippWrite: writing string = %d, \'%s\'\n", n,
+ DEBUG_printf(("ippWriteIO: writing string = %d, \'%s\'\n", n,
value->string.text));
if ((int)(sizeof(buffer) - (bufptr - buffer)) < (n + 2))
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
- DEBUG_printf(("ippWrite: wrote %d bytes\n", bufptr - buffer));
+ DEBUG_printf(("ippWriteIO: wrote %d bytes\n", bufptr - buffer));
/*
* If blocking is disabled, stop here...
if ((*cb)(dst, buffer, n) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP end-tag...");
+ DEBUG_puts("ippWriteIO: Could not write IPP end-tag...");
return (IPP_ERROR);
}
*/
ipp_attribute_t * /* O - New attribute */
-_ipp_add(ipp_t *ipp, /* I - IPP message */
- int num_values) /* I - Number of values */
+_ipp_add_attr(ipp_t *ipp, /* I - IPP message */
+ int num_values) /* I - Number of values */
{
return (_ippAddAttr(ipp, num_values));
}
void
-_ipp_free(ipp_attribute_t *attr) /* I - Attribute to free */
+_ipp_free_attr(ipp_attribute_t *attr) /* I - Attribute to free */
{
_ippFreeAttr(attr);
}
/*
- * End of "$Id: ipp.c 5329 2006-03-23 20:37:36Z mike $".
+ * End of "$Id: ipp.c 5415 2006-04-17 20:39:05Z mike $".
*/
/*
- * "$Id: localize.c 4937 2006-01-17 04:03:22Z mike $"
+ * "$Id: localize.c 5391 2006-04-14 12:26:50Z mike $"
*
* PPD custom option routines for the Common UNIX Printing System (CUPS).
*
/*
* 'ppdLocalize()' - Localize the PPD file to the current locale.
+ *
+ * @since CUPS 1.2@
*/
int /* O - 0 on success, -1 on error */
/*
- * End of "$Id: localize.c 4937 2006-01-17 04:03:22Z mike $".
+ * End of "$Id: localize.c 5391 2006-04-14 12:26:50Z mike $".
*/
/*
- * "$Id: request.c 5362 2006-03-31 15:26:12Z mike $"
+ * "$Id: request.c 5447 2006-04-21 20:07:51Z mike $"
*
* IPP utilities for the Common UNIX Printing System (CUPS).
*
ippDelete(request);
- _cupsSetError(IPP_NOT_POSSIBLE, NULL);
+ _cupsSetError(IPP_NOT_POSSIBLE, strerror(EISDIR));
return (NULL);
}
}
else if (status == HTTP_ERROR)
{
+ DEBUG_printf(("cupsDoFileRequest: http->error=%d (%s)\n", http->error,
+ strerror(http->error)));
+
#ifdef WIN32
- if (http->error != WSAENETDOWN && http->error != WSAENETUNREACH)
+ if (http->error != WSAENETDOWN && http->error != WSAENETUNREACH &&
+ http->error != ETIMEDOUT)
#else
- if (http->error != ENETDOWN && http->error != ENETUNREACH)
+ if (http->error != ENETDOWN && http->error != ENETUNREACH &&
+ http->error != ETIMEDOUT)
#endif /* WIN32 */
continue;
else
response = ippNew();
- if (ippRead(http, response) == IPP_ERROR)
- {
- /*
- * Delete the response...
- */
+ while ((state = ippRead(http, response)) != IPP_DATA)
+ if (state == IPP_ERROR)
+ {
+ /*
+ * Delete the response...
+ */
- DEBUG_puts("IPP read error!");
- ippDelete(response);
- response = NULL;
+ DEBUG_puts("IPP read error!");
+ ippDelete(response);
+ response = NULL;
- _cupsSetError(IPP_SERVICE_UNAVAILABLE, strerror(errno));
+ _cupsSetError(IPP_SERVICE_UNAVAILABLE, strerror(errno));
- break;
- }
+ break;
+ }
}
}
/*
- * End of "$Id: request.c 5362 2006-03-31 15:26:12Z mike $".
+ * End of "$Id: request.c 5447 2006-04-21 20:07:51Z mike $".
*/
/*
- * "$Id: testi18n.c 5294 2006-03-15 21:09:32Z mike $"
+ * "$Id: testi18n.c 5444 2006-04-20 18:16:54Z mike $"
*
* Internationalization test for Common UNIX Printing System (CUPS).
*
*
* Contents:
*
- * main() - Main entry for internationalization test module.
- * print_utf8() - Print UTF-8 string with (optional) message.
- * print_utf32() - Print UTF-32 string with (optional) message.
+ * main() - Main entry for internationalization test module.
+ * print_utf8() - Print UTF-8 string with (optional) message.
*/
/*
#include <stdlib.h>
#include <errno.h>
#include <time.h>
+#include <unistd.h>
#include "i18n.h"
#include "string.h"
*/
static void print_utf8(const char *msg, const cups_utf8_t *src);
-static void print_utf32(const char *msg, const cups_utf32_t *src);
/*
cups_utf8_t utf8taiwan[] = /* UTF-8 Chinese source */
{ 0x41, 0x20, 0x21, 0x3D, 0x20, 0xE4, 0xB9, 0x82, 0x2E, 0x00 };
/* "A != <CJK U+4E42>." - use Windows 950 (Big5) or EUC-TW */
- cups_utf8_t utf8good[] = /* UTF-8 good 16-bit source */
- { 0x41, 0x20, 0xE2, 0x89, 0xA2, 0x20, 0xC3, 0x84, 0x2E, 0x00 };
- /* "A <NOT IDENTICAL TO> <A WITH DIAERESIS>." */
- cups_utf8_t utf8bad[] = /* UTF-8 bad 16-bit source */
- { 0x41, 0x20, 0xE2, 0x89, 0xA2, 0x20, 0xF8, 0x84, 0x2E, 0x00 };
- /* "A <NOT IDENTICAL TO> <...bad stuff...>." */
cups_utf8_t utf8dest[1024]; /* UTF-8 destination string */
- cups_utf32_t utf32src[1024]; /* UTF-32 source string */
cups_utf32_t utf32dest[1024]; /* UTF-32 destination string */
_cups_vmap_t *vmap; /* VBCS charmap pointer */
+ /*
+ * Make sure we have a symbolic link from the data directory to a
+ * "charmaps" directory, and then point the library at it...
+ */
+
+ if (access("charmaps", 0))
+ symlink("../data", "charmaps");
+
+ putenv("CUPS_DATADIR=.");
+
/*
* Start with some conversion tests from a UTF-8 test file.
*/
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_1);
if (len != strlen((char *)utf8latin))
{
- printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8latin));
+ printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8latin));
print_utf8(" utf8latin", utf8latin);
print_utf8(" utf8dest", utf8dest);
errors ++;
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_7);
if (len != strlen((char *)utf8greek))
{
- printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8greek));
+ printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8greek));
print_utf8(" utf8greek", utf8greek);
print_utf8(" utf8dest", utf8dest);
errors ++;
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_932);
if (len != strlen((char *)utf8japan))
{
- printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8japan));
+ printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan));
print_utf8(" utf8japan", utf8japan);
print_utf8(" utf8dest", utf8dest);
errors ++;
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_JP);
if (len != strlen((char *)utf8japan))
{
- printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8japan));
+ printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan));
print_utf8(" utf8japan", utf8japan);
print_utf8(" utf8dest", utf8dest);
errors ++;
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_950);
if (len != strlen((char *)utf8taiwan))
{
- printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8taiwan));
+ printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan));
print_utf8(" utf8taiwan", utf8taiwan);
print_utf8(" utf8dest", utf8dest);
errors ++;
len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_TW);
if (len != strlen((char *)utf8taiwan))
{
- printf("FAIL (len=%d, expected %d)\n", len, strlen((char *)utf8taiwan));
+ printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan));
print_utf8(" utf8taiwan", utf8taiwan);
print_utf8(" utf8dest", utf8dest);
errors ++;
/*
- * 'print_utf32()' - Print UTF-32 string with (optional) message.
- */
-
-static void
-print_utf32(const char *msg, /* I - Message String */
- const cups_utf32_t *src) /* I - UTF-32 Source String */
-{
- if (msg)
- printf("%s:", msg);
-
- for (; *src; src ++)
- printf(" %04x", (int) *src);
-
- putchar('\n');
-}
-
-
-/*
- * End of "$Id: testi18n.c 5294 2006-03-15 21:09:32Z mike $"
+ * End of "$Id: testi18n.c 5444 2006-04-20 18:16:54Z mike $"
*/
#
-# "$Id: Makefile 5328 2006-03-23 20:23:19Z mike $"
+# "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $"
#
# Documentation makefile for the Common UNIX Printing System (CUPS).
#
help/ref-error_log.html \
help/ref-page_log.html \
help/ref-printers-conf.html \
+ help/ref-snmp-conf.html \
help/ref-subscriptions-conf.html \
help/security.html \
help/spec-cmp.html \
<li><a href='#ppdErrorString'><tt>ppdErrorString()</tt></a> <span class='info'> CUPS 1.1.19 </span></li>
<li><a href='#ppdFindAttr'><tt>ppdFindAttr()</tt></a> <span class='info'> CUPS 1.1.19 </span></li>
<li><a href='#ppdFindChoice'><tt>ppdFindChoice()</tt></a> </li>
+ <li><a href='#ppdFindCustomOption'><tt>ppdFindCustomOption()</tt></a> <span class='info'> CUPS 1.2 </span></li>
+ <li><a href='#ppdFindCustomParam'><tt>ppdFindCustomParam()</tt></a> <span class='info'> CUPS 1.2 </span></li>
<li><a href='#ppdFindMarkedChoice'><tt>ppdFindMarkedChoice()</tt></a> </li>
<li><a href='#ppdFindNextAttr'><tt>ppdFindNextAttr()</tt></a> <span class='info'> CUPS 1.1.19 </span></li>
<li><a href='#ppdFindOption'><tt>ppdFindOption()</tt></a> </li>
+ <li><a href='#ppdFirstCustomParam'><tt>ppdFirstCustomParam()</tt></a> <span class='info'> CUPS 1.2 </span></li>
<li><a href='#ppdFirstOption'><tt>ppdFirstOption()</tt></a> <span class='info'> CUPS 1.2 </span></li>
<li><a href='#ppdIsMarked'><tt>ppdIsMarked()</tt></a> </li>
<li><a href='#ppdLastError'><tt>ppdLastError()</tt></a> <span class='info'> CUPS 1.1.19 </span></li>
+ <li><a href='#ppdLocalize'><tt>ppdLocalize()</tt></a> <span class='info'> CUPS 1.2 </span></li>
<li><a href='#ppdMarkDefaults'><tt>ppdMarkDefaults()</tt></a> </li>
<li><a href='#ppdMarkOption'><tt>ppdMarkOption()</tt></a> </li>
+ <li><a href='#ppdNextCustomParam'><tt>ppdNextCustomParam()</tt></a> <span class='info'> CUPS 1.2 </span></li>
<li><a href='#ppdNextOption'><tt>ppdNextOption()</tt></a> <span class='info'> CUPS 1.2 </span></li>
<li><a href='#ppdOpen'><tt>ppdOpen()</tt></a> </li>
<li><a href='#ppdOpen2'><tt>ppdOpen2()</tt></a> <span class='info'> CUPS 1.2 </span></li>
<h4>Returns</h4>
<p>Choice pointer or NULL</p>
<!-- NEW PAGE -->
+<h3 class='title'><span class='info'> CUPS 1.2 </span><a name='ppdFindCustomOption'>ppdFindCustomOption()</a></h3>
+<h4>Description</h4>
+<p>Find a custom option.
+
+</p>
+<h4>Syntax</h4>
+<pre>
+<a href='#ppd_coption_t'>ppd_coption_t</a> *
+ppdFindCustomOption(
+ <a href='#ppd_file_t'>ppd_file_t</a> * ppd,
+ const char * keyword);
+</pre>
+<h4>Arguments</h4>
+<div class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0'>
+<thead><tr><th>Name</th><th>Description</th></tr></thead>
+<tbody>
+<tr><td><tt>ppd</tt></td><td>PPD file</td></tr>
+<tr><td><tt>keyword</tt></td><td>Custom option name</td></tr>
+</tbody></table></div>
+<h4>Returns</h4>
+<p>Custom option or NULL</p>
+<!-- NEW PAGE -->
+<h3 class='title'><span class='info'> CUPS 1.2 </span><a name='ppdFindCustomParam'>ppdFindCustomParam()</a></h3>
+<h4>Description</h4>
+<p>Find a parameter for a custom option.
+
+</p>
+<h4>Syntax</h4>
+<pre>
+<a href='#ppd_cparam_t'>ppd_cparam_t</a> *
+ppdFindCustomParam(
+ <a href='#ppd_coption_t'>ppd_coption_t</a> * opt,
+ const char * name);
+</pre>
+<h4>Arguments</h4>
+<div class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0'>
+<thead><tr><th>Name</th><th>Description</th></tr></thead>
+<tbody>
+<tr><td><tt>opt</tt></td><td>Custom option</td></tr>
+<tr><td><tt>name</tt></td><td>Parameter name</td></tr>
+</tbody></table></div>
+<h4>Returns</h4>
+<p>Custom parameter or NULL</p>
+<!-- NEW PAGE -->
<h3 class='title'><a name='ppdFindMarkedChoice'>ppdFindMarkedChoice()</a></h3>
<h4>Description</h4>
<p>Return the marked choice for the specified option.</p>
<h4>Returns</h4>
<p>Pointer to option or NULL</p>
<!-- NEW PAGE -->
+<h3 class='title'><span class='info'> CUPS 1.2 </span><a name='ppdFirstCustomParam'>ppdFirstCustomParam()</a></h3>
+<h4>Description</h4>
+<p>Return the first parameter for a custom option.
+
+</p>
+<h4>Syntax</h4>
+<pre>
+<a href='#ppd_cparam_t'>ppd_cparam_t</a> *
+ppdFirstCustomParam(
+ <a href='#ppd_coption_t'>ppd_coption_t</a> * opt);
+</pre>
+<h4>Arguments</h4>
+<div class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0'>
+<thead><tr><th>Name</th><th>Description</th></tr></thead>
+<tbody>
+<tr><td><tt>opt</tt></td><td>Custom option</td></tr>
+</tbody></table></div>
+<h4>Returns</h4>
+<p>Custom parameter or NULL</p>
+<!-- NEW PAGE -->
<h3 class='title'><span class='info'> CUPS 1.2 </span><a name='ppdFirstOption'>ppdFirstOption()</a></h3>
<h4>Description</h4>
<p>Return the first option in the PPD file.
<h4>Returns</h4>
<p>Status code</p>
<!-- NEW PAGE -->
+<h3 class='title'><span class='info'> CUPS 1.2 </span><a name='ppdLocalize'>ppdLocalize()</a></h3>
+<h4>Description</h4>
+<p>Localize the PPD file to the current locale.
+
+</p>
+<h4>Syntax</h4>
+<pre>
+int
+ppdLocalize(
+ <a href='#ppd_file_t'>ppd_file_t</a> * ppd);
+</pre>
+<h4>Arguments</h4>
+<div class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0'>
+<thead><tr><th>Name</th><th>Description</th></tr></thead>
+<tbody>
+<tr><td><tt>ppd</tt></td><td>PPD file</td></tr>
+</tbody></table></div>
+<h4>Returns</h4>
+<p>0 on success, -1 on error</p>
+<!-- NEW PAGE -->
<h3 class='title'><a name='ppdMarkDefaults'>ppdMarkDefaults()</a></h3>
<h4>Description</h4>
<p>Mark all default options in the PPD file.</p>
<h4>Returns</h4>
<p>Number of conflicts</p>
<!-- NEW PAGE -->
+<h3 class='title'><span class='info'> CUPS 1.2 </span><a name='ppdNextCustomParam'>ppdNextCustomParam()</a></h3>
+<h4>Description</h4>
+<p>Return the next parameter for a custom option.
+
+</p>
+<h4>Syntax</h4>
+<pre>
+<a href='#ppd_cparam_t'>ppd_cparam_t</a> *
+ppdNextCustomParam(
+ <a href='#ppd_coption_t'>ppd_coption_t</a> * opt);
+</pre>
+<h4>Arguments</h4>
+<div class='table'><table align='center' border='1' width='80%' cellpadding='5' cellspacing='0'>
+<thead><tr><th>Name</th><th>Description</th></tr></thead>
+<tbody>
+<tr><td><tt>opt</tt></td><td>Custom option</td></tr>
+</tbody></table></div>
+<h4>Returns</h4>
+<p>Custom parameter or NULL</p>
+<!-- NEW PAGE -->
<h3 class='title'><span class='info'> CUPS 1.2 </span><a name='ppdNextOption'>ppdNextOption()</a></h3>
<h4>Description</h4>
<p>Return the next option in the PPD file.
</HEAD>
<BODY>
-<P>The <VAR>/etc/cups/client.conf</VAR> file contains many
-directives that determine how the client behaves:</P>
+<P>The <VAR>/etc/cups/client.conf</VAR> and
+<VAR>~/.cups/client.conf</VAR> files contain up to two directives
+that determine how the client behaves. Each directive is listed
+on a line by itself followed by its value. Comments are
+introduced using the number sign ("#") character at the beginning
+of a line.</P>
-<P ALIGN="CENTER">
-<TABLE CELLPADDING="0" CELLSPACING="0" BORDER="0">
-<TR>
-<TD VALIGN="TOP">
+<H2 CLASS="title"><A NAME="Encryption">Encryption</A></H2>
- <LI><A HREF="#Encryption"><CODE>Encryption</CODE></A>
- <LI><A HREF="#ServerName"><CODE>ServerName</CODE></A>
+<H3>Examples</H3>
-</TD>
-</TR>
-</TABLE>
-</P>
-
-<!-- HALF PAGE -->
-<H3><A NAME="Encryption">Encryption</A></H3>
-<HR>
-
-<H4>Examples</H4>
-
-<UL><PRE>
+<PRE CLASS="command">
Encryption Never
Encryption IfRequested
Encryption Required
Encryption Always
-</PRE></UL>
+</PRE>
+
+<H3>Description</H3>
-<H4>Description</H4>
+<P>The <CODE>Encryption</CODE> directive specifies the default
+encryption settings for the client.</P>
-<P>The <CODE>Encryption</CODE> directive specifies the default encryption settings for the client.
-The default setting is <VAR>IfRequested</VAR>.
+<P>The default setting is <VAR>IfRequested</VAR>.</P>
-<!-- HALF PAGE -->
-<H3><A NAME="ServerName">ServerName</A></H3>
-<HR>
+<H2 CLASS="title"><A NAME="ServerName">ServerName</A></H2>
-<H4>Examples</H4>
+<H3>Examples</H3>
-<UL><PRE>
+<PRE CLASS="command">
ServerName foo.bar.com
ServerName 11.22.33.44
-</PRE></UL>
+</PRE>
-<H4>Description</H4>
+<H3>Description</H3>
-<P>The <CODE>ServerName</CODE> directive specifies sets the remote server that is to be used
-for all client operations. That is, it redirects all client requests to the remote server.
+<P>The <CODE>ServerName</CODE> directive specifies sets the
+remote server that is to be used for all client operations. That
+is, it redirects all client requests to the remote server.</P>
-The default is to use the local server ("<VAR>localhost</VAR>").
+<P>The default is to use the local server
+("<VAR>localhost</VAR>") or domain socket, if so configured.</P>
</BODY>
</HTML>
--- /dev/null
+<HTML>
+<!-- SECTION: References -->
+<HEAD>
+ <TITLE>snmp.conf</TITLE>
+</HEAD>
+<BODY>
+
+<P>The <VAR>/etc/cups/snmp.conf</VAR> file contains several
+directives that determine how the SNMP printer discovery backend
+behaves. Each directive is listed on a line by itself followed
+by its value. Comments are introduced using the number sign ("#")
+character at the beginning of a line.</P>
+
+<P>The SNMP backend uses the SNMPv1 protocol to discover network
+printers, collecting information from the Host MIB along with
+intelligent port probes to determine the correct device URI and
+make and model for each printer. Future versions of CUPS will
+likely support the new Port Monitor MIB as well.</P>
+
+<H2 CLASS="title"><A NAME="Address">Address</A></H2>
+
+<H3>Examples</H3>
+
+<PRE CLASS="command">
+Address @LOCAL
+Address @IF(name)
+Address 255.255.255.255
+Address 192.168.2.255
+</PRE>
+
+<H3>Description</H3>
+
+<P>The <CODE>Address</CODE> directive specifies a broadcast
+address to use when discovering printers. Multiple
+<CODE>Address</CODE> lines can be provided to scan different
+subnets.</P>
+
+<P>The default address is <VAR>@LOCAL</VAR>, which broadcasts to
+all LANs.</P>
+
+
+<H2 CLASS="title"><A NAME="Community">Community</A></H2>
+
+<H3>Examples</H3>
+
+<PRE CLASS="command">
+Community public
+Community easysw
+Community BigCorp
+</PRE>
+
+<H3>Description</H3>
+
+<P>The <CODE>Community</CODE> directive specifies a community
+name to use when discovering printers. Multiple
+<CODE>Community</CODE> lines can be provided to scan different
+SNMP communities.</P>
+
+<P>The default community is "public".</P>
+
+
+<H2 CLASS="title"><A NAME="DebugLevel">DebugLevel</A></H2>
+
+<H3>Examples</H3>
+
+<PRE CLASS="command">
+DebugLevel 0
+DebugLevel 1
+DebugLevel 2
+DebugLevel 3
+</PRE>
+
+<H3>Description</H3>
+
+<P>The <CODE>DebugLevel</CODE> directive specifies the debugging
+level to use when searching for network printers. Level 0
+produces no debugging information. Level 1 produces basic
+debugging information. Level 2 adds printing of the SNMP
+messages. Level 3 adds a hex dump of the network data.</P>
+
+<P>The default setting is <VAR>0</VAR>.</P>
+
+<H2 CLASS="title"><A NAME="HostNameLookups">HostNameLookups</A></H2>
+
+<H3>Examples</H3>
+
+<PRE CLASS="command">
+HostNameLookups on
+HostNameLookups off
+</PRE>
+
+<H3>Description</H3>
+
+<P>The <CODE>HostNameLookups</CODE> directive specifies whether printer
+addresses are converted to hostnames or left as numeric IP addresses.</P>
+
+<P>The default setting is <VAR>off</VAR>.</P>
+
+</BODY>
+</HTML>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+ <TITLE>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
+ <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
+ <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+<TABLE WIDTH="100%" STYLE="height: 100%;" BORDER="0" CELLSPACING="0" CELLPADDING="0" SUMMARY="Common UNIX Printing System @CUPS_VERSION@">
+<TR CLASS="header">
+<TD VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG SRC="/images/top-left.gif" WIDTH="15" HEIGHT="80" ALT=""></TD>
+<TD VALIGN="TOP" WIDTH="55" ROWSPAN="2"><IMG SRC="/images/top-middle.gif" WIDTH="55" HEIGHT="80" ALT=""></TD>
+<TD WIDTH="100%" HEIGHT="60"><H1>Common UNIX Printing System @CUPS_VERSION@@CUPS_REVISION@</H1></TD>
+<TD ALIGN="RIGHT" VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG
+SRC="/images/top-right.gif" WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+<TR CLASS="header"><TD WIDTH="100%" VALIGN="BOTTOM" NOWRAP>
+
+<A CLASS="sel" HREF="/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Strona Główna <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="unsel" HREF="/admin/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Administracja <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="unsel" HREF="/classes/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Grupy <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="unsel" HREF="/help/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Dokumentacja/Pomoc <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="unsel" HREF="/jobs/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Wydruki <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="unsel" HREF="/printers/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Drukarki <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+</TD></TR>
+<TR CLASS="page">
+<TD WIDTH="15"> </TD>
+<TD COLSPAN="2" WIDTH="100%" VALIGN="TOP" CLASS="page">
+
+<H2 CLASS="title">Witaj!</H2>
+
+<P> Poprzez te strony internetowe możesz kontrolować swoje drukarki i wydruki, ale także
+administrować systemem wydruku. Klikaj na zakładki powyżej lub poniższe przyciski aby wykonać odpowiednie zadania.</P>
+
+<P>
+<A HREF="/help/"><IMG SRC="/images/button-help.gif" CLASS="button" ALT="Pomoc"></A>
+<A HREF="/admin?OP=add-class"><IMG SRC="/images/button-add-class.gif" CLASS="button" ALT="Dodaj klasę"></A>
+<A HREF="/admin?OP=add-printer"><IMG SRC="/images/button-add-printer.gif" CLASS="button" ALT="Dodaj drukarkę"></A>
+<A HREF="/classes"><IMG SRC="/images/button-manage-classes.gif" CLASS="button" ALT="Zarządzaj Klasami"></A>
+<A HREF="/jobs"><IMG SRC="/images/button-manage-jobs.gif" CLASS="button" ALT="Zarządzaj wydrukami"></A>
+<A HREF="/printers"><IMG SRC="/images/button-manage-printers.gif" CLASS="button" ALT="Zarządzaj Drukarkami"></A>
+<A HREF="/admin"><IMG SRC="/images/button-manage-server.gif" CLASS="button" ALT="Zarządzaj Serwerem"></A>
+</P>
+
+<P><I>Jeśli zostaniesz poproszony o nazwę użytkownika i hasło, wprowadź swój login i hasło
+lub login "root" i hasło tego użytkownika.</I></P>
+
+<H2 CLASS="title">O systemie CUPS</H2>
+
+<P>
+<IMG SRC="/images/happy.gif" ALIGN="LEFT" WIDTH="196" HEIGHT="144"
+STYLE="padding-right: 10px;" ALT="Zadowolony komputer i drukarka">
+
+<A HREF="http://www.easysw.com/"><IMG SRC="/images/esp-logo.gif"
+ALIGN="RIGHT" WIDTH="110" HEIGHT="68" BORDER="0"
+STYLE="padding-left: 10px; padding-bottom: 10px;"
+ALT="Easy Software Products"></A>
+
+CUPS zapewnia przenośną warstwę drukowania dla systemów bazujących na
+UNIX<SUP>®</SUP>. Jest rozbudowywany pod opieką <A HREF="http://www.easysw.com">Easy Software
+Products</a> by promować standard drukowania. CUPS jest domyślnym systemem drukowania używanym w MacOS<SUP>®</SUP> X i większości dystrybucji Linuksa<SUP>®</SUP>.</P>
+<P>CUPS stosuje <A HREF="http://www.pwg.org/ipp/"
+TARGET="_blank"> Internetowy Protokół Drukowania ("IPP")</A> jako podstawy do zarządzania wydrukami i ich kolejkami oraz umożliwia przeglądanie drukarek sieciowych i wydruki w oparciu o PostScriptowe Opisy Drukarek ("PPD") by wspierać w drukowaniu każdego użytkownika.<BR CLEAR="ALL"></P>
+
+<H2 CLASS="title">Sterowniki Drukarek i Wsparcie</H2>
+
+<P>Odwiedź oficjalną stronę CUPS site aby pobrać sterowniki i uzyskać wsparcie:</P>
+
+<PRE>
+ <A HREF="http://www.cups.org/" TARGET="_blank">www.cups.org</A>
+</PRE>
+
+<P>Komercyjne wsparcie i rozszerzona wersja CUPS zwana <A
+HREF="http://www.easysw.com/printpro/">ESP Print Pro</A> jest dostępna tu:</P>
+
+<PRE>
+ <A HREF="http://www.easysw.com/" TARGET="_blank">www.easysw.com</A>
+</PRE>
+
+</TD>
+<TD WIDTH="15"> </TD>
+</TR>
+<TR CLASS="header">
+<TD VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-left.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="padding: 5;">
+
+<P><SMALL>The Common UNIX Printing System, CUPS, and the CUPS logo are the
+trademark property of <A HREF="http://www.easysw.com">Easy Software
+Products</A>. CUPS is copyright 1997-2006 by Easy Software Products,
+All Rights Reserved.</SMALL></P>
+
+</TD>
+
+<TD ALIGN="RIGHT" VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-right.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+</TABLE>
+</BODY>
+</HTML>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+ <TITLE>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
+ <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
+ <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+<TABLE WIDTH="100%" STYLE="height: 100%;" BORDER="0" CELLSPACING="0" CELLPADDING="0" SUMMARY="Common UNIX Printing System @CUPS_VERSION@">
+<TR CLASS="header">
+<TD VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG SRC="/images/top-left.gif" WIDTH="15" HEIGHT="80" ALT=""></TD>
+<TD VALIGN="TOP" WIDTH="55" ROWSPAN="2"><IMG SRC="/images/top-middle.gif" WIDTH="55" HEIGHT="80" ALT=""></TD>
+<TD WIDTH="100%" HEIGHT="60"><H1>Common UNIX Printing System @CUPS_VERSION@@CUPS_REVISION@</H1></TD>
+<TD ALIGN="RIGHT" VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG
+SRC="/images/top-right.gif" WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+<TR CLASS="header"><TD WIDTH="100%" VALIGN="BOTTOM" NOWRAP>
+
+<A CLASS="sel" HREF="/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Hem <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="unsel" HREF="/admin/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Administration <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="unsel" HREF="/classes/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Klasser <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="unsel" HREF="/help/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Dokumentation/Hjälp <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="unsel" HREF="/jobs/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Jobb <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="unsel" HREF="/printers/"><IMG SRC="/images/tab-left.gif" WIDTH="4"
+HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Skrivare <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+</TD></TR>
+<TR CLASS="page">
+<TD WIDTH="15"> </TD>
+<TD COLSPAN="2" WIDTH="100%" VALIGN="TOP" CLASS="page">
+
+<H2 CLASS="title">Välkommen!</H2>
+
+<P>Dessa webbsidor låter dig övervaka dina skrivare och jobb så väl som
+genomföra systemadministrativa uppgifter. Klicka på någon av flikarna
+ovan eller knapparna nedan för att genomföra en uppgift.</P>
+
+<P>
+<A HREF="/help/"><IMG SRC="/images/button-help.gif" CLASS="button" ALT="Hjälp"></A>
+<A HREF="/admin?OP=add-class"><IMG SRC="/images/button-add-class.gif" CLASS="button" ALT="Lägg till klass"></A>
+<A HREF="/admin?OP=add-printer"><IMG SRC="/images/button-add-printer.gif" CLASS="button" ALT="Lägg till skrivare"></A>
+<A HREF="/classes"><IMG SRC="/images/button-manage-classes.gif" CLASS="button" ALT="Hantera klasser"></A>
+<A HREF="/jobs"><IMG SRC="/images/button-manage-jobs.gif" CLASS="button" ALT="Hantera jobb"></A>
+<A HREF="/printers"><IMG SRC="/images/button-manage-printers.gif" CLASS="button" ALT="Hantera skrivare"></A>
+<A HREF="/admin"><IMG SRC="/images/button-manage-server.gif" CLASS="button" ALT="Hantera server"></A>
+</P>
+
+<P><I>Om du blir frågad efter ett användarnamn och lösenord, ange ditt
+inloggningsnamn och lösenord eller "root"-användarens användarnamn och
+lösenord.</I></P>
+
+<H2 CLASS="title">Om CUPS</H2>
+
+<P>
+<IMG SRC="/images/happy.gif" ALIGN="LEFT" WIDTH="196" HEIGHT="144"
+STYLE="padding-right: 10px;" ALT="Glad dator och skrivare">
+
+<A HREF="http://www.easysw.com/"><IMG SRC="/images/esp-logo.gif"
+ALIGN="RIGHT" WIDTH="110" HEIGHT="68" BORDER="0"
+STYLE="padding-left: 10px; padding-bottom: 10px;"
+ALT="Easy Software Products"></A>
+
+CUPS tillhandahåller ett portabelt skrivarlager för UNIX<SUP>®</SUP>-baserade operativsystem. Det har utvecklats och
+underhålls av <A HREF="http://www.easysw.com">Easy Software
+Products</a> för att erbjuda en standardiserad utskriftslösning.
+CUPS är det utskriftssystemet som är standard på MacOS<SUP>®</SUP> X och de flesta Linux<SUP>®</SUP>-distributioner.</P>
+
+<P>CUPS använder <A HREF="http://www.pwg.org/ipp/"
+TARGET="_blank"> Internet Printing Protocol ("IPP")</A> som bas
+för att hantera utskriftsjobb, köer, bläddring för nätverksskrivare
+och PostScript Printer Description-baserade ("PPD") utskriftsalternativ för att ge stöd för utskrifter i den riktiga världen.<BR CLEAR="ALL"></P>
+
+<H2 CLASS="title">För skrivardrivrutiner och hjälp</H2>
+
+<P>Besök den officiella CUPS-webbplatsen för skrivardrivrutiner och hjälp:</P>
+
+<PRE>
+ <A HREF="http://www.cups.org/" TARGET="_blank">www.cups.org</A>
+</PRE>
+
+<P>Kommersiell support och en utökad version av CUPS kallad <A
+HREF="http://www.easysw.com/printpro/">ESP Print Pro</A> finns
+tillgänglig på:</P>
+
+<PRE>
+ <A HREF="http://www.easysw.com/" TARGET="_blank">www.easysw.com</A>
+</PRE>
+
+</TD>
+<TD WIDTH="15"> </TD>
+</TR>
+<TR CLASS="header">
+<TD VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-left.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="padding: 5;">
+
+<P><SMALL>The Common UNIX Printing System, CUPS, och CUPS-logotypen är varumärken för <A HREF="http://www.easysw.com">Easy Software
+Products</A>. CUPS är copyright 1997-2006 Easy Software Products,
+Alla rättigheter reserverade.</SMALL></P>
+
+</TD>
+
+<TD ALIGN="RIGHT" VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-right.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+</TABLE>
+</BODY>
+</HTML>
--- /dev/null
+/*
+ * "$Id: testdriver.c 5390 2006-04-10 19:29:44Z mike $"
+ *
+ * Sample/test driver interface program for the Common UNIX Printing
+ * System (CUPS).
+ *
+ * This program handles listing and installing both static PPD files
+ * in CUPS_DATADIR/model and dynamically generated PPD files using
+ * the driver helper programs in CUPS_SERVERBIN/driver.
+ *
+ * Copyright 1997-2006 by Easy Software Products.
+ *
+ * These coded instructions, statements, and computer programs are the
+ * property of Easy Software Products and are protected by Federal
+ * copyright law. Distribution and use rights are outlined in the file
+ * "LICENSE.txt" which should have been included with this file. If this
+ * file is missing or damaged please contact Easy Software Products
+ * at:
+ *
+ * Attn: CUPS Licensing Information
+ * Easy Software Products
+ * 44141 Airport View Drive, Suite 204
+ * Hollywood, Maryland 20636 USA
+ *
+ * Voice: (301) 373-9600
+ * EMail: cups-info@cups.org
+ * WWW: http://www.cups.org
+ *
+ * Contents:
+ *
+ * main() - Enumerate or display PPD files.
+ * cat_ppd() - Display a PPD file.
+ * list_ppds() - List PPDs.
+ */
+
+/*
+ * Include necessary headers...
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+
+/*
+ * Local functions...
+ */
+
+static int cat_ppd(const char *uri);
+static int list_ppds(const char *name);
+
+
+/*
+ * Sample data...
+ */
+
+static const char *models[][2] =
+ {
+ { "foojet.ppd", "Foo Printer" },
+ { "barjet.ppd", "Bar Printer" },
+ { "foobar.ppd", "Foo/Bar Multifunction Printer" }
+ };
+
+
+/*
+ * 'main()' - Enumerate or display PPD files.
+ */
+
+int /* O - Exit status */
+main(int argc, /* I - Number of command-line args */
+ char *argv[]) /* I - Command-line arguments */
+{
+ if (argc == 2 && !strcmp(argv[1], "list"))
+ return (list_ppds(argv[0]));
+ else if (argc == 3 && !strcmp(argv[1], "cat"))
+ return (cat_ppd(argv[2]));
+
+ fprintf(stderr, "ERROR: Usage: %s cat URI\n", argv[0]);
+ fprintf(stderr, "ERROR: Usage: %s list\n", argv[0]);
+ return (1);
+}
+
+
+/*
+ * 'cat_ppd()' - Display a PPD file.
+ */
+
+static int /* O - Exit status */
+cat_ppd(const char *uri) /* I - PPD URI */
+{
+ int i; /* Looping var */
+ const char *name; /* Pointer to name in URI */
+
+
+ if ((name = strchr(uri, ':')) == NULL)
+ {
+ fprintf(stderr, "ERROR: Bad URI \"%s\"!\n", uri);
+ return (1);
+ }
+
+ name ++;
+
+ for (i = 0 ; i < (int)(sizeof(models) / sizeof(models[0])); i ++)
+ if (!strcmp(name, models[i][0]))
+ {
+ /*
+ * Actually display the PPD file...
+ */
+ puts("*PPD-Adobe: \"4.3\"");
+
+ puts("*LanguageEncoding: ISOLatin1");
+ puts("*LanguageVersion: English");
+ puts("*Manufacturer: \"Test\"");
+ puts("*FileVersion: \"1.0\"");
+ puts("*FormatVersion: \"4.3\"");
+ puts("*PSVersion: \"(3010) 1\"");
+ printf("*PCFileName: \"%s\"\n", models[i][0]);
+
+ printf("*Product: \"(%s)\"\n", models[i][1]);
+ printf("*ModelName: \"Test %s\"\n", models[i][1]);
+ printf("*NickName: \"Test %s\"\n", models[i][1]);
+ printf("*ShortNickName: \"Test %s\"\n", models[i][1]);
+
+ puts("*OpenUI PageSize: PickOne");
+ puts("*OrderDependency: 10 AnySetup *PageSetup");
+ puts("*DefaultPageSize: Letter");
+ puts("*PageSize Letter: \"<</PageSize[612 792]>>setpagedevice\"");
+ puts("*PageSize A4: \"<</PageSize[585 842]>>setpagedevice\"");
+ puts("*CloseUI: *PageSize");
+
+ puts("*OpenUI PageRegion: PickOne");
+ puts("*OrderDependency: 10 AnySetup *PageRegion");
+ puts("*DefaultPageRegion: Letter");
+ puts("*PageRegion Letter: \"<</PageRegion[612 792]>>setpagedevice\"");
+ puts("*PageRegion A4: \"<</PageRegion[585 842]>>setpagedevice\"");
+ puts("*CloseUI: *PageRegion");
+
+ puts("*DefaultImageableArea: Letter");
+ puts("*ImageableArea Letter: \"0 0 612 792\"");
+ puts("*ImageableArea A4: \"0 0 595 842\"");
+
+ puts("*DefaultPaperDimension: Letter");
+ puts("*PaperDimension Letter: \"612 792\"");
+ puts("*PaperDimension A4: \"595 842\"");
+
+ return (0);
+ }
+
+ fprintf(stderr, "ERROR: Unknown URI \"%s\"!\n", uri);
+ return (1);
+}
+
+
+/*
+ * 'list_ppds()' - List PPDs.
+ */
+
+static int /* O - Exit status */
+list_ppds(const char *name) /* I - Program name */
+{
+ int i; /* Looping var */
+ const char *base; /* Base name of program */
+
+
+ if ((base = strrchr(name, '/')) != NULL)
+ base ++;
+ else
+ base = name;
+
+ for (i = 0; i < (int)(sizeof(models) / sizeof(models[0])); i ++)
+ printf("\"%s:%s\" en \"Test\" \"Test %s\" \"1284 device id\"\n",
+ base, models[i][0], models[i][1]);
+
+ return (0);
+}
+
+
+/*
+ * End of "$Id: testdriver.c 5390 2006-04-10 19:29:44Z mike $".
+ */
/*
- * "$Id: image-png.c 4741 2005-10-02 04:25:52Z mike $"
+ * "$Id: image-png.c 5452 2006-04-22 22:17:32Z mike $"
*
* PNG image routines for the Common UNIX Printing System (CUPS).
*
- * Copyright 1993-2005 by Easy Software Products.
+ * Copyright 1993-2006 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
int y; /* Looping var */
png_structp pp; /* PNG read pointer */
png_infop info; /* PNG info pointers */
+ png_uint_32 width, /* Width of image */
+ height; /* Height of image */
+ int bit_depth, /* Bit depth */
+ color_type, /* Color type */
+ interlace_type, /* Interlace type */
+ compression_type, /* Compression type */
+ filter_type; /* Filter type */
+ png_uint_32 xppm, /* X pixels per meter */
+ yppm; /* Y pixels per meter */
int bpp; /* Bytes per pixel */
int pass, /* Current pass */
passes; /* Number of passes required */
png_read_info(pp, info);
+ png_get_IHDR(pp, info, &width, &height, &bit_depth, &color_type,
+ &interlace_type, &compression_type, &filter_type);
+
fprintf(stderr, "DEBUG: PNG image: %dx%dx%d, color_type=%x (%s%s%s)\n",
- (int)info->width, (int)info->height, info->bit_depth, info->color_type,
- (info->color_type & PNG_COLOR_MASK_COLOR) ? "RGB" : "GRAYSCALE",
- (info->color_type & PNG_COLOR_MASK_ALPHA) ? "+ALPHA" : "",
- (info->color_type & PNG_COLOR_MASK_PALETTE) ? "+PALETTE" : "");
+ (int)width, (int)height, bit_depth, color_type,
+ (color_type & PNG_COLOR_MASK_COLOR) ? "RGB" : "GRAYSCALE",
+ (color_type & PNG_COLOR_MASK_ALPHA) ? "+ALPHA" : "",
+ (color_type & PNG_COLOR_MASK_PALETTE) ? "+PALETTE" : "");
- if (info->color_type & PNG_COLOR_MASK_PALETTE)
+ if (color_type & PNG_COLOR_MASK_PALETTE)
png_set_expand(pp);
- else if (info->bit_depth < 8)
+ else if (bit_depth < 8)
{
png_set_packing(pp);
png_set_expand(pp);
}
- else if (info->bit_depth == 16)
+ else if (bit_depth == 16)
png_set_strip_16(pp);
- if (info->color_type & PNG_COLOR_MASK_COLOR)
- img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary;
+ if (color_type & PNG_COLOR_MASK_COLOR)
+ img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB :
+ primary;
else
img->colorspace = secondary;
- if (info->width == 0 || info->width > CUPS_IMAGE_MAX_WIDTH ||
- info->height == 0 || info->height > CUPS_IMAGE_MAX_HEIGHT)
+ if (width == 0 || width > CUPS_IMAGE_MAX_WIDTH ||
+ height == 0 || height > CUPS_IMAGE_MAX_HEIGHT)
{
fprintf(stderr, "ERROR: PNG image has invalid dimensions %ux%u!\n",
- (unsigned)info->width, (unsigned)info->height);
+ (unsigned)width, (unsigned)height);
fclose(fp);
return (1);
}
- img->xsize = info->width;
- img->ysize = info->height;
+ img->xsize = width;
+ img->ysize = height;
- if (info->valid & PNG_INFO_pHYs &&
- info->phys_unit_type == PNG_RESOLUTION_METER)
+ if ((xppm = png_get_x_pixels_per_meter(pp, info)) != 0 &&
+ (yppm = png_get_y_pixels_per_meter(pp, info)) != 0)
{
- img->xppi = (int)((float)info->x_pixels_per_unit * 0.0254);
- img->yppi = (int)((float)info->y_pixels_per_unit * 0.0254);
+ img->xppi = (int)((float)xppm * 0.0254);
+ img->yppi = (int)((float)yppm * 0.0254);
if (img->xppi == 0 || img->yppi == 0)
{
* Load one row at a time...
*/
- if (info->color_type == PNG_COLOR_TYPE_GRAY ||
- info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+ if (color_type == PNG_COLOR_TYPE_GRAY ||
+ color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
in = malloc(img->xsize);
else
in = malloc(img->xsize * 3);
* Interlaced images must be loaded all at once...
*/
- if (info->color_type == PNG_COLOR_TYPE_GRAY ||
- info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
+ if (color_type == PNG_COLOR_TYPE_GRAY ||
+ color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
in = malloc(img->xsize * img->ysize);
else
in = malloc(img->xsize * img->ysize * 3);
* Output this row...
*/
- if (info->color_type & PNG_COLOR_MASK_COLOR)
+ if (color_type & PNG_COLOR_MASK_COLOR)
{
if ((saturation != 100 || hue != 0) && bpp > 1)
cupsImageRGBAdjust(inptr, img->xsize, saturation, hue);
if (passes > 1)
{
- if (info->color_type & PNG_COLOR_MASK_COLOR)
+ if (color_type & PNG_COLOR_MASK_COLOR)
inptr += img->xsize * 3;
else
inptr += img->xsize;
}
png_read_end(pp, info);
- png_read_destroy(pp, info, NULL);
+ png_destroy_read_struct(&pp, &info, NULL);
fclose(fp);
free(in);
/*
- * End of "$Id: image-png.c 4741 2005-10-02 04:25:52Z mike $".
+ * End of "$Id: image-png.c 5452 2006-04-22 22:17:32Z mike $".
*/
#
-# "$Id: Makefile 5335 2006-03-24 02:56:20Z mike $"
+# "$Id: Makefile 5449 2006-04-22 04:05:45Z mike $"
#
# Locale file makefile for the Common UNIX Printing System (CUPS).
#
install: all
$(INSTALL_DIR) -m 755 $(LOCALEDIR)
for loc in $(LANGUAGES) ; do \
- $(INSTALL_DIR) -m 755 $(LOCALEDIR)/$$loc ; \
- $(INSTALL_DATA) cups_$$loc.po $(LOCALEDIR)/$$loc/cups_$$loc.po ; \
+ if test -f cups_$$loc.po; then \
+ $(INSTALL_DIR) -m 755 $(LOCALEDIR)/$$loc ; \
+ $(INSTALL_DATA) cups_$$loc.po $(LOCALEDIR)/$$loc/cups_$$loc.po ; \
+ fi ; \
done
#
-# End of "$Id: Makefile 5335 2006-03-24 02:56:20Z mike $".
+# End of "$Id: Makefile 5449 2006-04-22 04:05:45Z mike $".
#
msgstr ""
"Project-Id-Version: CUPS 1.2\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2006-03-23 21:52-0500\n"
+"POT-Creation-Date: 2006-04-14 14:35-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgstr ""
"Project-Id-Version: CUPS 1.2\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2006-03-23 21:52-0500\n"
+"POT-Creation-Date: 2006-04-14 14:35-0400\n"
"PO-Revision-Date: 2006-03-25 21:48+0100\n"
"Last-Translator: Juan Pablo González Riopedre <riopedre@tiscali.es>\n"
"Language-Team: Spanish\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit"
+"Content-Transfer-Encoding: 8bit\n"
msgid "Options Installed"
msgstr "Opciones instaladas"
"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%"
"s:%d%s</A>."
msgstr ""
-"Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://%"
-"s:%d%s</A>."
+"Debe acceder a esta página usando el URL <A HREF=\"https://%s:%d%s\">https://"
+"%s:%d%s</A>."
#, c-format
msgid "Unsupported format '%s'!"
"\n"
" -h Muestra cómo se usa el programa\n"
"\n"
-" Nota: este programa sólo valida los comentarios DSC, no el PostScript "
-"en sí mismo.\n"
-
+" Nota: este programa sólo valida los comentarios DSC, no el PostScript en "
+"sí mismo.\n"
msgstr ""
"Project-Id-Version: CUPS 1.2\n"
"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
-"POT-Creation-Date: 2006-03-23 21:52-0500\n"
+"POT-Creation-Date: 2006-04-14 14:35-0400\n"
"PO-Revision-Date: 2006-03-29 23:44+0900\n"
"Last-Translator: Kenshi Muto <kmuto@debian.org>\n"
"Language-Team: Japanese <LL@li.org>\n"
msgid ""
"You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%"
"s:%d%s</A>."
-msgstr "このページには URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A> を使ってアクセスする必要があります。"
+msgstr ""
+"このページには URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A> を使ってア"
+"クセスする必要があります。"
#, c-format
msgid "Unsupported format '%s'!"
"\n"
" -h プログラムの使い方を表示する\n"
"\n"
-" 注意: このプログラムは DSC コメントを検証するだけで、PostScript 自身を検証するものではありません。\n"
+" 注意: このプログラムは DSC コメントを検証するだけで、PostScript 自身を検"
+"証するものではありません。\n"
--- /dev/null
+# Swedish translation of cups
+#
+# "$Id$"
+#
+# Message catalog template for the Common UNIX Printing System (CUPS).
+#
+# Copyright 2005-2006 by Easy Software Products.
+#
+# These coded instructions, statements, and computer programs are the
+# property of Easy Software Products and are protected by Federal
+# copyright law. Distribution and use rights are outlined in the file
+# "LICENSE.txt" which should have been included with this file. If this
+# file is missing or damaged please contact Easy Software Products
+# at:
+#
+# Attn: CUPS Licensing Information
+# Easy Software Products
+# 44141 Airport View Drive, Suite 204
+# Hollywood, Maryland 20636 USA
+#
+# Voice: (301) 373-9600
+# EMail: cups-info@cups.org
+# WWW: http://www.cups.org
+#
+# Translated by:
+# Daniel Nylander <po@danielnylander.se>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: CUPS 1.2\n"
+"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n"
+"POT-Creation-Date: 2006-03-23 21:52-0500\n"
+"PO-Revision-Date: 2006-04-16 00:55+0100\n"
+"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "Options Installed"
+msgstr "Alternativ installerade"
+
+msgid "Class"
+msgstr "Klass"
+
+msgid "Printer"
+msgstr "Skrivare"
+
+msgid "Extra"
+msgstr "Extra"
+
+msgid "General"
+msgstr "Allmänt"
+
+msgid "Media Size"
+msgstr "Mediastorlek"
+
+msgid "Media Type"
+msgstr "Mediatyp"
+
+msgid "Media Source"
+msgstr "Mediakälla"
+
+msgid "Output Mode"
+msgstr "Utmatningsläge"
+
+msgid "Resolution"
+msgstr "Upplösning"
+
+msgid "Variable"
+msgstr "Variabel"
+
+msgid "Yes"
+msgstr "Ja"
+
+msgid "No"
+msgstr "Nej"
+
+msgid "Auto"
+msgstr "Auto"
+
+msgid "Enter your username and password or the root username and password to access this page."
+msgstr "Ange ditt användarnamn och lösenord eller root-användnamnet och lösenord för att komma åt denna sida."
+
+msgid "You must use a https: URL to access this page."
+msgstr "Du måste använda en https:-url för att komma åt denna sida."
+
+#, c-format
+msgid "Bad request version number %d.%d!"
+msgstr "Felaktigt versionsnummer %d.%d för begäran!"
+
+msgid "No attributes in request!"
+msgstr "Inga attribut i begäran!"
+
+#, c-format
+msgid "Attribute groups are out of order (%x < %x)!"
+msgstr "Attributgrupper fungerar inte (%x < %x)!"
+
+msgid "Missing required attributes!"
+msgstr "Saknar nödvändiga attribut!"
+
+#, c-format
+msgid "%s not supported!"
+msgstr "%s stöds inte!"
+
+msgid "The printer or class was not found."
+msgstr "Skrivaren eller klassen hittades inte."
+
+msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."
+msgstr "Printer-uri måste vara i formatet \"ipp://VÄRDNAMN/classes/KLASSNAMN\"."
+
+#, c-format
+msgid "The printer-uri \"%s\" contains invalid characters."
+msgstr "Printer-uri \"%s\" innehåller ogiltiga tecken."
+
+#, c-format
+msgid "A printer named \"%s\" already exists!"
+msgstr "En skrivare med namnet \"%s\" finns redan!"
+
+#, c-format
+msgid "Attempt to set %s printer-state to bad value %d!"
+msgstr "Försök att ställa in %s printer-state till felaktigt värde %d!"
+
+#, c-format
+msgid "add_class: Unknown printer-op-policy \"%s\"."
+msgstr "add_class: Okänd printer-op-policy \"%s\"."
+
+#, c-format
+msgid "add_class: Unknown printer-error-policy \"%s\"."
+msgstr "add_class: Okänd printer-error-policy \"%s\"."
+
+msgid "Unable to allocate memory for file types!"
+msgstr "Kunde inte allokera minne för filtyper!"
+
+#, c-format
+msgid "Character set \"%s\" not supported!"
+msgstr "Teckenkodningen \"%s\" stöds inte!"
+
+#, c-format
+msgid "Language \"%s\" not supported!"
+msgstr "Språket \"%s\" stöds inte!"
+
+#, c-format
+msgid "The notify-user-data value is too large (%d > 63 octets)!"
+msgstr "Värdet för notify-user-data är för stort (%d > 63 okteter)!"
+
+msgid "The notify-lease-duration attribute cannot be used with job subscriptions."
+msgstr "Attributet notify-lease-duration kan inte användas med jobbprenumerationer."
+
+msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."
+msgstr "Printer-uri måste vara i formatet \"ipp://VÄRDNAMN/printers/SKRIVARNAMN\"."
+
+#, c-format
+msgid "A class named \"%s\" already exists!"
+msgstr "En klass med namnet \"%s\" finns redan!"
+
+#, c-format
+msgid "File device URIs have been disabled! To enable, see the FileDevice directive in \"%s/cupsd.conf\"."
+msgstr "Felenhets URI:er har blivit inaktiverat! För att aktivera, se direktivet FileDevice i \"%s/cupsd.conf\"."
+
+#, c-format
+msgid "Bad device-uri \"%s\"!"
+msgstr "Felaktig device-uri \"%s\"!"
+
+#, c-format
+msgid "Bad port-monitor \"%s\"!"
+msgstr "Felaktig port-monitor \"%s\"!"
+
+#, c-format
+msgid "Bad printer-state value %d!"
+msgstr "Felaktigt värde för printer-state %d!"
+
+#, c-format
+msgid "Unknown printer-op-policy \"%s\"."
+msgstr "Okänd printer-op-policy \"%s\"."
+
+#, c-format
+msgid "Unknown printer-error-policy \"%s\"."
+msgstr "Okänd printer-error-policy \"%s\"."
+
+#, c-format
+msgid "Unable to copy interface script - %s!"
+msgstr "Kunde inte kopiera gränssnittsskript - %s!"
+
+#, c-format
+msgid "Unable to copy PPD file - %s!"
+msgstr "Kunde inte kopiera PPD-fil - %s!"
+
+msgid "Unable to copy PPD file!"
+msgstr "Kunde inte kopiera PPD-fil!"
+
+msgid "Got a printer-uri attribute but no job-id!"
+msgstr "Fick ett printer-uri-attribut men inget jobb-id!"
+
+#, c-format
+msgid "Bad job-uri attribute \"%s\"!"
+msgstr "Felaktigt attribut för job-uri \"%s\"!"
+
+#, c-format
+msgid "Job #%d doesn't exist!"
+msgstr "Jobb #%d finns inte!"
+
+#, c-format
+msgid "Job #%d is not held for authentication!"
+msgstr "Jobb #%d hålls inte kvar för autentisering!"
+
+#, c-format
+msgid "You are not authorized to authenticate job #%d owned by \"%s\"!"
+msgstr "Du är inte behörig att autentisera jobb #%d som ägs av \"%s\"!"
+
+msgid "The printer-uri attribute is required!"
+msgstr "Attributet printer-uri krävs!"
+
+msgid "Missing requesting-user-name attribute!"
+msgstr "Saknar attributet requesting-user-name!"
+
+#, c-format
+msgid "The printer-uri \"%s\" is not valid."
+msgstr "Printer-uri \"%s\" är inte giltig."
+
+#, c-format
+msgid "No active jobs on %s!"
+msgstr "Inga aktiva jobb på %s!"
+
+#, c-format
+msgid "You are not authorized to delete job #%d owned by \"%s\"!"
+msgstr "Du är inte behörig att ta bort jobb #%d som ägs av \"%s\"!"
+
+#, c-format
+msgid "Job #%d is already %s - can't cancel."
+msgstr "Jobb #%d är redan %s - kan inte avbryta."
+
+msgid "The printer or class is not shared!"
+msgstr "Skrivaren eller klassen är inte delad!"
+
+#, c-format
+msgid "Destination \"%s\" is not accepting jobs."
+msgstr "Målet \"%s\" accepterar inte jobb."
+
+#, c-format
+msgid "Bad copies value %d."
+msgstr "Felaktigt värde för kopior %d."
+
+#, c-format
+msgid "Bad page-ranges values %d-%d."
+msgstr "Felaktiga värden för page-ranges, %d-%d."
+
+msgid "Too many active jobs."
+msgstr "För många aktiva jobb."
+
+msgid "Quota limit reached."
+msgstr "Kvotgräns nådd."
+
+#, c-format
+msgid "Unable to add job for destination \"%s\"!"
+msgstr "Kunde inte lägga till jobb för målet \"%s\"!"
+
+msgid "No subscription attributes in request!"
+msgstr "Inga prenumerationsattribut i begäran!"
+
+msgid "notify-events not specified!"
+msgstr "notify-events inte angivet!"
+
+#, c-format
+msgid "Job %d not found!"
+msgstr "Jobb %d hittades inte!"
+
+msgid "No default printer"
+msgstr "Ingen standardskrivare"
+
+msgid "cups-deviced failed to execute."
+msgstr "cups-deviced misslyckades med att starta."
+
+msgid "cups-driverd failed to execute."
+msgstr "cups-driverd misslyckades med att starta."
+
+msgid "No destinations added."
+msgstr "Inga mål tillagda."
+
+#, c-format
+msgid "notify-subscription-id %d no good!"
+msgstr "notify-subscription-id %d inte bra!"
+
+#, c-format
+msgid "Job #%s does not exist!"
+msgstr "Jobb #%s finns inte!"
+
+#, c-format
+msgid "Job #%d does not exist!"
+msgstr "Jobb #%d finns inte!"
+
+msgid "No subscriptions found."
+msgstr "Inga prenumerationer hittades."
+
+#, c-format
+msgid "Not authorized to hold job #%d owned by \"%s\"!"
+msgstr "Inte behörig att hålla kvar jobb #%d som ägs av \"%s\"!"
+
+#, c-format
+msgid "Job #%d is finished and cannot be altered!"
+msgstr "Jobb #%d är färdigt och kan inte förändras!"
+
+#, c-format
+msgid "You are not authorized to move job #%d owned by \"%s\"!"
+msgstr "Du är inte behörig att flytta jobbet #%d som ägs av \"%s\"!"
+
+msgid "job-printer-uri attribute missing!"
+msgstr "Attributet job-printer-uri saknas!"
+
+#, c-format
+msgid "Unsupported compression \"%s\"!"
+msgstr "Komprimeringen \"%s\" stöds inte!"
+
+msgid "No file!?!"
+msgstr "Ingen fil!?!"
+
+#, c-format
+msgid "Could not scan type \"%s\"!"
+msgstr "Kunde inte söka av typen \"%s\"!"
+
+#, c-format
+msgid "Unsupported format '%s/%s'!"
+msgstr "Formatet \"%s/%s\" stöds inte!"
+
+msgid "Printer not shared!"
+msgstr "Skrivaren är inte delad!"
+
+#, c-format
+msgid "Too many jobs - %d jobs, max jobs is %d."
+msgstr "För många jobb - %d jobb, max antal jobb är %d."
+
+#, c-format
+msgid "Job #%d is not held!"
+msgstr "Jobb #%d hålls inte kvar!"
+
+#, c-format
+msgid "You are not authorized to release job id %d owned by \"%s\"!"
+msgstr "Du är inte behörig att släppa jobb-id %d som ägs av \"%s\"!"
+
+#, c-format
+msgid "Job #%d is not complete!"
+msgstr "Jobb #%d är inte färdigt!"
+
+#, c-format
+msgid "Job #%d cannot be restarted - no files!"
+msgstr "Jobb #%d kan inte startas om - inga filer!"
+
+#, c-format
+msgid "You are not authorized to restart job id %d owned by \"%s\"!"
+msgstr "Du är inte behörig att starta om jobb-id %d som ägs av \"%s\"!"
+
+#, c-format
+msgid "You are not authorized to send document for job #%d owned by \"%s\"!"
+msgstr "Du är inte behörig att skicka dokument för jobb #%d som ägs av \"%s\"!"
+
+#, c-format
+msgid "Bad document-format \"%s\"!"
+msgstr "Felaktigt document-format \"%s\"!"
+
+#, c-format
+msgid "You are not authorized to alter job id %d owned by \"%s\"!"
+msgstr "Du är inte behörig att ändra jobb-id %d som ägs av \"%s\"!"
+
+#, c-format
+msgid "%s cannot be changed."
+msgstr "%s kan inte ändras."
+
+msgid "Bad job-priority value!"
+msgstr "Felaktigt värde för job-priority!"
+
+msgid "Job is completed and cannot be changed."
+msgstr "Jobbet är färdigt och kan inte ändras."
+
+msgid "Bad job-state value!"
+msgstr "Felaktigt värde för job-state!"
+
+msgid "Job state cannot be changed."
+msgstr "Jobbtillstånd kan inte ändras."
+
+#, c-format
+msgid "Unsupported compression attribute %s!"
+msgstr "Komprimeringsattributet %s stöds inte!"
+
+#, c-format
+msgid "Unsupported format \"%s\"!"
+msgstr "Formatet \"%s\" stöds inte!"
+
+#, c-format
+msgid "%s is not implemented by the CUPS version of lpc.\n"
+msgstr "%s är inte implementerad i CUPS-versionen av lpc.\n"
+
+msgid ""
+"Commands may be abbreviated. Commands are:\n"
+"\n"
+"exit help quit status ?\n"
+msgstr ""
+"Kommandon kan förkortas. Kommandon är:\n"
+"\n"
+"exit help quit status ?\n"
+
+msgid "help\t\tget help on commands\n"
+msgstr "help\t\tfå hjälp för kommandon\n"
+
+msgid "status\t\tshow status of daemon and queue\n"
+msgstr "status\t\tvisa status för demon och kö\n"
+
+msgid "?Invalid help command unknown\n"
+msgstr "?Ogiltigt hjälpkommando okänt\n"
+
+#, c-format
+msgid "\tprinter is on device '%s' speed -1\n"
+msgstr "\tskrivare finns på enhet \"%s\" hastighet -1\n"
+
+msgid "\tqueuing is enabled\n"
+msgstr "\tköläggning är aktiverad\n"
+
+msgid "\tqueuing is disabled\n"
+msgstr "\tköläggning är inaktiverad\n"
+
+msgid "\tprinting is enabled\n"
+msgstr "\tutskrifter är aktiverat\n"
+
+msgid "\tprinting is disabled\n"
+msgstr "\tutskrifter är inaktiverat\n"
+
+msgid "\tno entries\n"
+msgstr "\tinga objekt\n"
+
+#, c-format
+msgid "\t%d entries\n"
+msgstr "\t%d objekt\n"
+
+msgid "\tdaemon present\n"
+msgstr "\tdemon närvarande\n"
+
+msgid "lpq: Unable to contact server!\n"
+msgstr "lpq: Kunde inte kontakta server!\n"
+
+#, c-format
+msgid "%s: Sorry, no encryption support compiled in!\n"
+msgstr "%s: Tyvärr, inget stöd för kryptering har byggts in!\n"
+
+#, c-format
+msgid "lpq: Unknown destination \"%s/%s\"!\n"
+msgstr "lpq: Okänt mål \"%s/%s\"!\n"
+
+#, c-format
+msgid "lpq: Unknown destination \"%s\"!\n"
+msgstr "lpq: Okänt mål \"%s\"!\n"
+
+#, c-format
+msgid "lp: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "lp: fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n"
+
+msgid "lpq: error - no default destination available.\n"
+msgstr "lpq: fel - inget standardmål tillgängligt.\n"
+
+#, c-format
+msgid "lpq: get-jobs failed: %s\n"
+msgstr "lpq: get-jobs misslyckades: %s\n"
+
+msgid "Rank Owner Pri Job Files Total Size\n"
+msgstr "Rank Ägare Pri Jobb Filer Total storlek\n"
+
+msgid "Rank Owner Job File(s) Total Size\n"
+msgstr "Rank Ägare Jobb Fil(er) Total storlek\n"
+
+#, c-format
+msgid "%s: %-33.33s [job %d localhost]\n"
+msgstr "%s: %-33.33s [jobb %d localhost]\n"
+
+#, c-format
+msgid " %-39.39s %.0f bytes\n"
+msgstr " %-39.39s %.0f byte\n"
+
+#, c-format
+msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n"
+msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte\n"
+
+#, c-format
+msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n"
+msgstr "%-7s %-7.7s %-7d %-31.31s %.0f byte\n"
+
+msgid "no entries\n"
+msgstr "inga objekt\n"
+
+#, c-format
+msgid "lpq: get-printer-attributes failed: %s\n"
+msgstr "lpq: get-printer-attributes misslyckades: %s\n"
+
+#, c-format
+msgid "%s is ready\n"
+msgstr "%s är klar\n"
+
+#, c-format
+msgid "%s is ready and printing\n"
+msgstr "%s är klar och skriver ut\n"
+
+#, c-format
+msgid "%s is not ready\n"
+msgstr "%s är inte klar\n"
+
+msgid "Usage: lpq [-P dest] [-l] [+interval]\n"
+msgstr "Användning: lpq [-P mål] [-l] [+intervall]\n"
+
+#, c-format
+msgid "lpr: error - expected value after -%c option!\n"
+msgstr "lpr: fel - förväntade värde efter flaggan -%c!\n"
+
+#, c-format
+msgid "lpr: warning - '%c' format modifier not supported - output may not be correct!\n"
+msgstr "lpr: varning - \"%c\"-formatmodifierare stöds inte - utmatning kanske inte blir korrekt!\n"
+
+msgid "lpr: error - expected option=value after -o option!\n"
+msgstr "lpr: fel - förväntade alternativ=värde efter flaggan -o!\n"
+
+msgid "lpr: warning - email notification is not currently supported!\n"
+msgstr "lpr: varning - e-postnotifiering stöds inte för närvarande!\n"
+
+msgid "lpr: error - expected destination after -P option!\n"
+msgstr "lpr: fel - förväntade mål efter flaggan -P!\n"
+
+msgid "lpr: error - expected copy count after -# option!\n"
+msgstr "lpr: fel - förväntade kopieantal efter flaggan -#!\n"
+
+#, c-format
+msgid "lpr: error - expected name after -%c option!\n"
+msgstr "lpr: fel - förväntade namn efter flaggan -%c!\n"
+
+msgid "lpr: error - expected username after -U option!\n"
+msgstr "lpr: fel - förväntade användarnamn efter flaggan -U!\n"
+
+#, c-format
+msgid "lpr: error - unknown option '%c'!\n"
+msgstr "lpr: fel - okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "lpr: error - unable to access \"%s\" - %s\n"
+msgstr "lpr: fel - kunde inte komma åt \"%s\" - %s\n"
+
+#, c-format
+msgid "lpr: error - too many files - \"%s\"\n"
+msgstr "lpr: fel - för många filer - \"%s\"\n"
+
+#, c-format
+msgid "lpr: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "lpr: fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n"
+
+msgid "lpr: error - no default destination available.\n"
+msgstr "lpr: fel - inget standardmål tillgängligt.\n"
+
+msgid "lpr: error - scheduler not responding!\n"
+msgstr "lpr: fel - schemaläggare svarar inte!\n"
+
+#, c-format
+msgid "lpr: error - unable to create temporary file \"%s\" - %s\n"
+msgstr "lpr: fel - kunde inte skapa temporärfil \"%s\" - %s\n"
+
+#, c-format
+msgid "lpr: error - unable to write to temporary file \"%s\" - %s\n"
+msgstr "lpr: fel - kunde inte skriva till temporärfil \"%s\" - %s\n"
+
+msgid "lpr: error - stdin is empty, so no job has been sent.\n"
+msgstr "lpr: fel - standard in är tom, så inga jobb har skickats.\n"
+
+#, c-format
+msgid "lpr: error - unable to print file: %s\n"
+msgstr "lpr: fel - kunde inte skriva ut fil: %s\n"
+
+msgid "lprm: Unable to contact server!\n"
+msgstr "lprm: Kunde inte kontakta server!\n"
+
+#, c-format
+msgid "lprm: Unknown destination \"%s\"!\n"
+msgstr "lprm: Okänt mål \"%s\"!\n"
+
+#, c-format
+msgid "lprm: Unknown option '%c'!\n"
+msgstr "lprm: Okänd flagga \"%c\"!\n"
+
+msgid "lprm: Job or printer not found!\n"
+msgstr "lprm: Jobb eller skrivare hittades inte!\n"
+
+msgid "lprm: Not authorized to lprm job(s)!\n"
+msgstr "lprm: Inte behörig att ta bort jobb!\n"
+
+#, c-format
+msgid "lprm: You don't own job ID %d!\n"
+msgstr "lprm: Du äger inte jobb-id %d!\n"
+
+msgid "lprm: Unable to lprm job(s)!\n"
+msgstr "lprm: Kunde inte ta bort jobb!\n"
+
+msgid "lprm: Unable to cancel job(s)!\n"
+msgstr "lprm: Kunde inte avbryta jobb!\n"
+
+#, c-format
+msgid "%s: Don't know what to do!\n"
+msgstr "%s: Vet inte vad som ska göras!\n"
+
+#, c-format
+msgid "%s: Expected server name after -h!\n"
+msgstr "%s: Förväntade servernamn efter -h!\n"
+
+#, c-format
+msgid "%s: Expected reason text after -r!\n"
+msgstr "%s: Förväntade anledningstext efter -r!\n"
+
+#, c-format
+msgid "%s: Unknown option '%c'!\n"
+msgstr "%s: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "%s: Unable to connect to server: %s\n"
+msgstr "%s: Kunde inte ansluta till server: %s\n"
+
+#, c-format
+msgid "%s: Operation failed: %s\n"
+msgstr "%s: Åtgärd misslyckades: %s\n"
+
+msgid "cancel: Error - expected hostname after '-h' option!\n"
+msgstr "cancel: Fel - förväntade värdnamn efter flaggan \"-h\"!\n"
+
+msgid "cancel: Error - expected username after '-u' option!\n"
+msgstr "cancel: Fel - förväntade användarnamn efter flaggan \"-u\"!\n"
+
+#, c-format
+msgid "cancel: Unknown option '%c'!\n"
+msgstr "cancel: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "cancel: Unknown destination \"%s\"!\n"
+msgstr "cancel: Okänt mål \"%s\"!\n"
+
+msgid "cancel: Unable to contact server!\n"
+msgstr "cancel: Kunde inte kontakta server!\n"
+
+#, c-format
+msgid "cancel: %s failed: %s\n"
+msgstr "cancel: %s misslyckades: %s\n"
+
+#, c-format
+msgid "cupsaddsmb: Missing value on line %d!\n"
+msgstr "cupsaddsmb: Saknar värde på rad %d!\n"
+
+#, c-format
+msgid "cupsaddsmb: Missing double quote on line %d!\n"
+msgstr "cupsaddsmb: Saknar citattecken på rad %d!\n"
+
+#, c-format
+msgid "cupsaddsmb: Bad option + choice on line %d!\n"
+msgstr "cupsaddsmb: Felaktigt alternativ + val på rad %d!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to connect to server \"%s\" for %s - %s\n"
+msgstr "cupsaddsmb: Kunde inte ansluta till server \"%s\" för %s - %s\n"
+
+#, c-format
+msgid "cupsaddsmb: No PPD file for printer \"%s\" - skipping!\n"
+msgstr "cupsaddsmb: Ingen PPD-fil för skrivaren \"%s\" - hoppar över!\n"
+
+#, c-format
+msgid "cupsaddsmb: get-printer-attributes failed for \"%s\": %s\n"
+msgstr "cupsaddsmb: get-printer-attributes misslyckades för \"%s\": %s\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to convert PPD file for %s - %s\n"
+msgstr "cupsaddsmb: Kunde inte konvertera PPD-fil för %s - %s\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to copy Windows 2000 printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte kopiera filer för Windows 2000-skrivardrivrutin (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to copy CUPS printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte kopiera filer för CUPS-skrivardrivrutin (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to install Windows 2000 printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte installera filer för Windows 2000-skrivardrivrutin (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to copy Windows 9x printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte kopiera filer för Windows 9x-skrivardrivrutin (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to install Windows 9x printer driver files (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte installera filer för Windows 9x-skrivardrivrutin (%d)!\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to set Windows printer driver (%d)!\n"
+msgstr "cupsaddsmb: Kunde inte ställa in Windows-skrivardrivrutin (%d)!\n"
+
+msgid ""
+"Usage: cupsaddsmb [options] printer1 ... printerN\n"
+" cupsaddsmb [options] -a\n"
+"\n"
+"Options:\n"
+" -H samba-server Use the named SAMBA server\n"
+" -U samba-user Authenticate using the named SAMBA user\n"
+" -a Export all printers\n"
+" -h cups-server Use the named CUPS server\n"
+" -v Be verbose (show commands)\n"
+msgstr ""
+"Användning: cupsaddsmb [flaggor] skrivare1 ... skrivareN\n"
+" cupsaddsmb [flaggor] -a\n"
+"\n"
+"Flaggor:\n"
+" -H samba-server Använd angiven SAMBA-server\n"
+" -U samba-användare Autentisera med angiven SAMBA-användare\n"
+" -a Exportera alla skrivare\n"
+" -h cups-server Använd angiven CUPS-server\n"
+" -v Var information (visa kommandon)\n"
+
+msgid "cupstestppd: The -q option is incompatible with the -v option.\n"
+msgstr "cupstestppd: Flaggan -q är inte kompatibel med flaggan -v.\n"
+
+msgid "cupstestppd: The -v option is incompatible with the -q option.\n"
+msgstr "cupstestppd: Flaggan -v är inte kompatibel med flaggan -q.\n"
+
+#, c-format
+msgid ""
+" FAIL\n"
+" **FAIL** Unable to open PPD file - %s\n"
+msgstr ""
+" FEL\n"
+" **FEL** Kunde inte öppna PPD-fil - %s\n"
+
+#, c-format
+msgid ""
+" FAIL\n"
+" **FAIL** Unable to open PPD file - %s on line %d.\n"
+msgstr ""
+" FEL\n"
+" **FEL** Kunde inte öppna PPD-fil - %s på rad %d.\n"
+
+msgid " REF: Page 42, section 5.2.\n"
+msgstr " REF: Sida 42, sektion 5.2.\n"
+
+msgid " REF: Page 20, section 3.4.\n"
+msgstr " REF: Sida 20, sektion 3.4.\n"
+
+msgid " REF: Pages 45-46, section 5.2.\n"
+msgstr " REF: Sidorna 45-46, sektion 5.2.\n"
+
+msgid " REF: Pages 42-45, section 5.2.\n"
+msgstr " REF: Sidorna 42-45, sektion 5.2.\n"
+
+msgid " REF: Pages 48-49, section 5.2.\n"
+msgstr " REF: Sidorna 48-49, sektion 5.2.\n"
+
+msgid " REF: Pages 52-54, section 5.2.\n"
+msgstr " REF: Sidorna 52-54, sektion 5.2.\n"
+
+msgid " REF: Page 15, section 3.2.\n"
+msgstr " REF: Sida 15, sektion 3.2.\n"
+
+msgid " REF: Page 15, section 3.1.\n"
+msgstr " REF: Sida 15, sektion 3.1.\n"
+
+msgid " REF: Pages 16-17, section 3.2.\n"
+msgstr " REF: Sidorna 16-17, sektion 3.2.\n"
+
+msgid " REF: Page 19, section 3.3.\n"
+msgstr " REF: Sida 19, sektion 3.3.\n"
+
+msgid " REF: Page 27, section 3.5.\n"
+msgstr " REF: Sida 27, sektion 3.5.\n"
+
+msgid ""
+"\n"
+" DETAILED CONFORMANCE TEST RESULTS\n"
+msgstr ""
+"\n"
+" DETALJERADE TESTRESULTAT\n"
+
+#, c-format
+msgid " WARN %s has no corresponding options!\n"
+msgstr " VARN %s har inga motsvarande alternativ!\n"
+
+msgid " FAIL\n"
+msgstr " FEL\n"
+
+msgid ""
+" **FAIL** REQUIRED DefaultImageableArea\n"
+" REF: Page 102, section 5.15.\n"
+msgstr ""
+" **FEL** KRÄVER DefaultImageableArea\n"
+" REF: Sida 102, sektion 5.15.\n"
+
+#, c-format
+msgid ""
+" **FAIL** BAD DefaultImageableArea %s!\n"
+" REF: Page 102, section 5.15.\n"
+msgstr ""
+" **FEL** FELAKTIG DefaultImageableArea %s!\n"
+" REF: Sida 102, sektion 5.15.\n"
+
+msgid " PASS DefaultImageableArea\n"
+msgstr " OK DefaultImageableArea\n"
+
+msgid ""
+" **FAIL** REQUIRED DefaultPaperDimension\n"
+" REF: Page 103, section 5.15.\n"
+msgstr ""
+" **FEL** KRÄVER DefaultPaperDimension\n"
+" REF: Sida 103, sektion 5.15.\n"
+
+#, c-format
+msgid ""
+" **FAIL** BAD DefaultPaperDimension %s!\n"
+" REF: Page 103, section 5.15.\n"
+msgstr ""
+" **FEL** FELAKTIG DefaultPaperDimension %s!\n"
+" REF: Sida 103, sektion 5.15.\n"
+
+msgid " PASS DefaultPaperDimension\n"
+msgstr " OK DefaultPaperDimension\n"
+
+#, c-format
+msgid ""
+" **FAIL** BAD Default%s %s\n"
+" REF: Page 40, section 4.5.\n"
+msgstr ""
+" **FEL** FELAKTIG Standard%s %s\n"
+" REF: Sida 40, sektion 4.5.\n"
+
+#, c-format
+msgid " PASS Default%s\n"
+msgstr " OK Standard%s\n"
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED Default%s\n"
+" REF: Page 40, section 4.5.\n"
+msgstr ""
+" **FEL** Standard%s KRÄVS\n"
+" REF: Sida 40, sektion 4.5.\n"
+
+msgid " PASS FileVersion\n"
+msgstr " OK FileVersion\n"
+
+msgid ""
+" **FAIL** REQUIRED FileVersion\n"
+" REF: Page 56, section 5.3.\n"
+msgstr ""
+" **FEL** FileVersion KRÄVS\n"
+" REF: Sida 56, sektion 5.3.\n"
+
+msgid " PASS FormatVersion\n"
+msgstr " OK FormatVersion\n"
+
+msgid ""
+" **FAIL** REQUIRED FormatVersion\n"
+" REF: Page 56, section 5.3.\n"
+msgstr ""
+" **FEL** KRÄVER FormatVersion\n"
+" REF: Sida 56, sektion 5.3.\n"
+
+msgid " PASS LanguageEncoding\n"
+msgstr " OK LanguageEncoding\n"
+
+msgid ""
+" **FAIL** REQUIRED LanguageEncoding\n"
+" REF: Pages 56-57, section 5.3.\n"
+msgstr ""
+" **FEL** KRÄVER LanguageEncoding\n"
+" REF: Sidorna 56-57, sektion 5.3.\n"
+
+msgid " PASS LanguageVersion\n"
+msgstr " OK LanguageVersion\n"
+
+msgid ""
+" **FAIL** REQUIRED LanguageVersion\n"
+" REF: Pages 57-58, section 5.3.\n"
+msgstr ""
+" **FEL** KRÄVER LanguageVersion\n"
+" REF: Sidorna 57-58, sektion 5.3.\n"
+
+msgid ""
+" **FAIL** BAD Manufacturer (should be \"HP\")\n"
+" REF: Page 211, table D.1.\n"
+msgstr ""
+" **FEL** FELAKTIG Manufacturer (ska vara \"HP\")\n"
+" REF: Sida 211, tabell D.1.\n"
+
+msgid " PASS Manufacturer\n"
+msgstr " OK Manufacturer\n"
+
+msgid ""
+" **FAIL** REQUIRED Manufacturer\n"
+" REF: Pages 58-59, section 5.3.\n"
+msgstr ""
+" **FEL** KRÄVER Manufacturer\n"
+" REF: Sidorna 58-59, sektion 5.3.\n"
+
+#, c-format
+msgid ""
+" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n"
+" REF: Pages 59-60, section 5.3.\n"
+msgstr ""
+" **FEL** FELAKTIG ModelName - \"%c\" tillåts inte i sträng.\n"
+" REF: Sidorna 59-60, sektion 5.3.\n"
+
+msgid " PASS ModelName\n"
+msgstr " OK ModelName\n"
+
+msgid ""
+" **FAIL** REQUIRED ModelName\n"
+" REF: Pages 59-60, section 5.3.\n"
+msgstr ""
+" **FEL** KRÄVER ModelName\n"
+" REF: Sidorna 59-60, sektion 5.3.\n"
+
+msgid " PASS NickName\n"
+msgstr " OK NickName\n"
+
+msgid ""
+" **FAIL** REQUIRED NickName\n"
+" REF: Page 60, section 5.3.\n"
+msgstr ""
+" **FEL** KRÄVER NickName\n"
+" REF: Sida 60, sektion 5.3.\n"
+
+msgid " PASS PageSize\n"
+msgstr " OK PageSize\n"
+
+msgid ""
+" **FAIL** REQUIRED PageSize\n"
+" REF: Pages 99-100, section 5.14.\n"
+msgstr ""
+" **FEL** KRÄVER PageSize\n"
+" REF: Sidorna 99-100, sektion 5.14.\n"
+
+msgid " PASS PageRegion\n"
+msgstr " OK PageRegion\n"
+
+msgid ""
+" **FAIL** REQUIRED PageRegion\n"
+" REF: Page 100, section 5.14.\n"
+msgstr ""
+" **FEL** KRÄVER PageRegion\n"
+" REF: Sida 100, sektion 5.14.\n"
+
+msgid " PASS PCFileName\n"
+msgstr " OK PCFileName\n"
+
+msgid ""
+" **FAIL** REQUIRED PCFileName\n"
+" REF: Pages 61-62, section 5.3.\n"
+msgstr ""
+" **FEL** KRÄVER PCFileName\n"
+" REF: Sidorna 61-62, sektion 5.3.\n"
+
+msgid ""
+" **FAIL** BAD Product - not \"(string)\".\n"
+" REF: Page 62, section 5.3.\n"
+msgstr ""
+" **FEL** FELAKTIG Product - inte \"(string)\".\n"
+" REF: Sida 62, sektion 5.3.\n"
+
+msgid " PASS Product\n"
+msgstr " OK Product\n"
+
+msgid ""
+" **FAIL** REQUIRED Product\n"
+" REF: Page 62, section 5.3.\n"
+msgstr ""
+" **FEL** KRÄVER Product\n"
+" REF: Sida 62, sektion 5.3.\n"
+
+msgid ""
+" **FAIL** BAD PSVersion - not \"(string) int\".\n"
+" REF: Pages 62-64, section 5.3.\n"
+msgstr ""
+" **FEL** FELAKTIG PSVersion - inte \"(string) int\".\n"
+" REF: Sidorna 62-64, sektion 5.3.\n"
+
+msgid " PASS PSVersion\n"
+msgstr " OK PSVersion\n"
+
+msgid ""
+" **FAIL** REQUIRED PSVersion\n"
+" REF: Pages 62-64, section 5.3.\n"
+msgstr ""
+" **FEL** KRÄVER PSVersion\n"
+" REF: Sidorna 62-64, sektion 5.3.\n"
+
+msgid ""
+" **FAIL** BAD ShortNickName - longer than 31 chars.\n"
+" REF: Pages 64-65, section 5.3.\n"
+msgstr ""
+" **FEL** FELAKTIG ShortNickName - längre än 31 tecken.\n"
+" REF: Sidorna 64-65, sektion 5.3.\n"
+
+msgid " PASS ShortNickName\n"
+msgstr " OK ShortNickName\n"
+
+msgid ""
+" **FAIL** REQUIRED ShortNickName\n"
+" REF: Page 64-65, section 5.3.\n"
+msgstr ""
+" **FEL** KRÄVER ShortNickName\n"
+" REF: Sida 64-65, sektion 5.3.\n"
+
+msgid ""
+" **FAIL** BAD JobPatchFile attribute in file\n"
+" REF: Page 24, section 3.4.\n"
+msgstr ""
+" **FEL** FELAKTIGT JobPatchFile-attribut i fil\n"
+" REF: Sida 24, sektion 3.4.\n"
+
+msgid ""
+" **FAIL** REQUIRED PageSize\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 99, section 5.14.\n"
+msgstr ""
+" **FEL** KRÄVER PageSize\n"
+" REF: Sida 41, sektion 5.\n"
+" REF: Sida 99, sektion 5.14.\n"
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED ImageableArea for PageSize %s\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 102, section 5.15.\n"
+msgstr ""
+" **FEL** KRÄVER ImageableArea för PageSize %s\n"
+" REF: Sida 41, sektion 5.\n"
+" REF: Sida 102, sektion 5.15.\n"
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED PaperDimension for PageSize %s\n"
+" REF: Page 41, section 5.\n"
+" REF: Page 103, section 5.15.\n"
+msgstr ""
+" **FEL** KRÄVER PaperDimension för PageSize %s\n"
+" REF: Sida 41, sektion 5.\n"
+" REF: Sida 103, sektion 5.15.\n"
+
+#, c-format
+msgid ""
+" **FAIL** Bad %s choice %s!\n"
+" REF: Page 84, section 5.9\n"
+msgstr ""
+" **FEL** Felaktigt %s val %s!\n"
+" REF: Sida 84, sektion 5.9\n"
+
+#, c-format
+msgid ""
+" **FAIL** REQUIRED %s does not define choice None!\n"
+" REF: Page 122, section 5.17\n"
+msgstr ""
+" **FEL** KRÄVER %s definerar inte valet None!\n"
+" REF: Sida 122, sektion 5.17\n"
+
+#, c-format
+msgid ""
+" **FAIL** Bad %s choice %s!\n"
+" REF: Page 122, section 5.17\n"
+msgstr ""
+" **FEL** Felaktigt %s val %s!\n"
+" REF: Sida 122, sektion 5.17\n"
+
+msgid " PASS\n"
+msgstr " OK\n"
+
+#, c-format
+msgid ""
+" WARN Duplex option keyword %s should be named Duplex or JCLDuplex!\n"
+" REF: Page 122, section 5.17\n"
+msgstr ""
+" VARN Nyckelord för Duplex-alternativet %s bör vara Duplex eller JCLDuplex!\n"
+" REF: Sida 122, sektion 5.17\n"
+
+msgid " WARN Default choices conflicting!\n"
+msgstr " VARN Standardvalen i konflikt!\n"
+
+#, c-format
+msgid ""
+" WARN Obsolete PPD version %.1f!\n"
+" REF: Page 42, section 5.2.\n"
+msgstr ""
+" VARN Föråldrad PPD-version %.1f!\n"
+" REF: Sida 42, sektion 5.2.\n"
+
+msgid ""
+" WARN LanguageEncoding required by PPD 4.3 spec.\n"
+" REF: Pages 56-57, section 5.3.\n"
+msgstr ""
+" VARN LanguageEncoding krävs av PPD 4.3-spec.\n"
+" REF: Sidorna 56-57, sektion 5.3.\n"
+
+msgid ""
+" WARN Manufacturer required by PPD 4.3 spec.\n"
+" REF: Pages 58-59, section 5.3.\n"
+msgstr ""
+" VARN Manufacturer krävs av PPD 4.3-spec.\n"
+" REF: Sidorna 58-59, sektion 5.3.\n"
+
+msgid ""
+" WARN PCFileName longer than 8.3 in violation of PPD spec.\n"
+" REF: Pages 61-62, section 5.3.\n"
+msgstr ""
+" VARN PCFileName längre än 8.3 i strid med PPD-spec.\n"
+" REF: Sidorna 61-62, sektion 5.3.\n"
+
+msgid ""
+" WARN ShortNickName required by PPD 4.3 spec.\n"
+" REF: Pages 64-65, section 5.3.\n"
+msgstr ""
+" VARN ShortNickName krävs av PPD 4.3-spec.\n"
+" REF: Sidorna 64-65, sektion 5.3.\n"
+
+msgid ""
+" WARN Protocols contains both PJL and BCP; expected TBCP.\n"
+" REF: Pages 78-79, section 5.7.\n"
+msgstr ""
+" VARN Protokollen innehåller både PJL och BCP; förväntade TBCP.\n"
+" REF: Sidorna 78-79, sektion 5.7.\n"
+
+msgid ""
+" WARN Protocols contains PJL but JCL attributes are not set.\n"
+" REF: Pages 78-79, section 5.7.\n"
+msgstr ""
+" VARN Protokollen innehåller PJL men JCL-attributen är inte inställda.\n"
+" REF: Sidorna 78-79, sektion 5.7.\n"
+
+#, c-format
+msgid ""
+" WARN %s shares a common prefix with %s\n"
+" REF: Page 15, section 3.2.\n"
+msgstr ""
+" VARN %s delar ett vanligt prefix med %s\n"
+" REF: Sida 15, sektion 3.2.\n"
+
+#, c-format
+msgid " %d ERROR%s FOUND\n"
+msgstr " %d FEL%s HITTADES\n"
+
+msgid " NO ERRORS FOUND\n"
+msgstr " INGA FEL HITTADES\n"
+
+#, c-format
+msgid ""
+" WARN \"%s %s\" conflicts with \"%s %s\"\n"
+" (constraint=\"%s %s %s %s\")\n"
+msgstr ""
+" VARN \"%s %s\" konfliktar med \"%s %s\"\n"
+" (begränsare=\"%s %s %s %s\")\n"
+
+msgid ""
+"Usage: cupstestppd [-q] [-r] [-v[v]] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n"
+" program | cupstestppd [-q] [-r] [-v[v]] -\n"
+msgstr ""
+"Användning: cupstestppd [-q] [-r] [-v[v]] filnamn1.ppd[.gz] [... filnamnN.ppd[.gz]]\n"
+" program | cupstestppd [-q] [-r] [-v[v]] -\n"
+
+msgid "lpstat: Need \"completed\" or \"not-completed\" after -W!\n"
+msgstr "lpstat: Behöver \"completed\" eller \"not-completed\" efter -W!\n"
+
+msgid "lpstat: The -b option requires a destination argument.\n"
+msgstr "lpstat: Flaggan -b kräver ett målargument.\n"
+
+msgid "Error: need hostname after '-h' option!\n"
+msgstr "Fel: behöver värdnamn efter flaggan \"-h\"!\n"
+
+#, c-format
+msgid "lpstat: Unknown option '%c'!\n"
+msgstr "lpstat: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "lpstat: Invalid destination name in list \"%s\"!\n"
+msgstr "lpstat: Ogiltigt målnamn i listan \"%s\"!\n"
+
+#, c-format
+msgid "lpstat: Unknown destination \"%s\"!\n"
+msgstr "lpstat: Okänt mål \"%s\"!\n"
+
+#, c-format
+msgid "lpstat: Unable to connect to server %s on port %d: %s\n"
+msgstr "lpstat: Kunde inte ansluta till server %s på port %d: %s\n"
+
+#, c-format
+msgid "lpstat: get-printers failed: %s\n"
+msgstr "lpstat: get-printers misslyckades: %s\n"
+
+#, c-format
+msgid "%s accepting requests since Jan 01 00:00\n"
+msgstr "%s accepterar begäran sedan Jan 01 00:00\n"
+
+#, c-format
+msgid ""
+"%s not accepting requests since Jan 01 00:00 -\n"
+"\t%s\n"
+msgstr ""
+"%s accepterar inte begäran sedan Jan 01 00:00 -\n"
+"\t%s\n"
+
+#, c-format
+msgid "%s/%s accepting requests since Jan 01 00:00\n"
+msgstr "%s/%s accepterar begäran sedan Jan 01 00:00\n"
+
+#, c-format
+msgid ""
+"%s/%s not accepting requests since Jan 01 00:00 -\n"
+"\t%s\n"
+msgstr ""
+"%s/%s accepterar inte begäran sedan Jan 01 00:00 -\n"
+"\t%s\n"
+
+#, c-format
+msgid "lpstat: get-classes failed: %s\n"
+msgstr "lpstat: get-classes misslyckades: %s\n"
+
+#, c-format
+msgid "members of class %s:\n"
+msgstr "medlemmar av klassen %s:\n"
+
+#, c-format
+msgid "system default destination: %s/%s\n"
+msgstr "systemstandardmål: %s/%s\n"
+
+#, c-format
+msgid "system default destination: %s\n"
+msgstr "systemstandardmål: %s\n"
+
+#, c-format
+msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "lpstat: fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n"
+
+msgid "no system default destination\n"
+msgstr "inget systemstandardmål\n"
+
+#, c-format
+msgid "Output for printer %s is sent to remote printer %s on %s\n"
+msgstr "Utmatning för skrivaren %s skickas till fjärrskrivaren %s på %s\n"
+
+#, c-format
+msgid "Output for printer %s is sent to %s\n"
+msgstr "Utmatning för skrivaren %s skickas till %s\n"
+
+#, c-format
+msgid "Output for printer %s/%s is sent to remote printer %s on %s\n"
+msgstr "Utmatning för skrivaren %s/%s skickas till fjärrskrivaren %s på %s\n"
+
+#, c-format
+msgid "Output for printer %s/%s is sent to %s\n"
+msgstr "Utmatning för skrivaren %s/%s skickas till %s\n"
+
+#, c-format
+msgid "device for %s: %s\n"
+msgstr "enhet för %s: %s\n"
+
+#, c-format
+msgid "device for %s/%s: %s\n"
+msgstr "enhet för %s/%s: %s\n"
+
+#, c-format
+msgid "lpstat: get-jobs failed: %s\n"
+msgstr "lpstat: get-jobs misslyckades: %s\n"
+
+#, c-format
+msgid "\tqueued for %s\n"
+msgstr "\tkölagd för %s\n"
+
+#, c-format
+msgid "printer %s is idle. enabled since %s\n"
+msgstr "skrivare %s är overksam. aktiverad sedan %s\n"
+
+#, c-format
+msgid "printer %s now printing %s-%d. enabled since %s\n"
+msgstr "skrivaren %s skriver nu ut %s-%d. aktiverad sedan %s\n"
+
+#, c-format
+msgid "printer %s disabled since %s -\n"
+msgstr "skrivare %s inaktiverad sedan %s -\n"
+
+msgid "\treason unknown\n"
+msgstr "\tokänd anledning\n"
+
+msgid ""
+"\tForm mounted:\n"
+"\tContent types: any\n"
+"\tPrinter types: unknown\n"
+msgstr ""
+"\tFormulär monterat:\n"
+"\tInnehållstyper: alla\n"
+"\tSkrivartyper: okänd\n"
+
+#, c-format
+msgid "\tDescription: %s\n"
+msgstr "\tBeskrivning: %s\n"
+
+msgid "\tAlerts:"
+msgstr "\tAlarm:"
+
+#, c-format
+msgid "\tLocation: %s\n"
+msgstr "\tPlats: %s\n"
+
+msgid "\tConnection: remote\n"
+msgstr "\tAnslutning: fjärr\n"
+
+#, c-format
+msgid "\tInterface: %s.ppd\n"
+msgstr "\tGränssnitt: %s.ppd\n"
+
+msgid "\tConnection: direct\n"
+msgstr "\tAnslutning: direkt\n"
+
+#, c-format
+msgid "\tInterface: %s/interfaces/%s\n"
+msgstr "\tGränssnitt: %s/interfaces/%s\n"
+
+#, c-format
+msgid "\tInterface: %s/ppd/%s.ppd\n"
+msgstr "\tGränssnitt: %s/ppd/%s.ppd\n"
+
+msgid "\tOn fault: no alert\n"
+msgstr "\tVid fel: inget alarm\n"
+
+msgid "\tAfter fault: continue\n"
+msgstr "\tEfter fel: fortsätt\n"
+
+msgid "\tUsers allowed:\n"
+msgstr "\tTillåtna användare:\n"
+
+msgid "\tUsers denied:\n"
+msgstr "\tNekade användare:\n"
+
+msgid "\t\t(all)\n"
+msgstr "\t\t(alla)\n"
+
+msgid "\tForms allowed:\n"
+msgstr "\tTillåtna format:\n"
+
+msgid "\t\t(none)\n"
+msgstr "\t\t(ingen)\n"
+
+msgid "\tBanner required\n"
+msgstr "\tBanner krävs\n"
+
+msgid "\tCharset sets:\n"
+msgstr "\tTeckenkodningar:\n"
+
+# Pitch är ett svårt att kort förklara..
+msgid "\tDefault pitch:\n"
+msgstr "\tStandardavstånd mellan bildpunkter:\n"
+
+msgid "\tDefault page size:\n"
+msgstr "\tStandardstorlek för sida:\n"
+
+msgid "\tDefault port settings:\n"
+msgstr "\tStandardportinställningar:\n"
+
+#, c-format
+msgid "printer %s/%s is idle. enabled since %s\n"
+msgstr "skrivare %s/%s är overksam. aktiverad sedan %s\n"
+
+#, c-format
+msgid "printer %s/%s now printing %s-%d. enabled since %s\n"
+msgstr "skrivaren %s/%s skriver nu ut %s-%d. aktiverad sedan %s\n"
+
+#, c-format
+msgid "printer %s/%s disabled since %s -\n"
+msgstr "skrivare %s/%s inaktiverad sedan %s -\n"
+
+msgid "scheduler is running\n"
+msgstr "schemaläggare körs\n"
+
+msgid "scheduler is not running\n"
+msgstr "schemaläggare körs inte\n"
+
+#, c-format
+msgid "lpadmin: Unable to connect to server: %s\n"
+msgstr "lpadmin: Kunde inte ansluta till server: %s\n"
+
+msgid ""
+"lpadmin: Unable to add a printer to the class:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte lägga till en skrivare till klassen:\n"
+" Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected class name after '-c' option!\n"
+msgstr "lpadmin: Förväntade klassnamn efter flaggan \"-c\"!\n"
+
+msgid "lpadmin: Class name can only contain printable characters!\n"
+msgstr "lpadmin: Klassnamn kan endast innehålla skrivbara tecken!\n"
+
+msgid "lpadmin: Expected printer name after '-d' option!\n"
+msgstr "lpadmin: Förväntade skrivarnamn efter flaggan \"-d\"!\n"
+
+msgid "lpadmin: Printer name can only contain printable characters!\n"
+msgstr "lpadmin: Skrivarnamn kan endast innehålla skrivbara tecken!\n"
+
+msgid "lpadmin: Expected hostname after '-h' option!\n"
+msgstr "lpadmin: Förväntade värdnamn efter flaggan \"-h\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the interface script:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in gränssnittsskriptet:\n"
+" Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected interface after '-i' option!\n"
+msgstr "lpadmin: Förväntade gränssnitt efter flaggan \"-i\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the interface script or PPD file:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in gränssnittsskriptet eller PPD-fil:\n"
+" Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected model after '-m' option!\n"
+msgstr "lpadmin: Förväntade modell efter flaggan \"-m\"!\n"
+
+msgid "lpadmin: Expected name=value after '-o' option!\n"
+msgstr "lpadmin: Förväntade namn=värde efter flaggan \"-o\"!\n"
+
+msgid "lpadmin: Expected printer after '-p' option!\n"
+msgstr "lpadmin: Förväntade skrivare efter flaggan \"-p\"!\n"
+
+msgid ""
+"lpadmin: Unable to remove a printer from the class:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ta bort en skrivare från klassen:\n"
+" Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected class after '-r' option!\n"
+msgstr "lpadmin: Förväntade klass efter flaggan \"-r\"!\n"
+
+msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n"
+msgstr "lpadmin: Förväntade allow/deny:användarlista efter flaggan \"-u\"!\n"
+
+#, c-format
+msgid "lpadmin: Unknown allow/deny option \"%s\"!\n"
+msgstr "lpadmin: Okänt allow/deny-alternativ \"%s\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the device URI:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in enhets-URI:\n"
+" Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected device URI after '-v' option!\n"
+msgstr "lpadmin: Förväntade enhets-URI efter flaggan \"'-v\"!\n"
+
+msgid "lpadmin: Expected printer or class after '-x' option!\n"
+msgstr "lpadmin: Förväntade skrivare eller klass efter flaggan \"'-x\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the printer description:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in skrivarbeskrivningen:\n"
+" Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected description after '-D' option!\n"
+msgstr "lpadmin: Förväntade beskrivning efter flaggan \"'-D\"!\n"
+
+msgid "lpadmin: Expected file type(s) after '-I' option!\n"
+msgstr "lpadmin: Förväntade filtyp(er) efter flaggan \"'-I\"!\n"
+
+msgid "lpadmin: Warning - content type list ignored!\n"
+msgstr "lpadmin: Varning - innehållstyplista ignorerades!\n"
+
+msgid ""
+"lpadmin: Unable to set the printer location:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in skrivarens plats:\n"
+" Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected location after '-L' option!\n"
+msgstr "lpadmin: Förväntade plats efter flaggan \"-L\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the PPD file:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in PPD-filen:\n"
+" Du måste ange ett skrivarnamn först!\n"
+
+msgid "lpadmin: Expected PPD after '-P' option!\n"
+msgstr "lpadmin: Förväntade PPD efter flaggan \"'-P\"!\n"
+
+#, c-format
+msgid "lpadmin: Unknown option '%c'!\n"
+msgstr "lpadmin: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "lpadmin: Unknown argument '%s'!\n"
+msgstr "lpadmin: Okänt argument \"%s\"!\n"
+
+msgid ""
+"lpadmin: Unable to set the printer options:\n"
+" You must specify a printer name first!\n"
+msgstr ""
+"lpadmin: Kunde inte ställa in skrivaralternativen:\n"
+" Du måste ange ett skrivarnamn först!\n"
+
+msgid ""
+"Usage:\n"
+"\n"
+" lpadmin [-h server] -d destination\n"
+" lpadmin [-h server] -x destination\n"
+" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n"
+" [-r remove-class] [-v device] [-D description]\n"
+" [-P ppd-file] [-o name=value]\n"
+" [-u allow:user,user] [-u deny:user,user]\n"
+"\n"
+msgstr ""
+"Användning:\n"
+"\n"
+" lpadmin [-h server] -d mål\n"
+" lpadmin [-h server] -x mål\n"
+" lpadmin [-h server] -p skrivare [-c lägg-till-klass] [-i gränssnitt] [-m modell]\n"
+" [-r ta-bort-klass] [-v enhet] [-D beskrivning]\n"
+" [-P ppd-fil] [-o namn=värde]\n"
+" [-u allow:användare,användare] [-u deny:användare,användare]\n"
+"\n"
+
+#, c-format
+msgid "lpadmin: Unable to create temporary file: %s\n"
+msgstr "lpadmin: Kunde inte skapa temporärfil: %s\n"
+
+#, c-format
+msgid "lpadmin: Unable to open file \"%s\": %s\n"
+msgstr "lpadmin: Kunde inte öppna filen \"%s\": %s\n"
+
+#, c-format
+msgid "lpadmin: add-printer (set model) failed: %s\n"
+msgstr "lpadmin: add-printer (set model) misslyckades: %s\n"
+
+#, c-format
+msgid "lpadmin: add-printer (set description) failed: %s\n"
+msgstr "lpadmin: add-printer (set description) misslyckades: %s\n"
+
+#, c-format
+msgid "lpadmin: add-printer (set location) failed: %s\n"
+msgstr "lpadmin: add-printer (set location) misslyckades: %s\n"
+
+#, c-format
+msgid "lpadmin: Unable to create temporary file - %s\n"
+msgstr "lpadmin: Kunde inte skapa temporärfil - %s\n"
+
+#, c-format
+msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n"
+msgstr "lpadmin: Kunde inte öppna PPD-filen \"%s\" - %s\n"
+
+#, c-format
+msgid "lpadmin: %s failed: %s\n"
+msgstr "lpadmin: %s misslyckades: %s\n"
+
+msgid "lp: Expected destination after -d option!\n"
+msgstr "lp: Förväntade mål efter flaggan -d!\n"
+
+msgid "lp: Expected form after -f option!\n"
+msgstr "lp: Förväntade format efter flaggan -f!\n"
+
+msgid "lp: Expected hostname after -h option!\n"
+msgstr "lp: Förväntade värdnamn efter flaggan -h!\n"
+
+msgid "lp: Expected job ID after -i option!\n"
+msgstr "lp: Förväntade jobb-id efter flaggan -i!\n"
+
+msgid "lp: Error - cannot print files and alter jobs simultaneously!\n"
+msgstr "lp: Fel - kan inte skriva ut filer och ändra jobb samtidigt!\n"
+
+msgid "lp: Error - bad job ID!\n"
+msgstr "lp: Fel - felaktigt jobb-id!\n"
+
+msgid "lp: Expected copies after -n option!\n"
+msgstr "lp: Förväntade kopior efter flaggan -n!\n"
+
+msgid "lp: Expected option string after -o option!\n"
+msgstr "lp: Förväntade sträng efter flaggan -o!\n"
+
+#, c-format
+msgid "lp: Expected priority after -%c option!\n"
+msgstr "lp: Förväntade prioritet efter flaggan -%c!\n"
+
+msgid "lp: Priority must be between 1 and 100.\n"
+msgstr "lp: Prioritet måste vara mellan 1 och 100.\n"
+
+msgid "lp: Expected title after -t option!\n"
+msgstr "lp: Förväntade titel efter flaggan -t!\n"
+
+msgid "lp: Expected mode list after -y option!\n"
+msgstr "lp: Förväntade lägeslista efter flaggan -y!\n"
+
+msgid "lp: Warning - mode option ignored!\n"
+msgstr "lp: Varning - lägesflagga ignorerades!\n"
+
+msgid "lp: Expected hold name after -H option!\n"
+msgstr "lp: Förväntade kvarhållningsnamn efter flaggan -H!\n"
+
+msgid "lp: Need job ID (-i) before \"-H restart\"!\n"
+msgstr "lp: Behöver jobb-id (-i) före \"-H restart\"!\n"
+
+msgid "lp: Expected page list after -P option!\n"
+msgstr "lp: Förväntade sidlista efter flaggan -P!\n"
+
+msgid "lp: Expected character set after -S option!\n"
+msgstr "lp: Förväntade teckenkodning efter flaggan -S!\n"
+
+msgid "lp: Warning - character set option ignored!\n"
+msgstr "lp: Varning - flagga för teckenkodning ignorerades!\n"
+
+msgid "lp: Expected content type after -T option!\n"
+msgstr "lp: Förväntade innehållstyp efter flaggan -T!\n"
+
+msgid "lp: Warning - content type option ignored!\n"
+msgstr "lp: Varning - flagga för innehållstyp ignorerades!\n"
+
+#, c-format
+msgid "lp: Unknown option '%c'!\n"
+msgstr "lp: Okänd flagga \"%c\"!\n"
+
+msgid "lp: Error - cannot print from stdin if files or a job ID are provided!\n"
+msgstr "lp: Fel - kan inte skriva ut från standard in om filer eller ett jobb-id anges!\n"
+
+#, c-format
+msgid "lp: Unable to access \"%s\" - %s\n"
+msgstr "lp: Kunde inte komma åt \"%s\" - %s\n"
+
+#, c-format
+msgid "lp: Too many files - \"%s\"\n"
+msgstr "lp: För många filer - \"%s\"\n"
+
+msgid "lp: error - no default destination available.\n"
+msgstr "lp: fel - inget standardmål tillgängligt.\n"
+
+msgid "lp: error - scheduler not responding!\n"
+msgstr "lp: fel - schemaläggare svarar inte!\n"
+
+#, c-format
+msgid "lp: unable to create temporary file \"%s\" - %s\n"
+msgstr "lp: kunde inte skapa temporärfil \"%s\" - %s\n"
+
+#, c-format
+msgid "lp: error - unable to write to temporary file \"%s\" - %s\n"
+msgstr "lp: fel - kunde inte skriva till temporärfil \"%s\" - %s\n"
+
+msgid "lp: stdin is empty, so no job has been sent.\n"
+msgstr "lp: standard in är tom, så inga jobb har skickats.\n"
+
+#, c-format
+msgid "lp: unable to print file: %s\n"
+msgstr "lp: kunde inte skriva ut fil: %s\n"
+
+#, c-format
+msgid "request id is %s-%d (%d file(s))\n"
+msgstr "id för begäran är %s-%d (%d fil(er))\n"
+
+#, c-format
+msgid "lp: restart-job failed: %s\n"
+msgstr "lp: restart-job misslyckades: %s\n"
+
+#, c-format
+msgid "lp: set-job-attributes failed: %s\n"
+msgstr "lp: set-job-attributes misslyckades: %s\n"
+
+#, c-format
+msgid "lpinfo: Unable to connect to server: %s\n"
+msgstr "lpinfo: Kunde inte ansluta till server: %s\n"
+
+#, c-format
+msgid "lpinfo: Unknown option '%c'!\n"
+msgstr "lpinfo: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "lpinfo: Unknown argument '%s'!\n"
+msgstr "lpinfo: Okänt argument \"%s\"!\n"
+
+#, c-format
+msgid "lpinfo: cups-get-devices failed: %s\n"
+msgstr "lpinfo: cups-get-devices misslyckades: %s\n"
+
+#, c-format
+msgid ""
+"Device: uri = %s\n"
+" class = %s\n"
+" info = %s\n"
+" make-and-model = %s\n"
+msgstr ""
+"Enhet: uri = %s\n"
+" klass = %s\n"
+" info = %s\n"
+" tillverkare-och-modell = %s\n"
+
+#, c-format
+msgid "lpinfo: cups-get-ppds failed: %s\n"
+msgstr "lpinfo: cups-get-ppds misslyckades: %s\n"
+
+#, c-format
+msgid ""
+"Model: name = %s\n"
+" natural_language = %s\n"
+" make-and-model = %s\n"
+msgstr ""
+"Modell: namn = %s\n"
+" naturligt_språk = %s\n"
+" tillverkare-och-modell = %s\n"
+
+#, c-format
+msgid "lpmove: Unknown option '%c'!\n"
+msgstr "lpmove: Okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "lpmove: Unknown argument '%s'!\n"
+msgstr "lpmove: Okänt argument \"%s\"!\n"
+
+msgid "Usage: lpmove job dest\n"
+msgstr "Användning: lpmove jobb mål\n"
+
+#, c-format
+msgid "lpmove: Unable to connect to server: %s\n"
+msgstr "lpmove: Kunde inte ansluta till server: %s\n"
+
+#, c-format
+msgid "lpmove: move-job failed: %s\n"
+msgstr "lpmove: move-job misslyckades: %s\n"
+
+msgid "lpoptions: Unknown printer or class!\n"
+msgstr "lpoptions: Okänd skrivare eller klass!\n"
+
+msgid "lpoptions: No printers!?!\n"
+msgstr "lpoptions: Inga skrivare!?!\n"
+
+#, c-format
+msgid "lpoptions: Unable to add printer or instance: %s\n"
+msgstr "lpoptions: Kunde inte lägga till skrivare eller instans: %s\n"
+
+#, c-format
+msgid "lpoptions: Destination %s has no PPD file!\n"
+msgstr "lpoptions: Målet %s har ingen PPD-fil!\n"
+
+#, c-format
+msgid "lpoptions: Unable to open PPD file for %s!\n"
+msgstr "lpoptions: Kunde inte öppna PPD-fil för %s!\n"
+
+msgid ""
+"Usage: lpoptions [-h server] [-E] -d printer\n"
+" lpoptions [-h server] [-E] [-p printer] -l\n"
+" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n"
+" lpoptions [-h server] [-E] -x printer\n"
+msgstr ""
+"Användning: lpoptions [-h server] [-E] -d skrivare\n"
+" lpoptions [-h server] [-E] [-p skrivare] -l\n"
+" lpoptions [-h server] [-E] -p skrivare -o flagga[=värde] ...\n"
+" lpoptions [-h server] [-E] -x skrivare\n"
+
+msgid "lppasswd: Only root can add or delete passwords!\n"
+msgstr "lppasswd: Endast root kan lägga till eller ta bort lösenord!\n"
+
+msgid "Enter old password:"
+msgstr "Ange gammalt lösenord:"
+
+#, c-format
+msgid "lppasswd: Unable to copy password string: %s\n"
+msgstr "lppasswd: Kunde inte kopiera lösenordssträng: %s\n"
+
+msgid "Enter password:"
+msgstr "Ange lösenord:"
+
+msgid "Enter password again:"
+msgstr "Ange lösenord igen:"
+
+msgid "lppasswd: Sorry, passwords don't match!\n"
+msgstr "lppasswd: Tyvärr, lösenorden stämmer inte överens!\n"
+
+msgid ""
+"lppasswd: Sorry, password rejected.\n"
+"Your password must be at least 6 characters long, cannot contain\n"
+"your username, and must contain at least one letter and number.\n"
+msgstr ""
+"lppasswd: Tyvärr, lösenordet vägrades.\n"
+"Ditt lösenord måste vara åtminstone 6 tecken långt, får inte innehålla\n"
+"ditt användarnamn, och måste innehålla åtminstone en bokstav och siffra.\n"
+
+msgid "lppasswd: Password file busy!\n"
+msgstr "lppasswd: Lösenordsfil upptagen!\n"
+
+#, c-format
+msgid "lppasswd: Unable to open password file: %s\n"
+msgstr "lppasswd: Kunde inte öppna lösenordsfil: %s\n"
+
+#, c-format
+msgid "lppasswd: Unable to write to password file: %s\n"
+msgstr "lppasswd: Kunde inte skriva till lösenordsfil: %s\n"
+
+#, c-format
+msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n"
+msgstr "lppasswd: användare \"%s\" och grupp \"%s\" finns inte.\n"
+
+msgid "lppasswd: Sorry, password doesn't match!\n"
+msgstr "lppasswd: Tyvärr, lösenord stämmer inte!\n"
+
+msgid "lppasswd: Password file not updated!\n"
+msgstr "lppasswd: Lösenordsfil inte uppdaterad!\n"
+
+#, c-format
+msgid "lppasswd: failed to backup old password file: %s\n"
+msgstr "lppasswd: misslyckades med att säkerhetskopiera gamla lösenordsfilen: %s\n"
+
+#, c-format
+msgid "lppasswd: failed to rename password file: %s\n"
+msgstr "lppasswd: misslyckades med att byta namn på lösenordsfilen: %s\n"
+
+msgid "Usage: lppasswd [-g groupname]\n"
+msgstr "Användning: lppasswd [-g gruppnamn]\n"
+
+msgid ""
+"Usage: lppasswd [-g groupname] [username]\n"
+" lppasswd [-g groupname] -a [username]\n"
+" lppasswd [-g groupname] -x [username]\n"
+msgstr ""
+"Användning: lppasswd [-g gruppnamn] [användarnamn]\n"
+" lppasswd [-g gruppnamn] -a [användarnamn]\n"
+" lppasswd [-g gruppnamn] -x [användarnamn]\n"
+
+msgid "Start Printer"
+msgstr "Starta skrivare"
+
+msgid "Stop Printer"
+msgstr "Stoppa skrivare"
+
+msgid "Start Class"
+msgstr "Starta klass"
+
+msgid "Stop Class"
+msgstr "Stoppa klass"
+
+msgid "Accept Jobs"
+msgstr "Acceptera jobb"
+
+msgid "Reject Jobs"
+msgstr "Vägra jobb"
+
+msgid "Purge Jobs"
+msgstr "Rensa jobb"
+
+msgid "Set As Default"
+msgstr "Ställ in som standard"
+
+msgid "Administration"
+msgstr "Administration"
+
+msgid "Modify Class"
+msgstr "Ändra klass"
+
+msgid "Add Class"
+msgstr "Lägg till klass"
+
+msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
+msgstr "Klassnamnet får endast innehålla upp till 127 skrivbara tecken och får inte innehålla blanksteg, snedstreck (/) eller fyrkantstecknet (#)."
+
+msgid "Unable to modify class:"
+msgstr "Kunde inte ändra klass:"
+
+msgid "Unable to add class:"
+msgstr "Kunde inte lägga till klass:"
+
+msgid "Modify Printer"
+msgstr "Ändra skrivare"
+
+msgid "Add Printer"
+msgstr "Lägg till skrivare"
+
+msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."
+msgstr "Skrivarnamnet får endast innehålla upp till 127 skrivbara tecken och får inte innehålla blanksteg, snedstreck (/) eller fyrkantstecknet (#)."
+
+msgid "Unable to get list of printer drivers:"
+msgstr "Kunde inte få tag på listan av skrivardrivrutiner:"
+
+msgid "Unable to modify printer:"
+msgstr "Kunde inte ändra skrivare:"
+
+msgid "Unable to add printer:"
+msgstr "Kunde inte lägga till skrivare:"
+
+msgid "Set Printer Options"
+msgstr "Ställ in skrivaralternativ"
+
+msgid "Missing form variable!"
+msgstr "Saknar formatvariabel!"
+
+msgid "Unable to get PPD file!"
+msgstr "Kunde inte få tag på PPD-fil!"
+
+msgid "Unable to open PPD file:"
+msgstr "Kunde inte öppna PPD-fil:"
+
+msgid "Banners"
+msgstr "Bannrar"
+
+msgid "Starting Banner"
+msgstr "Startbanner"
+
+msgid "Ending Banner"
+msgstr "Slutbanner"
+
+msgid "Policies"
+msgstr "Policy"
+
+msgid "Error Policy"
+msgstr "Felpolicy"
+
+msgid "Operation Policy"
+msgstr "Åtgärdspolicy"
+
+msgid "PS Binary Protocol"
+msgstr "PS Binary-protokoll"
+
+msgid "None"
+msgstr "Ingen"
+
+msgid "Unable to set options:"
+msgstr "Kunde inte ställa in alternativ:"
+
+msgid "Change Settings"
+msgstr "Ändra inställningar"
+
+msgid "Unable to change server settings:"
+msgstr "Kunde inte ändra serverinställningar:"
+
+msgid "Unable to upload cupsd.conf file:"
+msgstr "Kunde inte skicka upp filen cupsd.conf:"
+
+msgid "Edit Configuration File"
+msgstr "Redigera konfigurationsfil"
+
+msgid "Unable to create temporary file:"
+msgstr "Kunde inte skapa temporärfil:"
+
+msgid "Unable to access cupsd.conf file:"
+msgstr "Kunde inte komma åt filen cupsd.conf:"
+
+msgid "Unable to edit cupsd.conf files larger than 1MB!"
+msgstr "Kunde inte redigera cupsd.conf-filer större än 1MB!"
+
+msgid "Delete Class"
+msgstr "Ta bort klass"
+
+msgid "Unable to delete class:"
+msgstr "Kunde inte ta bort klass:"
+
+msgid "Delete Printer"
+msgstr "Ta bort skrivare"
+
+msgid "Unable to delete printer:"
+msgstr "Kunde inte ta bort skrivare:"
+
+msgid "Export Printers to Samba"
+msgstr "Exportera skrivare till Samba"
+
+msgid "Unable to fork process!"
+msgstr "Kunde inte grena process!"
+
+msgid "Unable to connect to server!"
+msgstr "Kunde inte ansluta till server!"
+
+msgid "Unable to get printer attributes!"
+msgstr "Kunde inte få tag på skrivarattribut!"
+
+msgid "Unable to convert PPD file!"
+msgstr "Kunde inte konvertera PPD-fil!"
+
+msgid "Unable to copy Windows 2000 printer driver files!"
+msgstr "Kunde inte kopiera filer för Windows 2000-skrivardrivrutin!"
+
+msgid "Unable to install Windows 2000 printer driver files!"
+msgstr "Kunde inte installera filer för Windows 2000-skrivardrivrutin!"
+
+msgid "Unable to copy Windows 9x printer driver files!"
+msgstr "Kunde inte kopiera filer för Windows 9x-skrivardrivrutin!"
+
+msgid "Unable to install Windows 9x printer driver files!"
+msgstr "Kunde inte installera filer för Windows 9x-skrivardrivrutin!"
+
+msgid "Unable to set Windows printer driver!"
+msgstr "Kunde inte ställa in Windows-skrivardrivrutin!"
+
+msgid "No printer drivers found!"
+msgstr "Inga skrivardrivrutiner hittades!"
+
+msgid "Unable to execute cupsaddsmb command!"
+msgstr "Kunde inte starta kommandot cupsaddsmb!"
+
+#, c-format
+msgid "cupsaddsmb failed with status %d"
+msgstr "cupsaddsmb misslyckades med status %d"
+
+#, c-format
+msgid "cupsaddsmb crashed on signal %d"
+msgstr "cupsaddsmb krashade på signal %d"
+
+msgid "A Samba username is required to export printer drivers!"
+msgstr "Ett Samba-användarnamn krävs för att exportera skrivardrivrutiner!"
+
+msgid "A Samba password is required to export printer drivers!"
+msgstr "Ett Samba-lösenord krävs för att exportera skrivardrivrutiner!"
+
+msgid "Unable to open cupsd.conf file:"
+msgstr "Kunde inte öppna filen cupsd.conf:"
+
+msgid "Unable to change printer:"
+msgstr "Kunde inte byta skrivare:"
+
+msgid "Set Allowed Users"
+msgstr "Ställ in tillåtna användare"
+
+msgid "Unable to get printer attributes:"
+msgstr "Kunde inte få tag på skrivarattribut:"
+
+msgid "Set Publishing"
+msgstr "Ställ in publicering"
+
+msgid "Unable to change printer-is-shared attribute:"
+msgstr "Kunde inte ändra attributet printer-is-shared:"
+
+msgid "Classes"
+msgstr "Klasser"
+
+msgid "Unable to get class list:"
+msgstr "Kunde inte få tag på klasslista:"
+
+msgid "Unable to get class status:"
+msgstr "Kunde inte få tag på klasstatus:"
+
+msgid "Move Job"
+msgstr "Flytta jobb"
+
+msgid "Unable to find destination for job!"
+msgstr "Kunde inte hitta mål för jobb!"
+
+msgid "Move All Jobs"
+msgstr "Flytta alla jobb"
+
+msgid "Unable to move job"
+msgstr "Kunde inte flytta jobb"
+
+msgid "Unable to move jobs"
+msgstr "Kunde inte flytta jobb"
+
+msgid "Print Test Page"
+msgstr "Skriv ut testsida"
+
+msgid "Unable to print test page:"
+msgstr "Kunde inte skriva ut testsida:"
+
+msgid "Jobs"
+msgstr "Jobb"
+
+msgid "Job operation failed:"
+msgstr "Jobbåtgärd misslyckades:"
+
+msgid "Printers"
+msgstr "Skrivare"
+
+msgid "Unable to get printer list:"
+msgstr "Kunde inte få tag på skrivarlista:"
+
+msgid "Unable to get printer status:"
+msgstr "Kunde inte få tag på skrivarstatus:"
+
+msgid "OK"
+msgstr "OK"
+
+msgid "Unable to open PPD file"
+msgstr "Kunde inte öppna PPD-fil"
+
+msgid "NULL PPD file pointer"
+msgstr "NOLL PPD-filspekare"
+
+msgid "Memory allocation error"
+msgstr "Minnesallokeringsfel"
+
+msgid "Missing PPD-Adobe-4.x header"
+msgstr "Saknar PPD-Adobe-4.x-huvud"
+
+msgid "Missing value string"
+msgstr "Saknar värdesträng"
+
+msgid "Internal error"
+msgstr "Internt fel"
+
+msgid "Bad OpenGroup"
+msgstr "Felaktig OpenGroup"
+
+msgid "OpenGroup without a CloseGroup first"
+msgstr "OpenGroup utan en CloseGroup först"
+
+msgid "Bad OpenUI/JCLOpenUI"
+msgstr "Felaktig OpenUI/JCLOpenUI"
+
+msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"
+msgstr "OpenUI/JCLOpenUI utan en CloseUI/JCLCloseUI först"
+
+msgid "Bad OrderDependency"
+msgstr "Felaktig OrderDependency"
+
+msgid "Bad UIConstraints"
+msgstr "Felaktig UIConstraints"
+
+msgid "Missing asterisk in column 1"
+msgstr "Saknar asterisk i kolumn 1"
+
+msgid "Line longer than the maximum allowed (255 characters)"
+msgstr "Rad längre än vad som maximalt tillåts (255 tecken)"
+
+msgid "Illegal control character"
+msgstr "Otillåtet kontrolltecken"
+
+msgid "Illegal main keyword string"
+msgstr "Otillåten huvudnyckelordssträng"
+
+msgid "Illegal option keyword string"
+msgstr "Otillåten alternativnyckelordssträng"
+
+msgid "Illegal translation string"
+msgstr "Otillåten översättningssträng"
+
+msgid "Illegal whitespace character"
+msgstr "Otillåtet blanktecken"
+
+msgid "Bad custom parameter"
+msgstr "Felaktig anpassad parameter"
+
+msgid "Unknown"
+msgstr "Okänd"
+
+msgid "Custom"
+msgstr "Anpassad"
+
+msgid "JCL"
+msgstr "JCL"
+
+msgid "No authentication information provided!"
+msgstr "Ingen autentiseringsinformation angiven!"
+
+#, c-format
+msgid "Password for %s required to access %s via SAMBA: "
+msgstr "Lösenord för %s krävs för att komma åt %s via SAMBA: "
+
+#, c-format
+msgid "Running command: %s %s -N -U '%s%%%s' -c '%s'\n"
+msgstr "Kör kommando: %s %s -N -U '%s%%%s' -c '%s'\n"
+
+#, c-format
+msgid "cupsaddsmb: Unable to run \"%s\": %s\n"
+msgstr "cupsaddsmb: Kunde inte köra \"%s\": %s\n"
+
+msgid "cupsaddsmb: No Windows printer drivers are installed!\n"
+msgstr "cupsaddsmb: Inga Windows-skrivardrivrutiner är installerade!\n"
+
+msgid "cupsaddsmb: Warning, no Windows 2000 printer drivers are installed!\n"
+msgstr "cupsaddsmb: Varning, inga Windows 2000-skrivardrivrutiner är installerade!\n"
+
+#, c-format
+msgid "lpadmin: Printer %s is already a member of class %s.\n"
+msgstr "lpadmin: Skrivaren %s är redan medlem av klassen %s.\n"
+
+msgid "lpadmin: No member names were seen!\n"
+msgstr "lpadmin: Inga medlemsnamn sågs!\n"
+
+#, c-format
+msgid "lpadmin: Printer %s is not a member of class %s.\n"
+msgstr "lpadmin: Skrivaren %s är inte en medlem av klassen %s.\n"
+
+#, c-format
+msgid ""
+"Device: uri = %s\n"
+" class = %s\n"
+" info = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+msgstr ""
+"Enhet: uri = %s\n"
+" klass = %s\n"
+" info = %s\n"
+" märke-och-modell = %s\n"
+" enhets-id = %s\n"
+
+#, c-format
+msgid ""
+"Model: name = %s\n"
+" natural_language = %s\n"
+" make-and-model = %s\n"
+" device-id = %s\n"
+msgstr ""
+"Modell: namn = %s\n"
+" naturligt_språk = %s\n"
+" märke-och-modell = %s\n"
+" enhets-id = %s\n"
+
+msgid "Usage: lpmove job/src dest\n"
+msgstr "Användning: lpmove jobb/källa mål\n"
+
+msgid "lpstat: Need \"completed\", \"not-completed\", or \"all\" after -W!\n"
+msgstr "lpstat: Behöver \"completed\", \"not-completed\" eller \"all\" efter -W!\n"
+
+#, c-format
+msgid "%s accepting requests since %s\n"
+msgstr "%s accepterar begäran sedan %s\n"
+
+#, c-format
+msgid ""
+"%s not accepting requests since %s -\n"
+"\t%s\n"
+msgstr ""
+"%s accepterar inte begäran sedan %s -\n"
+"\t%s\n"
+
+#, c-format
+msgid "%s/%s accepting requests since %s\n"
+msgstr "%s/%s accepterar begäran sedan %s\n"
+
+#, c-format
+msgid ""
+"%s/%s not accepting requests since %s -\n"
+"\t%s\n"
+msgstr ""
+"%s/%s accepterar inte begäran sedan %s -\n"
+"\t%s\n"
+
+msgid "lpc> "
+msgstr "lpc> "
+
+#, c-format
+msgid "%s: Unable to contact server!\n"
+msgstr "%s: Kunde inte kontakta server!\n"
+
+#, c-format
+msgid "%s: Error - expected username after '-U' option!\n"
+msgstr "%s: Fel - förväntade användarnamn efter flaggan \"-U\"!\n"
+
+#, c-format
+msgid "%s: Error - unknown destination \"%s/%s\"!\n"
+msgstr "%s: Fel - okänt mål \"%s/%s\"!\n"
+
+#, c-format
+msgid "%s: Unknown destination \"%s\"!\n"
+msgstr "%s: Okänt mål \"%s\"!\n"
+
+#, c-format
+msgid "%s: Error - expected hostname after '-h' option!\n"
+msgstr "%s: Fel - förväntade värdnamn efter flaggan \"-h\"!\n"
+
+#, c-format
+msgid "%s: error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "%s: fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n"
+
+#, c-format
+msgid "%s: error - no default destination available.\n"
+msgstr "%s: fel - inget standardmål tillgängligt.\n"
+
+msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n"
+msgstr "Användning: lpq [-P mål] [-U användarnamn] [-h värdnamn[:port]] [-l] [+intervall]\n"
+
+#, c-format
+msgid "%s: Error - expected hostname after '-H' option!\n"
+msgstr "%s: Fel - förväntade värdnamn efter flaggan \"-H\"!\n"
+
+#, c-format
+msgid "%s: Error - expected value after '-%c' option!\n"
+msgstr "%s: Fel - förväntade värde efter flaggan \"-%c\"!\n"
+
+#, c-format
+msgid "%s: Warning - '%c' format modifier not supported - output may not be correct!\n"
+msgstr "%s: Varning - \"'%c\"- formatmodifieraren stöds inte - utmatning kanske inte blir korrekt!\n"
+
+#, c-format
+msgid "%s: error - expected option=value after '-o' option!\n"
+msgstr "%s: fel - förväntade alternativ=värde efter flaggan \"'-o\"!\n"
+
+#, c-format
+msgid "%s: Error - expected destination after '-P' option!\n"
+msgstr "%s: Fel - förväntade mål efter flaggan \"-P\"!\n"
+
+#, c-format
+msgid "%s: Error - expected copy count after '-#' option!\n"
+msgstr "%s: Fel - förväntade antal kopior efter flaggan \"-#\"!\n"
+
+#, c-format
+msgid "%s: Error - expected name after '-%c' option!\n"
+msgstr "%s: Fel - förväntade namn efter flaggan \"-%c\"!\n"
+
+#, c-format
+msgid "%s: Error - unknown option '%c'!\n"
+msgstr "%s: Fel - okänd flagga \"%c\"!\n"
+
+#, c-format
+msgid "%s: Error - unable to access \"%s\" - %s\n"
+msgstr "%s: Fel - kunde inte komma åt \"%s\" - %s\n"
+
+#, c-format
+msgid "%s: Error - too many files - \"%s\"\n"
+msgstr "%s: Fel - för många filer - \"%s\"\n"
+
+#, c-format
+msgid "%s: Error - %s environment variable names non-existent destination \"%s\"!\n"
+msgstr "%s: Fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n"
+
+#, c-format
+msgid "%s: Error - no default destination available.\n"
+msgstr "%s: Fel - inget standardmål tillgängligt.\n"
+
+#, c-format
+msgid "%s: Error - scheduler not responding!\n"
+msgstr "%s: Fel - schemaläggare svarar inte!\n"
+
+#, c-format
+msgid "%s: Error - unable to create temporary file \"%s\" - %s\n"
+msgstr "%s: Fel - kunde inte skapa temporärfil \"%s\" - %s\n"
+
+#, c-format
+msgid "%s: Error - unable to write to temporary file \"%s\" - %s\n"
+msgstr "%s: Fel - kunde inte skriva till temporärfil \"%s\" - %s\n"
+
+#, c-format
+msgid "%s: Error - stdin is empty, so no job has been sent.\n"
+msgstr "%s: Fel - standard in är tom, så inget jobb har skickats.\n"
+
+#, c-format
+msgid "%s: Error - unknown destination \"%s\"!\n"
+msgstr "%s: Fel - okänt mål \"%s\"!\n"
+
+#, c-format
+msgid "%s: Error - expected reason text after '-r' option!\n"
+msgstr "%s: Fel - förväntade anledningstext efter flaggan \"'-r\"!\n"
+
+#, c-format
+msgid "%s: Error - expected username after '-u' option!\n"
+msgstr "%s: Fel - förväntade användarnamn efter flaggan \"-u\"!\n"
+
+#, c-format
+msgid "%s: %s failed: %s\n"
+msgstr "%s: %s misslyckades: %s\n"
+
+#, c-format
+msgid "%s: Error - expected destination after '-d' option!\n"
+msgstr "%s: Fel - förväntade mål efter flaggan \"-d\"!\n"
+
+#, c-format
+msgid "%s: Error - expected form after '-f' option!\n"
+msgstr "%s: Fel - förväntade format efter flaggan \"-f\"!\n"
+
+#, c-format
+msgid "%s: Warning - form option ignored!\n"
+msgstr "%s: Varning - formuläralternativ ignorerades!\n"
+
+#, c-format
+msgid "%s: Expected job ID after '-i' option!\n"
+msgstr "%s: Förväntade jobb-id efter flaggan \"-i\"!\n"
+
+#, c-format
+msgid "%s: Error - cannot print files and alter jobs simultaneously!\n"
+msgstr "%s: Fel - kan inte skriva ut filer och ändra jobb samtidigt!\n"
+
+#, c-format
+msgid "%s: Error - bad job ID!\n"
+msgstr "%s: Fel - felaktigt jobb-id!\n"
+
+#, c-format
+msgid "%s: Error - expected copies after '-n' option!\n"
+msgstr "%s: Fel - förväntade kopior efter flaggan \"-n\"!\n"
+
+#, c-format
+msgid "%s: Error - expected option string after '-o' option!\n"
+msgstr "%s: Fel - förväntade alternativsträng efter flaggan \"'-o\"!\n"
+
+#, c-format
+msgid "%s: Error - expected priority after '-%c' option!\n"
+msgstr "%s: Fel - förväntade prioritet efter flaggan \"-%c\"!\n"
+
+#, c-format
+msgid "%s: Error - priority must be between 1 and 100.\n"
+msgstr "%s: Fel - prioritet måste vara mellan 1 och 100.\n"
+
+#, c-format
+msgid "%s: Error - expected title after '-t' option!\n"
+msgstr "%s: Fel - förväntade titel efter flaggan \"-t\"!\n"
+
+#, c-format
+msgid "%s: Error - expected mode list after '-y' option!\n"
+msgstr "%s: Fel - förväntade lägeslista efter flaggan \"-y\"!\n"
+
+#, c-format
+msgid "%s: Warning - mode option ignored!\n"
+msgstr "%s: Varning - lägesflaggan ignorerades!\n"
+
+#, c-format
+msgid "%s: Error - expected hold name after '-H' option!\n"
+msgstr "%s: Fel - förväntade kvarhållningsnamn efter flaggan \"-H\"!\n"
+
+#, c-format
+msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n"
+msgstr "%s: Behöver jobb-id (\"-i jobbid\") före \"-H restart\"!\n"
+
+#, c-format
+msgid "%s: Error - expected page list after '-P' option!\n"
+msgstr "%s: Fel - förväntade sidlista efter flaggan \"-P\"!\n"
+
+#, c-format
+msgid "%s: Error - expected character set after '-S' option!\n"
+msgstr "%s: Fel - förväntade teckenkodning efter flaggan \"-S\"!\n"
+
+#, c-format
+msgid "%s: Warning - character set option ignored!\n"
+msgstr "%s: Varning - flagga för teckenkodning ignorerades!\n"
+
+#, c-format
+msgid "%s: Error - expected content type after '-T' option!\n"
+msgstr "%s: Fel - förväntade innehållstyp efter flaggan \"-T\"!\n"
+
+#, c-format
+msgid "%s: Warning - content type option ignored!\n"
+msgstr "%s: Varning - flagga för innehållstyp ignorerades!\n"
+
+#, c-format
+msgid "%s: Error - cannot print from stdin if files or a job ID are provided!\n"
+msgstr "%s: Fel - kan inte skriva ut från standard in om filer eller ett jobb-id anges!\n"
+
+#, c-format
+msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' option!\n"
+msgstr "%s: Fel - behöver \"completed\", \"not-completed\" eller \"all\" efter flaggan \"-W\"!\n"
+
+#, c-format
+msgid "%s: Error - expected destination after '-b' option!\n"
+msgstr "%s: Fel - förväntade mål efter flaggan \"-b\"!\n"
+
+#, c-format
+msgid "%s: Invalid destination name in list \"%s\"!\n"
+msgstr "%s: Ogiltigt målnamn i listan \"%s\"!\n"
+
+#, c-format
+msgid "%s: Unable to connect to server\n"
+msgstr "%s: Kunde inte ansluta till server\n"
+
+msgid "Print Job:"
+msgstr "Utskriftsjobb:"
+
+msgid "pending"
+msgstr "väntar"
+
+msgid "held"
+msgstr "hålls kvar"
+
+msgid "processing"
+msgstr "behandlas"
+
+msgid "stopped"
+msgstr "stoppad"
+
+msgid "canceled"
+msgstr "avbruten"
+
+msgid "aborted"
+msgstr "avbruten"
+
+msgid "completed"
+msgstr "färdig"
+
+msgid "unknown"
+msgstr "okänd"
+
+msgid "untitled"
+msgstr "namnlös"
+
+msgid "Printer:"
+msgstr "Skrivare:"
+
+msgid "idle"
+msgstr "overksam"
+
+msgid "Missing notify-subscription-ids attribute!"
+msgstr "Saknar attributet notify-subscription-ids!"
+
+msgid "Job subscriptions cannot be renewed!"
+msgstr "Jobbprenumerationer kan inte förnyas!"
+
+msgid "cupsd: Expected config filename after \"-c\" option!\n"
+msgstr "cupsd: Förväntade konfigurationsfilnamn efter flaggan \"-c\"!\n"
+
+msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n"
+msgstr "cupsd: stöd för launchd(8) inte inbyggt, kör i normalt läge.\n"
+
+#, c-format
+msgid "cupsd: Unknown option \"%c\" - aborting!\n"
+msgstr "cupsd: Okänd flagga \"%c\" - avbryter!\n"
+
+#, c-format
+msgid "cupsd: Unknown argument \"%s\" - aborting!\n"
+msgstr "cupsd: Okänt argument \"%s\" - avbryter!\n"
+
+msgid ""
+"Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n"
+"\n"
+"-c config-file Load alternate configuration file\n"
+"-f Run in the foreground\n"
+"-F Run in the foreground but detach\n"
+"-h Show this usage message\n"
+"-l Run cupsd from launchd(8)\n"
+msgstr ""
+"Användning: cupsd [-c konfigurationsfil] [-f] [-F] [-h] [-l]\n"
+"\n"
+"-c konfigurationsfil Läs in alternativ konfigurationsfil\n"
+"-f Kör i förgrunden\n"
+"-F Kör i förgrunden med koppla loss\n"
+"-h Visa detta användningsmeddelandet\n"
+"-l Kör cupsd från launchd(8)\n"
+
+#, c-format
+msgid " WARN Line %d only contains whitespace!\n"
+msgstr " VARN Rad %d innehåller endast blanktecken!\n"
+
+msgid " WARN File contains a mix of CR, LF, and CR LF line endings!\n"
+msgstr " VARN Filen innehåller en blandning av CR, LF och CR LF-radslut!\n"
+
+msgid " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF!\n"
+msgstr " VARN Icke-Windows PPD-filer bör använda radslut med endast LF, inte CR LF!\n"
+
+msgid "Printer Maintenance"
+msgstr "Skrivarunderhåll"
+
+msgid "Unable to send maintenance job:"
+msgstr "Kunde inte skicka underhållsjobb:"
+
+#, c-format
+msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n"
+msgstr "cupsaddsmb: Ingen PPD-fil för skrivaren \"%s\" - %s\n"
+
+#, c-format
+msgid " **FAIL** %s %s does not exist!\n"
+msgstr " **FEL** %s %s finns inte!\n"
+
+#, c-format
+msgid " **FAIL** Bad language \"%s\"!\n"
+msgstr " **FEL** Felaktigt språk \"%s\"!\n"
+
+#, c-format
+msgid " **FAIL** Missing \"%s\" translation string for option %s!\n"
+msgstr " **FEL** Saknar översättningssträng \"%s\" för flaggan %s!\n"
+
+#, c-format
+msgid " **FAIL** Default translation string for option %s contains 8-bit characters!\n"
+msgstr " **FEL** Standardöversättningssträng för flaggan %s innehåller 8-bitars tecken!\n"
+
+#, c-format
+msgid " **FAIL** Missing \"%s\" translation string for option %s, choice %s!\n"
+msgstr " **FEL** Saknar översättningssträng \"%s\" för flaggan %s, val %s!\n"
+
+#, c-format
+msgid " **FAIL** Default translation string for option %s choice %s contains 8-bit characters!\n"
+msgstr " **FEL** Standardöversättningssträng för flaggan %s val %s innehåller 8-bitars tecken!\n"
+
+#, c-format
+msgid " **FAIL** Bad cupsFilter value \"%s\"!\n"
+msgstr " **FEL** Felaktigt cupsFilter-värde \"%s\"!\n"
+
+msgid "Help"
+msgstr "Hjälp"
+
+#, c-format
+msgid "Missing value on line %d!\n"
+msgstr "Saknar värde på rad %d!\n"
+
+#, c-format
+msgid "Missing double quote on line %d!\n"
+msgstr "Saknar citattecken på rad %d!\n"
+
+#, c-format
+msgid "Bad option + choice on line %d!\n"
+msgstr "Felaktigt alternativ + val på rad %d!\n"
+
+#, c-format
+msgid "Unable to copy Windows 2000 printer driver files (%d)!\n"
+msgstr "Kunde inte kopiera filer för Windows 2000-skrivardrivrutiner (%d)!\n"
+
+#, c-format
+msgid "Unable to copy CUPS printer driver files (%d)!\n"
+msgstr "Kunde inte kopiera filer för CUPS-skrivardrivrutiner (%d)!\n"
+
+#, c-format
+msgid "Unable to install Windows 2000 printer driver files (%d)!\n"
+msgstr "Kunde inte installera filer för Windows 2000-skrivardrivrutiner (%d)!\n"
+
+#, c-format
+msgid "Unable to copy Windows 9x printer driver files (%d)!\n"
+msgstr "Kunde inte kopiera filer för Windows 9x-skrivardrivrutiner (%d)!\n"
+
+#, c-format
+msgid "Unable to install Windows 9x printer driver files (%d)!\n"
+msgstr "Kunde inte installera filer för Windows 9x-skrivardrivrutiner (%d)!\n"
+
+msgid "No Windows printer drivers are installed!\n"
+msgstr "Inga Windows-skrivardrivrutiner är installerade!\n"
+
+msgid "Warning, no Windows 2000 printer drivers are installed!\n"
+msgstr "Varning, inga skrivardrivrutiner för Windows 2000 är installerade!\n"
+
+#, c-format
+msgid "Unable to set Windows printer driver (%d)!\n"
+msgstr "Kunde inte ställa in Windows-skrivardrivrutin (%d)!\n"
+
+msgid ""
+"Usage: cupsaddsmb [options] printer1 ... printerN\n"
+" cupsaddsmb [options] -a\n"
+"\n"
+"Options:\n"
+" -E Encrypt the connection to the server\n"
+" -H samba-server Use the named SAMBA server\n"
+" -U samba-user Authenticate using the named SAMBA user\n"
+" -a Export all printers\n"
+" -h cups-server Use the named CUPS server\n"
+" -v Be verbose (show commands)\n"
+msgstr ""
+"Användning: cupsaddsmb [flaggor] skrivare1 ... skrivareN\n"
+" cupsaddsmb [flaggor] -a\n"
+"\n"
+"Flaggor:\n"
+" -E Kryptera anslutningen till servern\n"
+" -H samba-server Använd angiven SAMBA-server\n"
+" -U samba-user Autentisera med angiven SAMBA-användare\n"
+" -a Exportera alla skrivare\n"
+" -h cups-server Använd angiven CUPS-server\n"
+" -v Var informativ (visa kommandon)\n"
+
+#, c-format
+msgid "Unable to copy Windows 2000 printer driver files (%d)!"
+msgstr "Kunde inte kopiera filer för Windows 2000-skrivardrivrutin (%d)!"
+
+#, c-format
+msgid "Unable to copy CUPS printer driver files (%d)!"
+msgstr "Kunde inte kopiera filer för CUPS-skrivardrivrutin (%d)!"
+
+#, c-format
+msgid "Unable to install Windows 2000 printer driver files (%d)!"
+msgstr "Kunde inte installera filer för Windows 2000-skrivardrivrutin (%d)!"
+
+#, c-format
+msgid "Unable to copy Windows 9x printer driver files (%d)!"
+msgstr "Kunde inte kopiera filer för Windows 9x-skrivardrivrutin (%d)!"
+
+#, c-format
+msgid "Unable to install Windows 9x printer driver files (%d)!"
+msgstr "Kunde inte installera filer för Windows 9x-skrivardrivrutin (%d)!"
+
+msgid "No Windows printer drivers are installed!"
+msgstr "Inga skrivardrivrutiner för Windows 2000 är installerade!"
+
+msgid "Warning, no Windows 2000 printer drivers are installed!"
+msgstr "Varning, inga skrivardrivrutiner för Windows 2000 är installerade!"
+
+#, c-format
+msgid "open of %s failed: %s"
+msgstr "öppnande av %s misslyckades: %s"
+
+#, c-format
+msgid "Running command: %s %s -N -A %s -c '%s'\n"
+msgstr "Kör kommando: %s %s -N -A %s -c '%s'\n"
+
+#, c-format
+msgid "stat of %s failed: %s"
+msgstr "status för %s misslyckades: %s"
+
+#, c-format
+msgid "Job #%d is already cancelled - can't cancel."
+msgstr "Jobb #%d är redan avbrutet - kan inte avbryta."
+
+#, c-format
+msgid "Job #%d is already aborted - can't cancel."
+msgstr "Jobb #%d är redan avbrutet - kan inte avbryta."
+
+#, c-format
+msgid "Job #%d is already completed - can't cancel."
+msgstr "Jobb #%d är redan färdigt - kan inte avbryta."
+
+#, c-format
+msgid "You must access this page using the URL <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
+msgstr "Du måste komma åt sidan med url:en <A HREF=\"https://%s:%d%s\">https://%s:%d%s</A>."
+
+#, c-format
+msgid "Unsupported format '%s'!"
+msgstr "Formatet \"%s\" stöds inte!"
+
+msgid "FAIL\n"
+msgstr "FEL\n"
+
+#, c-format
+msgid ""
+" Line %d is longer than 255 characters (%d)!\n"
+" REF: Page 25, Line Length\n"
+msgstr ""
+" Rad %d är längre än 255 tecken (%d)!\n"
+" REF: Sida 25, Line Length\n"
+
+msgid ""
+" Missing %!PS-Adobe-3.0 on first line!\n"
+" REF: Page 17, 3.1 Conforming Documents\n"
+msgstr ""
+" Saknar %!PS-Adobe-3.0 på första raden!\n"
+" REF: Sida 17, 3.1 Conforming Documents\n"
+
+#, c-format
+msgid ""
+" Bad %%%%Pages: on line %d!\n"
+" REF: Page 43, %%%%Pages:\n"
+msgstr ""
+" Felaktig %%%%Pages: på rad %d!\n"
+" REF: Sida 43, %%%%Pages:\n"
+
+#, c-format
+msgid ""
+" Bad %%%%BoundingBox: on line %d!\n"
+" REF: Page 39, %%%%BoundingBox:\n"
+msgstr ""
+" Felaktig %%%%BoundingBox: på rad %d!\n"
+" REF: Sida 39, %%%%BoundingBox:\n"
+
+#, c-format
+msgid ""
+" Bad %%%%Page: on line %d!\n"
+" REF: Page 53, %%%%Page:\n"
+msgstr ""
+" Felaktig %%%%Page: på rad %d!\n"
+" REF: Sida 53, %%%%Page:\n"
+
+#, c-format
+msgid ""
+" Missing or bad %%BoundingBox: comment!\n"
+" REF: Page 39, %%BoundingBox:\n"
+msgstr ""
+" Saknar eller felaktig %%BoundingBox: kommentar!\n"
+" REF: Sida 39, %%BoundingBox:\n"
+
+#, c-format
+msgid ""
+" Missing or bad %%Pages: comment!\n"
+" REF: Page 43, %%Pages:\n"
+msgstr ""
+" Saknar eller felaktig %%Pages: kommentar!\n"
+" REF: Sida 43, %%Pages:\n"
+
+#, c-format
+msgid ""
+" Missing %%EndComments comment!\n"
+" REF: Page 41, %%EndComments\n"
+msgstr ""
+" Saknar %%EndComments-kommentar!\n"
+" REF: Sida 41, %%EndComments\n"
+
+#, c-format
+msgid ""
+" Missing or bad %%Page: comments!\n"
+" REF: Page 53, %%Page:\n"
+msgstr ""
+" Saknar eller felaktig %%Page: kommentarer!\n"
+" REF: Sida 53, %%Page:\n"
+
+#, c-format
+msgid " Too many %%EndDocument comments!\n"
+msgstr " För många %%EndDocument-kommentarer!\n"
+
+#, c-format
+msgid " Too many %%BeginDocument comments!\n"
+msgstr " För många %%BeginDocument-kommentarer!\n"
+
+#, c-format
+msgid " Saw %d lines that exceeded 255 characters!\n"
+msgstr " Såg %d rader som översteg 255 tecken!\n"
+
+msgid "PASS\n"
+msgstr "OK\n"
+
+msgid " Warning: file contains binary data!\n"
+msgstr " Varning: filen innehåller binärdata!\n"
+
+#, c-format
+msgid " Warning: obsolete DSC version %.1f in file!\n"
+msgstr " Varning: föråldrad DSC-version %.1f i fil!\n"
+
+#, c-format
+msgid " Warning: no %%EndComments comment in file!\n"
+msgstr " Varning: ingen %%EndComments-kommentar i fil!\n"
+
+msgid ""
+"Usage: cupstestdsc [options] filename.ps [... filename.ps]\n"
+" cupstestdsc [options] -\n"
+"\n"
+"Options:\n"
+"\n"
+" -h Show program usage\n"
+"\n"
+" Note: this program only validates the DSC comments, not the PostScript itself.\n"
+msgstr ""
+"Användning: cupstestdsc [flaggor] filnamn.ps [... filnamn.ps]\n"
+" cupstestdsc [flaggor] -\n"
+"\n"
+"Flaggor:\n"
+"\n"
+" -h Visa programanvändning\n"
+"\n"
+" Notera: detta program validerar endast DSC-kommentarer, inte själva PostScript.\n"
+
#
-# "$Id: Makefile 5317 2006-03-21 02:35:37Z mike $"
+# "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $"
#
# Man page makefile for the Common UNIX Printing System (CUPS).
#
lpstat.$(MAN1EXT)
MAN5 = classes.conf.$(MAN5EXT) \
client.conf.$(MAN5EXT) \
+ cups-snmp.conf.$(MAN5EXT) \
cupsd.conf.$(MAN5EXT) \
mime.convs.$(MAN5EXT) \
mime.types.$(MAN5EXT) \
#
-# End of "$Id: Makefile 5317 2006-03-21 02:35:37Z mike $".
+# End of "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $".
#
.\"
-.\" "$Id: cups-lpd.man.in 5279 2006-03-11 13:40:45Z mike $"
+.\" "$Id: cups-lpd.man.in 5455 2006-04-24 13:49:59Z mike $"
.\"
.\" cups-lpd man page for the Common UNIX Printing System (CUPS).
.\"
.\" EMail: cups-info@cups.org
.\" WWW: http://www.cups.org
.\"
-.TH cups-lpd 8 "Common UNIX Printing System" "11 March 2006" "Easy Software Products"
+.TH cups-lpd 8 "Common UNIX Printing System" "24 April 2006" "Easy Software Products"
.SH NAME
cups-lpd \- receive print jobs and report printer status to lpd clients
.SH SYNOPSIS
.B cups-lpd
-[ -o
+[ -n ] [ -o
.I option=value
]
.SH DESCRIPTION
.fi
.SH OPTIONS
.TP 5
+-n
+.br
+Disables reverse address lookups; normally \fIcups-lpd\fR will
+try to discover the hostname of the client via a reverse DNS
+lookup.
+.TP 5
-o name=value
.br
Inserts options for all print queues. Most often this is used to
.SH COPYRIGHT
Copyright 1997-2006 by Easy Software Products, All Rights Reserved.
.\"
-.\" End of "$Id: cups-lpd.man.in 5279 2006-03-11 13:40:45Z mike $".
+.\" End of "$Id: cups-lpd.man.in 5455 2006-04-24 13:49:59Z mike $".
.\"
--- /dev/null
+.\"
+.\" "$Id$"
+.\"
+.\" snmp.conf man page for the Common UNIX Printing System (CUPS).
+.\"
+.\" Copyright 2006 by Easy Software Products.
+.\"
+.\" These coded instructions, statements, and computer programs are the
+.\" property of Easy Software Products and are protected by Federal
+.\" copyright law. Distribution and use rights are outlined in the file
+.\" "LICENSE.txt" which should have been included with this file. If this
+.\" file is missing or damaged please contact Easy Software Products
+.\" at:
+.\"
+.\" Attn: CUPS Licensing Information
+.\" Easy Software Products
+.\" 44141 Airport View Drive, Suite 204
+.\" Hollywood, Maryland 20636 USA
+.\"
+.\" Voice: (301) 373-9600
+.\" EMail: cups-info@cups.org
+.\" WWW: http://www.cups.org
+.\"
+.TH snmp.conf 5 "Common UNIX Printing System" "18 April 2006" "Easy Software Products"
+.SH NAME
+snmp.conf \- snmp configuration file for cups
+.SH DESCRIPTION
+The \fIsnmp.conf\fR file configures the CUPS SNMP printer
+discovery backend and is normally located in the \fI/etc/cups\fR
+directory. Each line in the file can be a configuration
+directive, a blank line, or a comment. Comment lines start with
+the # character.
+.LP
+The SNMP backend uses the SNMPv1 protocol to discover network
+printers, collecting information from the Host MIB along with
+intelligent port probes to determine the correct device URI and
+make and model for each printer. Future versions of CUPS will
+likely support the new Port Monitor MIB as well.
+.SH DIRECTIVES
+The following directives are understood by the SNMP backend.
+Consult the on-line help for detailed descriptions:
+.TP 5
+Address @IF(\fIname\fR)
+.TP 5
+Address @LOCAL
+.TP 5
+Address \fIaddress\fR
+.br
+Sends SNMP broadcast queries to the specified address(es). The
+default address is "@LOCAL" which broadcasts to all LAN
+interfaces.
+.TP 5
+Community \fIname\fR
+.br
+Specifies a SNMP community to query. The default community is
+"public".
+.TP 5
+DebugLevel \fIN\fR
+.br
+Sets the debug logging level to \fIN\fR; 0 disables debug
+logging, 1 enables basic logging, 2 displays SNMP values, and 3
+displays raw hex data.
+.TP 5
+HostNameLookups on
+.TP 5
+HostNameLookups off
+.br
+Specifies whether the addresses of printers should be converted
+to hostnames or left as numeric IP addresses. The default is
+"off".
+.SH SEE ALSO
+http://localhost:631/help
+.SH COPYRIGHT
+Copyright 2006 by Easy Software Products, All Rights Reserved.
+.\"
+.\" End of "$Id$".
+.\"
.\"
-.\" "$Id: cupsaddsmb.man.in 5327 2006-03-23 19:53:24Z mike $"
+.\" "$Id: cupsaddsmb.man.in 5445 2006-04-20 18:25:40Z mike $"
.\"
.\" cupsaddsmb man page for the Common UNIX Printing System (CUPS).
.\"
.\" EMail: cups-info@cups.org
.\" WWW: http://www.cups.org
.\"
-.TH cupsaddsmb 8 "Common UNIX Printing System" "23 March 2006" "Easy Software Products"
+.TH cupsaddsmb 8 "Common UNIX Printing System" "19 April 2006" "Easy Software Products"
.SH NAME
cupsaddsmb \- export printers to samba for windows clients
+
.SH SYNOPSIS
.B cupsaddsmb
[ -H
] [ -h
.I cups-server[:port]
] [ -v ] printer [ ... printer ]
+
.SH DESCRIPTION
\fIcupsaddsmb\fR exports printers to the SAMBA software (version
2.2.0 or higher) for use with Windows clients. Depending on the
SAMBA configuration, you may need to provide a password to
export the printers. This program requires the Windows printer
driver files described below.
+
.SH OPTIONS
\fIcupsaddsmb\fR supports the following options:
.TP 5
.br
Specifies that verbose information should be shown. This is
useful for debugging SAMBA configuration problems.
+
.SH SAMBA CONFIGURATION
\fIcupsaddsmb\fR uses the new RPC-based printing support in
SAMBA 2.2.x to provide printer drivers and PPD files to Windows
pscript.ntf
pscript5.dll
.fi
+.LP
+\fBNote:\fR Unlike Windows, case is significant - make sure that
+you use the lowercase filenames shown above, otherwise
+\fIcupsaddsmb\fR will fail to export the drivers.
.SH CUPS POSTSCRIPT DRIVERS FOR WINDOWS
\fIcupsaddsmb\fR can use the CUPS v6 PostScript printer driver
pscript.ntf
pscript5.dll
.fi
+.LP
+\fBNote:\fR Unlike Windows, case is significant - make sure that
+you use the lowercase filenames shown above, otherwise
+\fIcupsaddsmb\fR will fail to export the drivers.
.SH ADOBE POSTSCRIPT DRIVERS FOR WINDOWS 95, 98, AND ME
\fIcupsaddsmb\fR can use the Adobe PostScript printer driver for
The Adobe driver does not support the page-label, job-billing, or
job-hold-until options.
.LP
-Once you have extracted the driver files, copy them to the
-\fI@CUPS_DATADIR@/drivers\fR directory exactly as named below:
+Once you have installed the driver on a Windows system, copy the
+following files to the \fI@CUPS_DATADIR@/drivers\fR directory
+exactly as named below:
.nf
[Windows 95, 98, and Me]
ICONLIB.DLL
PSMON.DLL
.fi
+.LP
+\fBNote:\fR Unlike Windows, case is significant - make sure that
+you use the UPPERCASE filenames shown above, otherwise
+\fIcupsaddsmb\fR will fail to export the drivers.
+
.SH SEE ALSO
\fIsmbd(8)\fR, \fIsmb.conf(5)\fR,
http://localhost:631/help
.br
http://www.cups.org/windows/
+
.SH COPYRIGHT
Copyright 1997-2006 by Easy Software Products, All Rights Reserved.
.\"
-.\" End of "$Id: cupsaddsmb.man.in 5327 2006-03-23 19:53:24Z mike $".
+.\" End of "$Id: cupsaddsmb.man.in 5445 2006-04-20 18:25:40Z mike $".
.\"
#
-# "$Id: cups.list.in 5371 2006-04-04 22:19:35Z mike $"
+# "$Id: cups.list.in 5449 2006-04-22 04:05:45Z mike $"
#
# ESP Package Manager (EPM) file list for the Common UNIX Printing
# System (CUPS).
%subpackage ja
%description Common UNIX Printing System - Japanese support
+%subpackage pl
+%description Common UNIX Printing System - Polish support
+
+%subpackage sv
+%description Common UNIX Printing System - Swedish support
+
%subpackage
d 0755 root sys $SERVERBIN -
d 0755 root sys $SERVERBIN/backend -
-f 0755 root sys $SERVERBIN/backend/ipp backend/ipp
-l 0755 root sys $SERVERBIN/backend/http ipp
-f 0755 root sys $SERVERBIN/backend/lpd backend/lpd
+f 0700 root sys $SERVERBIN/backend/ipp backend/ipp
+l 0700 root sys $SERVERBIN/backend/http ipp
+f 0700 root sys $SERVERBIN/backend/lpd backend/lpd
f 0755 root sys $SERVERBIN/backend/parallel backend/parallel
f 0755 root sys $SERVERBIN/backend/scsi backend/scsi
f 0755 root sys $SERVERBIN/backend/serial backend/serial
+f 0755 root sys $SERVERBIN/backend/snmp backend/snmp
f 0755 root sys $SERVERBIN/backend/socket backend/socket
f 0755 root sys $SERVERBIN/backend/usb backend/usb
d 0755 root sys $SERVERBIN/cgi-bin -
f 0644 root sys $LOCALEDIR/es/cups_es.po locale/cups_es.po
%subpackage ja
f 0644 root sys $LOCALEDIR/ja/cups_ja.po locale/cups_ja.po
+%subpackage pl
+#f 0644 root sys $LOCALEDIR/pl/cups_pl.po locale/cups_pl.po
+%subpackage sv
+f 0644 root sys $LOCALEDIR/sv/cups_sv.po locale/cups_sv.po
%subpackage
d 0755 root sys $DATADIR -
%subpackage ja
d 0755 root sys $DATADIR/templates/ja
f 0644 root sys $DATADIR/templates/ja templates/ja/*.tmpl
+%subpackage pl
+d 0755 root sys $DATADIR/templates/pl
+f 0644 root sys $DATADIR/templates/pl templates/pl/*.tmpl
+%subpackage sv
+d 0755 root sys $DATADIR/templates/sv
+f 0644 root sys $DATADIR/templates/sv templates/sv/*.tmpl
%subpackage
# Config files
d 0755 root $CUPS_GROUP $SERVERROOT/ppd -
c $CUPS_PERM root $CUPS_GROUP $SERVERROOT conf/*.conf
f $CUPS_PERM root $CUPS_GROUP $SERVERROOT/cupsd.conf.default conf/cupsd.conf
-f $CUPS_PERM root $CUPS_GROUP $SERVERROOT/mime.convs conf/mime.convs
-f $CUPS_PERM root $CUPS_GROUP $SERVERROOT/mime.types conf/mime.types
+f 0644 root $CUPS_GROUP $SERVERROOT/mime.convs conf/mime.convs
+f 0644 root $CUPS_GROUP $SERVERROOT/mime.types conf/mime.types
%if PAMDIR
d 0755 root sys $PAMDIR -
f 0644 root sys $DOCDIR/ja doc/ja/*.html
d 0755 root sys $DOCDIR/ja/images -
f 0644 root sys $DOCDIR/ja/images doc/ja/images/*.gif
+%subpackage pl
+d 0755 root sys $DOCDIR/pl
+f 0644 root sys $DOCDIR/pl doc/pl/*.html
+d 0755 root sys $DOCDIR/pl/images -
+f 0644 root sys $DOCDIR/pl/images doc/pl/images/*.gif
+%subpackage sv
+d 0755 root sys $DOCDIR/sv
+f 0644 root sys $DOCDIR/sv doc/sv/*.html
+d 0755 root sys $DOCDIR/sv/images -
+f 0644 root sys $DOCDIR/sv/images doc/sv/images/*.gif
%subpackage
# Man pages
i 0755 root sys cups init/cups.sh
#
-# End of "$Id: cups.list.in 5371 2006-04-04 22:19:35Z mike $".
+# End of "$Id: cups.list.in 5449 2006-04-22 04:05:45Z mike $".
#
#
-# "$Id: cups.spec.in 5364 2006-04-01 01:32:50Z mike $"
+# "$Id: cups.spec.in 5449 2006-04-22 04:05:45Z mike $"
#
# RPM "spec" file for the Common UNIX Printing System (CUPS).
#
Group: System Environment/Daemons
Requires: %{name} = %{epoch}:%{version}
+%package pl
+Summary: Common UNIX Printing System - Polish support
+Group: System Environment/Daemons
+Requires: %{name} = %{epoch}:%{version}
+
+%package sv
+Summary: Common UNIX Printing System - Swedish support
+Group: System Environment/Daemons
+Requires: %{name} = %{epoch}:%{version}
+
%if %{?_with_php:1}%{!?_with_php:0}
%package php
Summary: Common UNIX Printing System - PHP support
The Common UNIX Printing System provides a portable printing layer for
UNIX® operating systems. This package provides Japanese support.
+%description pl
+The Common UNIX Printing System provides a portable printing layer for
+UNIX® operating systems. This package provides Polish support.
+
+%description sv
+The Common UNIX Printing System provides a portable printing layer for
+UNIX® operating systems. This package provides Swedish support.
+
%if %{?_with_php:1}%{!?_with_php:0}
%description php
The Common UNIX Printing System provides a portable printing layer for
/usr/lib/cups/backend/parallel
/usr/lib/cups/backend/scsi
/usr/lib/cups/backend/serial
+/usr/lib/cups/backend/snmp
/usr/lib/cups/backend/socket
/usr/lib/cups/backend/usb
%dir /usr/lib/cups/cgi-bin
/usr/share/cups/templates/ja/*
/usr/share/locale/ja/cups_ja.po
+%files pl
+%defattr(-,root,root)
+%dir /usr/share/doc/cups/pl
+/usr/share/doc/cups/pl/index.html
+%dir /usr/share/doc/cups/pl/images
+/usr/share/doc/cups/pl/images/*
+%dir /usr/share/cups/templates/pl
+/usr/share/cups/templates/pl/*
+#/usr/share/locale/pl/cups_pl.po
+
+%files sv
+%defattr(-,root,root)
+%dir /usr/share/doc/cups/sv
+/usr/share/doc/cups/sv/index.html
+%dir /usr/share/doc/cups/sv/images
+/usr/share/doc/cups/sv/images/*
+%dir /usr/share/cups/templates/sv
+/usr/share/cups/templates/sv/*
+/usr/share/locale/sv/cups_sv.po
+
%if %{?_with_php:1}%{!?_with_php:0}
%files php
# PHP
#
-# End of "$Id: cups.spec.in 5364 2006-04-01 01:32:50Z mike $".
+# End of "$Id: cups.spec.in 5449 2006-04-22 04:05:45Z mike $".
#
/*
- * "$Id: auth.c 5336 2006-03-24 16:37:29Z mike $"
+ * "$Id: auth.c 5442 2006-04-20 14:00:02Z mike $"
*
* Authorization routines for the Common UNIX Printing System (CUPS).
*
* cupsdAddName() - Add a name to a location...
* cupsdAllowHost() - Add a host name that is allowed to access the
* location.
- * cupsdAllowIP() - Add an IP address or network that is allowed to
- * access the location.
+ * cupsdAllowIP() - Add an IP address or network that is allowed
+ * to access the location.
+ * cupsdAuthorize() - Validate any authorization credentials.
* cupsdCheckAuth() - Check authorization masks.
* cupsdCheckGroup() - Check for a user's group membership.
* cupsdCopyLocation() - Make a copy of a location...
- * cupsdDeleteAllLocations() - Free all memory used for location authorization.
+ * cupsdDeleteAllLocations() - Free all memory used for location
+ * authorization.
* cupsdDeleteLocation() - Free all memory used by a location.
- * cupsdDenyHost() - Add a host name that is not allowed to access the
- * location.
- * cupsdDenyIP() - Add an IP address or network that is not allowed
- * to access the location.
+ * cupsdDenyHost() - Add a host name that is not allowed to access
+ * the location.
+ * cupsdDenyIP() - Add an IP address or network that is not
+ * allowed to access the location.
* cupsdFindBest() - Find the location entry that best matches the
* resource.
* cupsdFindLocation() - Find the named location.
/*
- * End of "$Id: auth.c 5336 2006-03-24 16:37:29Z mike $".
+ * End of "$Id: auth.c 5442 2006-04-20 14:00:02Z mike $".
*/
/*
- * "$Id: client.c 5373 2006-04-06 20:03:32Z mike $"
+ * "$Id: client.c 5416 2006-04-17 21:24:17Z mike $"
*
* Client routines for the Common UNIX Printing System (CUPS) scheduler.
*
SSL *conn; /* Connection for encryption */
unsigned long error; /* Error code */
#elif defined(HAVE_GNUTLS)
- http_tls_t *conn; /* TLS connection information */
- int error; /* Error code */
+ http_tls_t *conn; /* TLS connection information */
+ int error; /* Error code */
gnutls_certificate_server_credentials *credentials;
/* TLS credentials */
+# elif defined(HAVE_CDSASSL)
+ http_tls_t *conn; /* CDSA connection information */
#endif /* HAVE_LIBSSL */
free(conn);
# elif defined(HAVE_CDSASSL)
- while (SSLClose((SSLContextRef)con->http.tls) == errSSLWouldBlock)
+ conn = (http_tls_t *)(con->http.tls);
+
+ while (SSLClose(conn->session) == errSSLWouldBlock)
usleep(1000);
- SSLDisposeContext((SSLContextRef)con->http.tls);
+ SSLDisposeContext(conn->session);
+
+ if (conn->certsArray)
+ CFRelease(conn->certsArray);
+
+ free(conn);
# endif /* HAVE_LIBSSL */
con->http.tls = NULL;
con->start = time(NULL);
con->operation = con->http.state;
- cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdReadClient: %d %s %s HTTP/%d.%d", con->http.fd,
- operation, con->uri,
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdReadClient: %d %s %s HTTP/%d.%d",
+ con->http.fd, operation, con->uri,
con->http.version / 100, con->http.version % 100);
con->http.status = HTTP_OK;
snprintf(locale, sizeof(locale), "%s.%s",
con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE], DefaultCharset);
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
+ "cupsdReadClient: %d Browser asked for language \"%s\"...",
+ con->http.fd, locale);
+
con->language = cupsLangGet(locale);
}
else
* Create the SSL object and perform the SSL handshake...
*/
- conn = (http_tls_t *)malloc(sizeof(gnutls_session));
+ conn = (http_tls_t *)malloc(sizeof(http_tls_t));
if (conn == NULL)
return (0);
return (1);
# elif defined(HAVE_CDSASSL)
- OSStatus error; /* Error info */
- SSLContextRef conn; /* New connection */
- CFArrayRef certificatesArray;
- /* Array containing certificates */
- int allowExpired; /* Allow expired certificates? */
- int allowAnyRoot; /* Allow any root certificate? */
- cdsa_conn_ref_t u; /* Connection reference union */
+ OSStatus error; /* Error code */
+ http_tls_t *conn; /* CDSA connection information */
+ cdsa_conn_ref_t u; /* Connection reference union */
- conn = NULL;
- error = SSLNewContext(true, &conn);
- allowExpired = 1;
- allowAnyRoot = 1;
+ if ((conn = (http_tls_t *)malloc(sizeof(http_tls_t))) == NULL)
+ return (0);
- certificatesArray = get_cdsa_server_certs();
+ error = 0;
+ conn->session = NULL;
+ conn->certsArray = get_cdsa_server_certs();
- if (!certificatesArray)
+ if (!conn->certsArray)
{
cupsdLogMessage(CUPSD_LOG_ERROR,
"EncryptClient: Could not find signing key in keychain "
}
if (!error)
- error = SSLSetIOFuncs(conn, _httpReadCDSA, _httpWriteCDSA);
+ error = SSLNewContext(true, &conn->session);
if (!error)
- error = SSLSetProtocolVersion(conn, kSSLProtocol3);
+ error = SSLSetIOFuncs(conn->session, _httpReadCDSA, _httpWriteCDSA);
+
+ if (!error)
+ error = SSLSetProtocolVersion(conn->session, kSSLProtocol3);
if (!error)
{
u.connection = NULL;
u.sock = con->http.fd;
- error = SSLSetConnection(conn, u.connection);
+ error = SSLSetConnection(conn->session, u.connection);
}
if (!error)
- error = SSLSetPeerDomainName(conn, ServerName, strlen(ServerName) + 1);
-
- /*
- * Have to set these options before setting server certs...
- */
-
- if (!error && allowExpired)
- error = SSLSetAllowsExpiredCerts(conn, true);
-
- if (!error && allowAnyRoot)
- error = SSLSetAllowsAnyRoot(conn, true);
+ error = SSLSetAllowsExpiredCerts(conn->session, true);
if (!error)
- error = SSLSetCertificate(conn, certificatesArray);
+ error = SSLSetAllowsAnyRoot(conn->session, true);
- if (certificatesArray)
- {
- CFRelease(certificatesArray);
- certificatesArray = NULL;
- }
+ if (!error)
+ error = SSLSetCertificate(conn->session, conn->certsArray);
if (!error)
{
* Perform SSL/TLS handshake
*/
- while ((error = SSLHandshake(conn)) == errSSLWouldBlock)
+ while ((error = SSLHandshake(conn->session)) == errSSLWouldBlock)
usleep(1000);
}
con->http.error = error;
con->http.status = HTTP_ERROR;
- if (conn != NULL)
- SSLDisposeContext(conn);
+ if (conn->session)
+ SSLDisposeContext(conn->session);
+
+ if (conn->certsArray)
+ CFRelease(conn->certsArray);
+
+ free(conn);
return (0);
}
/*
- * End of "$Id: client.c 5373 2006-04-06 20:03:32Z mike $".
+ * End of "$Id: client.c 5416 2006-04-17 21:24:17Z mike $".
*/
/*
- * "$Id: cups-driverd.c 5333 2006-03-24 00:52:21Z mike $"
+ * "$Id: cups-driverd.c 5422 2006-04-18 15:16:00Z mike $"
*
* PPD/driver support for the Common UNIX Printing System (CUPS).
*
const char *natural_language, /* I - Language(s) */
const char *make, /* I - Manufacturer */
const char *make_and_model, /* I - NickName */
- const char *device_id, /* I - 1284DeviceId */
+ const char *device_id, /* I - 1284DeviceID */
time_t mtime, /* I - Modification time */
size_t size) /* I - File size */
{
make_model[256], /* Make and Model */
model_name[256], /* ModelName */
nick_name[256], /* NickName */
- device_id[256]; /* 1284DeviceId */
+ device_id[256]; /* 1284DeviceID */
ppd_info_t *ppd, /* New PPD file */
key; /* Search key */
int new_ppd; /* Is this a new PPD? */
sscanf(line, "%*[^:]:%63s", lang_version);
else if (!strncmp(line, "*NickName:", 10))
sscanf(line, "%*[^\"]\"%255[^\"]", nick_name);
- else if (!strncmp(line, "*1284DeviceId:", 14))
+ else if (!strncasecmp(line, "*1284DeviceID:", 14))
sscanf(line, "%*[^\"]\"%255[^\"]", device_id);
else if (!strncmp(line, "*OpenUI", 7))
{
/*
- * End of "$Id: cups-driverd.c 5333 2006-03-24 00:52:21Z mike $".
+ * End of "$Id: cups-driverd.c 5422 2006-04-18 15:16:00Z mike $".
*/
/*
- * "$Id: cups-lpd.c 5204 2006-02-28 20:32:43Z mike $"
+ * "$Id: cups-lpd.c 5455 2006-04-24 13:49:59Z mike $"
*
* Line Printer Daemon interface for the Common UNIX Printing System (CUPS).
*
char hostname[256], /* Name of client */
hostip[256], /* IP address */
*hostfamily; /* Address family */
+ int hostlookups; /* Do hostname lookups? */
/*
openlog("cups-lpd", LOG_PID, LOG_LPR);
- /*
- * Get the address of the client...
- */
-
- hostlen = sizeof(hostaddr);
-
- if (getpeername(0, (struct sockaddr *)&hostaddr, &hostlen))
- {
- syslog(LOG_WARNING, "Unable to get client address - %s", strerror(errno));
- strcpy(hostname, "unknown");
- }
- else
- {
- httpAddrLookup(&hostaddr, hostname, sizeof(hostname));
- httpAddrString(&hostaddr, hostip, sizeof(hostip));
-
-#ifdef AF_INET6
- if (hostaddr.addr.sa_family == AF_INET6)
- hostfamily = "IPv6";
- else
-#endif /* AF_INET6 */
- hostfamily = "IPv4";
-
- syslog(LOG_INFO, "Connection from %s (%s %s)", hostname, hostfamily,
- hostip);
- }
-
/*
* Scan the command-line for options...
*/
num_defaults = 0;
defaults = NULL;
-
+ hostlookups = 1;
num_defaults = cupsAddOption("job-originating-host-name", hostname,
num_defaults, &defaults);
syslog(LOG_WARNING, "Expected option string after -o option!");
}
break;
+
+ case 'n' : /* Don't do hostname lookups */
+ hostlookups = 0;
+ break;
+
default :
syslog(LOG_WARNING, "Unknown option \"%c\" ignored!", argv[i][1]);
break;
syslog(LOG_WARNING, "Unknown command-line option \"%s\" ignored!",
argv[i]);
+ /*
+ * Get the address of the client...
+ */
+
+ hostlen = sizeof(hostaddr);
+
+ if (getpeername(0, (struct sockaddr *)&hostaddr, &hostlen))
+ {
+ syslog(LOG_WARNING, "Unable to get client address - %s", strerror(errno));
+ strcpy(hostname, "unknown");
+ }
+ else
+ {
+ httpAddrString(&hostaddr, hostip, sizeof(hostip));
+
+ if (hostlookups)
+ httpAddrLookup(&hostaddr, hostname, sizeof(hostname));
+ else
+ strlcpy(hostname, hostip, sizeof(hostname));
+
+#ifdef AF_INET6
+ if (hostaddr.addr.sa_family == AF_INET6)
+ hostfamily = "IPv6";
+ else
+#endif /* AF_INET6 */
+ hostfamily = "IPv4";
+
+ syslog(LOG_INFO, "Connection from %s (%s %s)", hostname, hostfamily,
+ hostip);
+ }
+
/*
* RFC1179 specifies that only 1 daemon command can be received for
* every connection.
/*
- * End of "$Id: cups-lpd.c 5204 2006-02-28 20:32:43Z mike $".
+ * End of "$Id: cups-lpd.c 5455 2006-04-24 13:49:59Z mike $".
*/
/*
- * "$Id: dirsvc.c 5349 2006-03-29 15:22:10Z mike $"
+ * "$Id: dirsvc.c 5448 2006-04-22 03:57:26Z mike $"
*
* Directory services routines for the Common UNIX Printing System (CUPS).
*
(p->type & CUPS_PRINTER_CLASS) ? "Class" : "Printer",
p->name);
- cupsdLogMessage(CUPSD_LOG_INFO,
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
"Remote destination \"%s\" has timed out; "
"deleting it...",
p->name);
if (p->type & CUPS_PRINTER_REMOTE)
{
- cupsdLogMessage(CUPSD_LOG_INFO,
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
"Renamed remote class \"%s\" to \"%s@%s\"...",
p->name, p->name, p->hostname);
cupsdAddEvent(CUPSD_EVENT_PRINTER_DELETED, p, NULL,
p = cupsdAddClass(name);
- cupsdLogMessage(CUPSD_LOG_INFO, "Added remote class \"%s\"...", name);
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Added remote class \"%s\"...", name);
cupsdAddEvent(CUPSD_EVENT_PRINTER_ADDED, p, NULL,
"Class \'%s\' added by directory services.", name);
if (p->type & CUPS_PRINTER_REMOTE)
{
- cupsdLogMessage(CUPSD_LOG_INFO,
+ cupsdLogMessage(CUPSD_LOG_DEBUG,
"Renamed remote printer \"%s\" to \"%s@%s\"...",
p->name, p->name, p->hostname);
cupsdAddEvent(CUPSD_EVENT_PRINTER_DELETED, p, NULL,
cupsdAddEvent(CUPSD_EVENT_PRINTER_ADDED, p, NULL,
"Printer \'%s\' added by directory services.", name);
- cupsdLogMessage(CUPSD_LOG_INFO, "Added remote printer \"%s\"...", name);
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Added remote printer \"%s\"...", name);
/*
* Force the URI to point to the real server...
update = 1;
- cupsdLogMessage(CUPSD_LOG_INFO, "Added implicit class \"%s\"...",
+ cupsdLogMessage(CUPSD_LOG_DEBUG, "Added implicit class \"%s\"...",
name);
cupsdAddEvent(CUPSD_EVENT_PRINTER_ADDED, p, NULL,
"Implicit class \'%s\' added by directory services.",
/*
- * End of "$Id: dirsvc.c 5349 2006-03-29 15:22:10Z mike $".
+ * End of "$Id: dirsvc.c 5448 2006-04-22 03:57:26Z mike $".
*/
/*
- * "$Id: ipp.c 5383 2006-04-07 15:36:10Z mike $"
+ * "$Id: ipp.c 5438 2006-04-19 21:21:05Z mike $"
*
* IPP routines for the Common UNIX Printing System (CUPS) scheduler.
*
* set_printer_defaults() - Set printer default options from a request.
* start_printer() - Start a printer.
* stop_printer() - Stop a printer.
+ * url_encode_attr() - URL-encode a string attribute.
* user_allowed() - See if a user is allowed to print to a queue.
* validate_job() - Validate printer options and destination.
* validate_name() - Make sure the printer name only contains
cupsd_printer_t *printer);
static void start_printer(cupsd_client_t *con, ipp_attribute_t *uri);
static void stop_printer(cupsd_client_t *con, ipp_attribute_t *uri);
+static void url_encode_attr(ipp_attribute_t *attr, char *buffer,
+ int bufsize);
static int user_allowed(cupsd_printer_t *p, const char *username);
static void validate_job(cupsd_client_t *con, ipp_attribute_t *uri);
static int validate_name(const char *name);
get_devices(cupsd_client_t *con) /* I - Client connection */
{
http_status_t status; /* Policy status */
- int i; /* Looping var */
ipp_attribute_t *limit, /* Limit attribute */
*requested; /* requested-attributes attribute */
char command[1024], /* cups-deviced command */
options[1024], /* Options to pass to command */
- attrs[1024], /* String for requested attributes */
- *aptr; /* Pointer into string */
- int alen; /* Length of attribute value */
+ requested_str[256];
+ /* String for requested attributes */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", con, con->http.fd);
IPP_TAG_KEYWORD);
if (requested)
- {
- for (i = 0, aptr = attrs; i < requested->num_values; i ++)
- {
- /*
- * Check that we have enough room...
- */
-
- alen = strlen(requested->values[i].string.text);
- if (alen > (sizeof(attrs) - (aptr - attrs) - 2))
- break;
-
- /*
- * Put commas between values...
- */
-
- if (i)
- *aptr++ = ',';
-
- /*
- * Add the value to the end of the string...
- */
-
- strcpy(aptr, requested->values[i].string.text);
- aptr += alen;
- }
-
- /*
- * If we have more attribute names than will fit, default to "all"...
- */
-
- if (i < requested->num_values)
- strcpy(attrs, "all");
- }
+ url_encode_attr(requested, requested_str, sizeof(requested_str));
else
- strcpy(attrs, "all");
+ strlcpy(requested_str, "requested-attributes=all", sizeof(requested_str));
snprintf(command, sizeof(command), "%s/daemon/cups-deviced", ServerBin);
snprintf(options, sizeof(options),
- "%d+%d+%d+requested-attributes=%s",
+ "%d+%d+%d+%s",
con->request->request.op.request_id,
limit ? limit->values[0].integer : 0, (int)User,
- attrs);
+ requested_str);
if (cupsdSendCommand(con, command, options, 1))
{
get_ppds(cupsd_client_t *con) /* I - Client connection */
{
http_status_t status; /* Policy status */
- int i; /* Looping var */
ipp_attribute_t *limit, /* Limit attribute */
*make, /* ppd-make attribute */
*requested; /* requested-attributes attribute */
char command[1024], /* cups-deviced command */
options[1024], /* Options to pass to command */
- attrs[1024], /* String for requested attributes */
- *aptr; /* Pointer into string */
- int alen; /* Length of attribute value */
+ requested_str[256],
+ /* String for requested attributes */
+ make_str[256]; /* Escaped ppd-make string */
cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", con, con->http.fd);
IPP_TAG_KEYWORD);
if (requested)
- {
- for (i = 0, aptr = attrs; i < requested->num_values; i ++)
- {
- /*
- * Check that we have enough room...
- */
-
- alen = strlen(requested->values[i].string.text);
- if (alen > (sizeof(attrs) - (aptr - attrs) - 2))
- break;
-
- /*
- * Put commas between values...
- */
-
- if (i)
- *aptr++ = ',';
-
- /*
- * Add the value to the end of the string...
- */
-
- strcpy(aptr, requested->values[i].string.text);
- aptr += alen;
- }
-
- /*
- * If we have more attribute names than will fit, default to "all"...
- */
+ url_encode_attr(requested, requested_str, sizeof(requested_str));
+ else
+ strlcpy(requested_str, "requested-attributes=all", sizeof(requested_str));
- if (i < requested->num_values)
- strcpy(attrs, "all");
- }
+ if (make)
+ url_encode_attr(make, make_str, sizeof(make_str));
else
- strcpy(attrs, "all");
+ make_str[0] = '\0';
snprintf(command, sizeof(command), "%s/daemon/cups-driverd", ServerBin);
- snprintf(options, sizeof(options),
- "list+%d+%d+requested-attributes=%s%s%s",
+ snprintf(options, sizeof(options), "list+%d+%d+%s%s%s",
con->request->request.op.request_id,
limit ? limit->values[0].integer : 0,
- attrs,
- make ? "%20ppd-make=" : "",
- make ? make->values[0].string.text : "");
+ requested_str, make ? "%20" : "", make_str);
if (cupsdSendCommand(con, command, options, 0))
{
}
+/*
+ * 'url_encode_attr()' - URL-encode a string attribute.
+ */
+
+static void
+url_encode_attr(ipp_attribute_t *attr, /* I - Attribute */
+ char *buffer,/* I - String buffer */
+ int bufsize)/* I - Size of buffer */
+{
+ int i; /* Looping var */
+ char *bufptr, /* Pointer into buffer */
+ *bufend, /* End of buffer */
+ *valptr; /* Pointer into value */
+
+
+ strlcpy(buffer, attr->name, bufsize);
+ bufptr = buffer + strlen(buffer);
+ bufend = buffer + bufsize - 1;
+
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if (bufptr >= bufend)
+ break;
+
+ if (i)
+ *bufptr++ = ',';
+ else
+ *bufptr++ = '=';
+
+ if (bufptr >= bufend)
+ break;
+
+ *bufptr++ = '\'';
+
+ for (valptr = attr->values[i].string.text;
+ *valptr && bufptr < bufend;
+ valptr ++)
+ if (*valptr == ' ')
+ {
+ if (bufptr >= (bufend - 2))
+ break;
+
+ *bufptr++ = '%';
+ *bufptr++ = '2';
+ *bufptr++ = '0';
+ }
+ else if (*valptr == '\'' || *valptr == '\\')
+ {
+ *bufptr++ = '\\';
+ *bufptr++ = *valptr;
+ }
+ else
+ *bufptr++ = *valptr;
+
+ if (bufptr >= bufend)
+ break;
+
+ *bufptr++ = '\'';
+ }
+
+ *bufptr = '\0';
+}
+
+
/*
* 'user_allowed()' - See if a user is allowed to print to a queue.
*/
/*
- * End of "$Id: ipp.c 5383 2006-04-07 15:36:10Z mike $".
+ * End of "$Id: ipp.c 5438 2006-04-19 21:21:05Z mike $".
*/
/*
- * "$Id: job.c 5383 2006-04-07 15:36:10Z mike $"
+ * "$Id: job.c 5452 2006-04-22 22:17:32Z mike $"
*
* Job management routines for the Common UNIX Printing System (CUPS).
*
job = calloc(sizeof(cupsd_job_t), 1);
- job->id = NextJobId ++;
- job->priority = priority;
- job->back_pipes[0] = -1;
- job->back_pipes[1] = -1;
- job->print_pipes[0] = -1;
- job->print_pipes[1] = -1;
+ job->id = NextJobId ++;
+ job->priority = priority;
+ job->back_pipes[0] = -1;
+ job->back_pipes[1] = -1;
+ job->print_pipes[0] = -1;
+ job->print_pipes[1] = -1;
+ job->status_pipes[0] = -1;
+ job->status_pipes[1] = -1;
cupsdSetString(&job->dest, dest);
FD_CLR(job->status_buffer->fd, InputSet);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdFinishJob: Closing status input pipe %d...",
- job->status_buffer->fd);
+ "cupsdFinishJob: Closing status pipes [ %d %d ]...",
+ job->status_pipes[0], job->status_pipes[1]);
+ cupsdClosePipe(job->status_pipes);
cupsdStatBufDelete(job->status_buffer);
job->status_buffer = NULL;
((29 - curdate->tm_hour) * 60 + 59 -
curdate->tm_min) * 60 + 60 - curdate->tm_sec;
}
- else if (!strcmp(when, "evening") || strcmp(when, "night"))
+ else if (!strcmp(when, "evening") || !strcmp(when, "night"))
{
/*
* Hold to 6pm unless local time is > 6pm or < 6am.
FD_CLR(job->status_buffer->fd, InputSet);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "cupsdStopJob: Closing status input pipe %d...",
- job->status_buffer->fd);
+ "cupsdStopJob: Closing status pipes [ %d %d ]...",
+ job->status_pipes[0], job->status_pipes[1]);
+ cupsdClosePipe(job->status_pipes);
cupsdStatBufDelete(job->status_buffer);
job->status_buffer = NULL;
break;
}
- job->id = jobid;
- job->back_pipes[0] = -1;
- job->back_pipes[1] = -1;
- job->print_pipes[0] = -1;
- job->print_pipes[1] = -1;
+ job->id = jobid;
+ job->back_pipes[0] = -1;
+ job->back_pipes[1] = -1;
+ job->print_pipes[0] = -1;
+ job->print_pipes[1] = -1;
+ job->status_pipes[0] = -1;
+ job->status_pipes[1] = -1;
cupsdLogMessage(CUPSD_LOG_DEBUG, "Loading job %d from cache...", job->id);
}
char line[1024], /* Line buffer */
*value; /* Value on line */
int linenum; /* Line number in file */
+ int next_job_id; /* NextJobId value from line */
/*
if (!strcasecmp(line, "NextJobId"))
{
if (value)
- NextJobId = atoi(value);
+ {
+ next_job_id = atoi(value);
+ if (next_job_id > NextJobId)
+ NextJobId = next_job_id;
+ }
break;
}
}
* Assign the job ID...
*/
- job->id = atoi(dent->filename + 1);
- job->back_pipes[0] = -1;
- job->back_pipes[1] = -1;
- job->print_pipes[0] = -1;
- job->print_pipes[1] = -1;
+ job->id = atoi(dent->filename + 1);
+ job->back_pipes[0] = -1;
+ job->back_pipes[1] = -1;
+ job->print_pipes[0] = -1;
+ job->print_pipes[1] = -1;
+ job->status_pipes[0] = -1;
+ job->status_pipes[1] = -1;
if (job->id >= NextJobId)
NextJobId = job->id + 1;
int backroot; /* Run backend as root? */
int pid; /* Process ID of new filter process */
int banner_page; /* 1 if banner page, 0 otherwise */
- int statusfds[2], /* Pipes used with the scheduler */
- filterfds[2][2];/* Pipes used between filters */
+ int filterfds[2][2];/* Pipes used between filters */
int envc; /* Number of environment variables */
char **argv, /* Filter command-line arguments */
sani_uri[1024], /* Sanitized DEVICE_URI env var */
return;
}
+ if (printer->raw && !strncmp(printer->device_uri, "file:", 5))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR,
+ "Job ID %d cannot be printed to raw queue pointing to "
+ "a file!",
+ job->id);
+
+ strlcpy(printer->state_message, "Raw printers cannot use file: devices!",
+ sizeof(printer->state_message));
+ cupsdStopPrinter(printer, 1);
+ cupsdAddPrinterHistory(printer);
+ return;
+ }
+
/*
* Figure out what filters are required to convert from
* the source to the destination type...
filterfds[1][0] = -1;
filterfds[1][1] = -1;
- if (cupsdOpenPipe(statusfds))
+ if (!job->status_buffer)
{
- cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create job status pipes - %s.",
- strerror(errno));
- snprintf(printer->state_message, sizeof(printer->state_message),
- "Unable to create status pipes - %s.", strerror(errno));
-
- cupsdAddPrinterHistory(printer);
-
- cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
- "Job canceled because the server could not create the job "
- "status pipes.");
-
- goto abort_job;
+ if (cupsdOpenPipe(job->status_pipes))
+ {
+ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create job status pipes - %s.",
+ strerror(errno));
+ snprintf(printer->state_message, sizeof(printer->state_message),
+ "Unable to create status pipes - %s.", strerror(errno));
+
+ cupsdAddPrinterHistory(printer);
+
+ cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job,
+ "Job canceled because the server could not create the job "
+ "status pipes.");
+
+ goto abort_job;
+ }
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: status_pipes = [ %d %d ]",
+ job->status_pipes[0], job->status_pipes[1]);
+
+ job->status_buffer = cupsdStatBufNew(job->status_pipes[0], "[Job %d]",
+ job->id);
}
- cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job: statusfds = [ %d %d ]",
- statusfds[0], statusfds[1]);
-
-#ifdef FD_CLOEXEC
- fcntl(statusfds[0], F_SETFD, FD_CLOEXEC);
- fcntl(statusfds[1], F_SETFD, FD_CLOEXEC);
-#endif /* FD_CLOEXEC */
-
- job->status_buffer = cupsdStatBufNew(statusfds[0], "[Job %d]",
- job->id);
- job->status = 0;
+ job->status = 0;
memset(job->filters, 0, sizeof(job->filters));
filterfds[1][0] = open("/dev/null", O_RDONLY);
slot, filterfds[slot][0], filterfds[slot][1]);
pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
- filterfds[slot][1], statusfds[1],
+ filterfds[slot][1], job->status_pipes[1],
job->back_pipes[0], 0, job->filters + i);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
slot, filterfds[slot][0], filterfds[slot][1]);
pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
- filterfds[slot][1], statusfds[1],
+ filterfds[slot][1], job->status_pipes[1],
job->back_pipes[1], backroot,
&(job->backend));
job->back_pipes[0], job->back_pipes[1]);
cupsdClosePipe(job->back_pipes);
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "start_job: Closing status output pipe %d...",
+ job->status_pipes[1]);
+
+ close(job->status_pipes[1]);
+ job->status_pipes[1] = -1;
}
}
else
filterfds[slot][0] = -1;
filterfds[slot][1] = -1;
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "start_job: Closing filter pipes for slot %d "
- "[ %d %d ]...",
- !slot, filterfds[!slot][0], filterfds[!slot][1]);
-
- cupsdClosePipe(filterfds[!slot]);
-
if (job->current_file == job->num_files)
{
cupsdLogMessage(CUPSD_LOG_DEBUG2,
job->print_pipes[0], job->print_pipes[1]);
cupsdClosePipe(job->print_pipes);
+
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "start_job: Closing status output pipe %d...",
+ job->status_pipes[1]);
+
+ close(job->status_pipes[1]);
+ job->status_pipes[1] = -1;
}
}
- for (slot = 0; slot < 2; slot ++)
- {
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "start_job: Closing filter pipes for slot %d "
- "[ %d %d ]...",
- slot, filterfds[slot][0], filterfds[slot][1]);
- cupsdClosePipe(filterfds[slot]);
- }
+ cupsdLogMessage(CUPSD_LOG_DEBUG2,
+ "start_job: Closing filter pipes for slot %d "
+ "[ %d %d ]...",
+ slot, filterfds[slot][0], filterfds[slot][1]);
+ cupsdClosePipe(filterfds[slot]);
if (remote_job)
{
free(argv);
- cupsdLogMessage(CUPSD_LOG_DEBUG2,
- "start_job: Closing status output pipe %d...",
- statusfds[1]);
-
- close(statusfds[1]);
-
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"start_job: Adding fd %d to InputSet...",
job->status_buffer->fd);
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"start_job: Closing status pipes [ %d %d ]...",
- statusfds[0], statusfds[1]);
- cupsdClosePipe(statusfds);
+ job->status_pipes[0], job->status_pipes[1]);
+ cupsdClosePipe(job->status_pipes);
+ cupsdStatBufDelete(job->status_buffer);
cupsArrayDelete(filters);
/*
- * End of "$Id: job.c 5383 2006-04-07 15:36:10Z mike $".
+ * End of "$Id: job.c 5452 2006-04-22 22:17:32Z mike $".
*/
/*
- * "$Id: job.h 5383 2006-04-07 15:36:10Z mike $"
+ * "$Id: job.h 5393 2006-04-14 18:17:18Z mike $"
*
* Print job definitions for the Common UNIX Printing System (CUPS) scheduler.
*
ipp_attribute_t *job_sheets; /* Job sheets (NULL if none) */
int current_file; /* Current file in job */
ipp_t *attrs; /* Job attributes */
- cupsd_statbuf_t *status_buffer; /* Status buffer for this job */
int print_pipes[2], /* Print data pipes */
- back_pipes[2]; /* Backchannel pipes */
+ back_pipes[2], /* Backchannel pipes */
+ status_pipes[2];/* Status pipes */
+ cupsd_statbuf_t *status_buffer; /* Status buffer for this job */
int cost; /* Filtering cost */
int filters[MAX_FILTERS + 1];
/* Filter process IDs, 0 terminated */
/*
- * End of "$Id: job.h 5383 2006-04-07 15:36:10Z mike $".
+ * End of "$Id: job.h 5393 2006-04-14 18:17:18Z mike $".
*/
/*
- * "$Id: main.c 5383 2006-04-07 15:36:10Z mike $"
+ * "$Id: main.c 5448 2006-04-22 03:57:26Z mike $"
*
* Scheduler main loop for the Common UNIX Printing System (CUPS).
*
}
/*
- * Update the root certificate once every 5 minutes...
+ * Update the root certificate once every 5 minutes if we have client
+ * connections...
*/
if ((current_time - RootCertTime) >= RootCertDuration && RootCertDuration &&
- !RunUser)
+ !RunUser && cupsArrayCount(Clients))
{
/*
* Update the root certificate...
/*
- * End of "$Id: main.c 5383 2006-04-07 15:36:10Z mike $".
+ * End of "$Id: main.c 5448 2006-04-22 03:57:26Z mike $".
*/
/*
- * "$Id: mime.c 5057 2006-02-02 20:38:29Z mike $"
+ * "$Id: mime.c 5394 2006-04-14 18:20:04Z mike $"
*
* MIME database file routines for the Common UNIX Printing System (CUPS).
*
if (!mime)
return;
- /*
- * Loop through the file types and delete any rules...
- */
-
- for (type = (mime_type_t *)cupsArrayFirst(mime->types);
- type;
- type = (mime_type_t *)cupsArrayNext(mime->types))
- mimeDeleteType(mime, type);
-
/*
* Loop through filters and free them...
*/
filter = (mime_filter_t *)cupsArrayNext(mime->filters))
mimeDeleteFilter(mime, filter);
+ /*
+ * Loop through the file types and delete any rules...
+ */
+
+ for (type = (mime_type_t *)cupsArrayFirst(mime->types);
+ type;
+ type = (mime_type_t *)cupsArrayNext(mime->types))
+ mimeDeleteType(mime, type);
+
/*
* Free the types and filters arrays, and then the MIME database structure.
*/
/*
- * End of "$Id: mime.c 5057 2006-02-02 20:38:29Z mike $".
+ * End of "$Id: mime.c 5394 2006-04-14 18:20:04Z mike $".
*/
/*
- * "$Id: network.c 5069 2006-02-04 05:24:35Z mike $"
+ * "$Id: network.c 5428 2006-04-18 20:45:30Z mike $"
*
* Network interface functions for the Common UNIX Printing System
* (CUPS) scheduler.
* cupsdNetIFFree() - Free the current network interface list.
* cupsdNetIFUpdate() - Update the network interface list as needed...
* compare_netif() - Compare two network interfaces.
- * getifaddrs() - Get a list of network interfaces on the system.
- * freeifaddrs() - Free an interface list...
*/
/*
* Include necessary headers.
*/
+#include <cups/http-private.h>
#include "cupsd.h"
-#include <net/if.h>
-
/*
* Local functions...
static int compare_netif(cupsd_netif_t *a, cupsd_netif_t *b);
-#ifdef HAVE_GETIFADDRS
-/*
- * Use native getifaddrs() function...
- */
-# include <ifaddrs.h>
-#else
-/*
- * Use getifaddrs() emulation...
- */
-
-# include <sys/ioctl.h>
-# ifdef HAVE_SYS_SOCKIO_H
-# include <sys/sockio.h>
-# endif
-
-# ifdef ifa_dstaddr
-# undef ifa_dstaddr
-# endif /* ifa_dstaddr */
-# ifndef ifr_netmask
-# define ifr_netmask ifr_addr
-# endif /* !ifr_netmask */
-
-struct ifaddrs /**** Interface Structure ****/
-{
- struct ifaddrs *ifa_next; /* Next interface in list */
- char *ifa_name; /* Name of interface */
- unsigned int ifa_flags; /* Flags (up, point-to-point, etc.) */
- struct sockaddr *ifa_addr, /* Network address */
- *ifa_netmask, /* Address mask */
- *ifa_dstaddr; /* Broadcast or destination address */
- void *ifa_data; /* Interface statistics */
-};
-
-static int getifaddrs(struct ifaddrs **addrs);
-static void freeifaddrs(struct ifaddrs *addrs);
-#endif /* HAVE_GETIFADDRS */
-
-
/*
* 'cupsdNetIFFind()' - Find a network interface.
*/
}
-#ifndef HAVE_GETIFADDRS
-/*
- * 'getifaddrs()' - Get a list of network interfaces on the system.
- */
-
-static int /* O - 0 on success, -1 on error */
-getifaddrs(struct ifaddrs **addrs) /* O - List of interfaces */
-{
- int sock; /* Socket */
- char buffer[65536], /* Buffer for address info */
- *bufptr, /* Pointer into buffer */
- *bufend; /* End of buffer */
- struct ifconf conf; /* Interface configurations */
- struct sockaddr addr; /* Address data */
- struct ifreq *ifp; /* Interface data */
- int ifpsize; /* Size of interface data */
- struct ifaddrs *temp; /* Pointer to current interface */
- struct ifreq request; /* Interface request */
-
-
- /*
- * Start with an empty list...
- */
-
- if (addrs == NULL)
- return (-1);
-
- *addrs = NULL;
-
- /*
- * Create a UDP socket to get the interface data...
- */
-
- memset (&addr, 0, sizeof(addr));
- if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
- return (-1);
-
- /*
- * Try to get the list of interfaces...
- */
-
- conf.ifc_len = sizeof(buffer);
- conf.ifc_buf = buffer;
-
- if (ioctl(sock, SIOCGIFCONF, &conf) < 0)
- {
- /*
- * Couldn't get the list of interfaces...
- */
-
- close(sock);
- return (-1);
- }
-
- /*
- * OK, got the list of interfaces, now lets step through the
- * buffer to pull them out...
- */
-
-# ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
-# define sockaddr_len(a) ((a)->sa_len)
-# else
-# define sockaddr_len(a) (sizeof(struct sockaddr))
-# endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
-
- for (bufptr = buffer, bufend = buffer + conf.ifc_len;
- bufptr < bufend;
- bufptr += ifpsize)
- {
- /*
- * Get the current interface information...
- */
-
- ifp = (struct ifreq *)bufptr;
- ifpsize = sizeof(ifp->ifr_name) + sockaddr_len(&(ifp->ifr_addr));
-
- if (ifpsize < sizeof(struct ifreq))
- ifpsize = sizeof(struct ifreq);
-
- memset(&request, 0, sizeof(request));
- memcpy(request.ifr_name, ifp->ifr_name, sizeof(ifp->ifr_name));
-
- /*
- * Check the status of the interface...
- */
-
- if (ioctl(sock, SIOCGIFFLAGS, &request) < 0)
- continue;
-
- /*
- * Allocate memory for a single interface record...
- */
-
- if ((temp = calloc(1, sizeof(struct ifaddrs))) == NULL)
- {
- /*
- * Unable to allocate memory...
- */
-
- close(sock);
- return (-1);
- }
-
- /*
- * Add this record to the front of the list and copy the name, flags,
- * and network address...
- */
-
- temp->ifa_next = *addrs;
- *addrs = temp;
- temp->ifa_name = strdup(ifp->ifr_name);
- temp->ifa_flags = request.ifr_flags;
- if ((temp->ifa_addr = calloc(1, sockaddr_len(&(ifp->ifr_addr)))) != NULL)
- memcpy(temp->ifa_addr, &(ifp->ifr_addr), sockaddr_len(&(ifp->ifr_addr)));
-
- /*
- * Try to get the netmask for the interface...
- */
-
- if (!ioctl(sock, SIOCGIFNETMASK, &request))
- {
- /*
- * Got it, make a copy...
- */
-
- if ((temp->ifa_netmask = calloc(1, sizeof(request.ifr_netmask))) != NULL)
- memcpy(temp->ifa_netmask, &(request.ifr_netmask),
- sizeof(request.ifr_netmask));
- }
-
- /*
- * Then get the broadcast or point-to-point (destination) address,
- * if applicable...
- */
-
- if (temp->ifa_flags & IFF_BROADCAST)
- {
- /*
- * Have a broadcast address, so get it!
- */
-
- if (!ioctl(sock, SIOCGIFBRDADDR, &request))
- {
- /*
- * Got it, make a copy...
- */
-
- if ((temp->ifa_dstaddr = calloc(1, sizeof(request.ifr_broadaddr))) != NULL)
- memcpy(temp->ifa_dstaddr, &(request.ifr_broadaddr),
- sizeof(request.ifr_broadaddr));
- }
- }
- else if (temp->ifa_flags & IFF_POINTOPOINT)
- {
- /*
- * Point-to-point interface; grab the remote address...
- */
-
- if (!ioctl(sock, SIOCGIFDSTADDR, &request))
- {
- temp->ifa_dstaddr = malloc(sizeof(request.ifr_dstaddr));
- memcpy(temp->ifa_dstaddr, &(request.ifr_dstaddr),
- sizeof(request.ifr_dstaddr));
- }
- }
- }
-
- /*
- * OK, we're done with the socket, close it and return 0...
- */
-
- close(sock);
-
- return (0);
-}
-
-
-/*
- * 'freeifaddrs()' - Free an interface list...
- */
-
-static void
-freeifaddrs(struct ifaddrs *addrs) /* I - Interface list to free */
-{
- struct ifaddrs *next; /* Next interface in list */
-
-
- while (addrs != NULL)
- {
- /*
- * Make a copy of the next interface pointer...
- */
-
- next = addrs->ifa_next;
-
- /*
- * Free data values as needed...
- */
-
- if (addrs->ifa_name)
- {
- free(addrs->ifa_name);
- addrs->ifa_name = NULL;
- }
-
- if (addrs->ifa_addr)
- {
- free(addrs->ifa_addr);
- addrs->ifa_addr = NULL;
- }
-
- if (addrs->ifa_netmask)
- {
- free(addrs->ifa_netmask);
- addrs->ifa_netmask = NULL;
- }
-
- if (addrs->ifa_dstaddr)
- {
- free(addrs->ifa_dstaddr);
- addrs->ifa_dstaddr = NULL;
- }
-
- /*
- * Free this node and continue to the next...
- */
-
- free(addrs);
-
- addrs = next;
- }
-}
-#endif /* !HAVE_GETIFADDRS */
-
-
/*
- * End of "$Id: network.c 5069 2006-02-04 05:24:35Z mike $".
+ * End of "$Id: network.c 5428 2006-04-18 20:45:30Z mike $".
*/
/*
- * "$Id: statbuf.c 5373 2006-04-06 20:03:32Z mike $"
+ * "$Id: statbuf.c 5447 2006-04-21 20:07:51Z mike $"
*
* Status buffer routines for the Common UNIX Printing System (CUPS)
* scheduler.
}
else
{
- *loglevel = CUPSD_LOG_ERROR;
+ *loglevel = CUPSD_LOG_DEBUG;
message = sb->buffer;
}
/*
- * End of "$Id: statbuf.c 5373 2006-04-06 20:03:32Z mike $".
+ * End of "$Id: statbuf.c 5447 2006-04-21 20:07:51Z mike $".
*/
#
-# "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $"
+# "$Id: Makefile 5409 2006-04-15 11:45:38Z mike $"
#
# Standards makefile for the Common UNIX Printing System (CUPS).
#
rfctohtml: rfctohtml.o ../cups/libcups.a
$(CC) $(LDFLAGS) -o $@ rfctohtml.o ../cups/libcups.a \
- $(COMMONLIBS) $(LIBZ)
+ $(SSLLIBS) $(COMMONLIBS) $(LIBZ)
#
-# End of "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $".
+# End of "$Id: Makefile 5409 2006-04-15 11:45:38Z mike $".
#
--- /dev/null
+
+
+
+
+
+
+Network Working Group M. Rose
+Request for Comments: 1155 Performance Systems International
+Obsoletes: RFC 1065 K. McCloghrie
+ Hughes LAN Systems
+ May 1990
+
+
+
+ Structure and Identification of Management Information
+ for TCP/IP-based Internets
+
+ Table of Contents
+
+1. Status of this Memo ............................................. 1
+2. Introduction .................................................... 2
+3. Structure and Identification of Management Information........... 4
+3.1 Names .......................................................... 4
+3.1.1 Directory .................................................... 5
+3.1.2 Mgmt ......................................................... 6
+3.1.3 Experimental ................................................. 6
+3.1.4 Private ...................................................... 7
+3.2 Syntax ......................................................... 7
+3.2.1 Primitive Types .............................................. 7
+3.2.1.1 Guidelines for Enumerated INTEGERs ......................... 7
+3.2.2 Constructor Types ............................................ 8
+3.2.3 Defined Types ................................................ 8
+3.2.3.1 NetworkAddress ............................................. 8
+3.2.3.2 IpAddress .................................................. 8
+3.2.3.3 Counter .................................................... 8
+3.2.3.4 Gauge ...................................................... 9
+3.2.3.5 TimeTicks .................................................. 9
+3.2.3.6 Opaque ..................................................... 9
+3.3 Encodings ...................................................... 9
+4. Managed Objects ................................................. 10
+4.1 Guidelines for Object Names .................................... 10
+4.2 Object Types and Instances ..................................... 10
+4.3 Macros for Managed Objects ..................................... 14
+5. Extensions to the MIB ........................................... 16
+6. Definitions ..................................................... 17
+7. Acknowledgements ................................................ 20
+8. References ...................................................... 21
+9. Security Considerations.......................................... 21
+10. Authors' Addresses.............................................. 22
+
+1. Status of this Memo
+
+ This RFC is a re-release of RFC 1065, with a changed "Status of this
+ Memo", plus a few minor typographical corrections. The technical
+
+
+
+Rose & McCloghrie [Page 1]
+\f
+RFC 1155 SMI May 1990
+
+
+ content of the document is unchanged from RFC 1065.
+
+ This memo provides the common definitions for the structure and
+ identification of management information for TCP/IP-based internets.
+ In particular, together with its companion memos which describe the
+ management information base along with the network management
+ protocol, these documents provide a simple, workable architecture and
+ system for managing TCP/IP-based internets and in particular, the
+ Internet.
+
+ This memo specifies a Standard Protocol for the Internet community.
+ Its status is "Recommended". TCP/IP implementations in the Internet
+ which are network manageable are expected to adopt and implement this
+ specification.
+
+ The Internet Activities Board recommends that all IP and TCP
+ implementations be network manageable. This implies implementation
+ of the Internet MIB (RFC-1156) and at least one of the two
+ recommended management protocols SNMP (RFC-1157) or CMOT (RFC-1095).
+ It should be noted that, at this time, SNMP is a full Internet
+ standard and CMOT is a draft standard. See also the Host and Gateway
+ Requirements RFCs for more specific information on the applicability
+ of this standard.
+
+ Please refer to the latest edition of the "IAB Official Protocol
+ Standards" RFC for current information on the state and status of
+ standard Internet protocols.
+
+ Distribution of this memo is unlimited.
+
+2. Introduction
+
+ This memo describes the common structures and identification scheme
+ for the definition of management information used in managing
+ TCP/IP-based internets. Included are descriptions of an object
+ information model for network management along with a set of generic
+ types used to describe management information. Formal descriptions
+ of the structure are given using Abstract Syntax Notation One (ASN.1)
+ [1].
+
+ This memo is largely concerned with organizational concerns and
+ administrative policy: it neither specifies the objects which are
+ managed, nor the protocols used to manage those objects. These
+ concerns are addressed by two companion memos: one describing the
+ Management Information Base (MIB) [2], and the other describing the
+ Simple Network Management Protocol (SNMP) [3].
+
+ This memo is based in part on the work of the Internet Engineering
+
+
+
+Rose & McCloghrie [Page 2]
+\f
+RFC 1155 SMI May 1990
+
+
+ Task Force, particularly the working note titled "Structure and
+ Identification of Management Information for the Internet" [4]. This
+ memo uses a skeletal structure derived from that note, but differs in
+ one very significant way: that note focuses entirely on the use of
+ OSI-style network management. As such, it is not suitable for use
+ with SNMP.
+
+ This memo attempts to achieve two goals: simplicity and
+ extensibility. Both are motivated by a common concern: although the
+ management of TCP/IP-based internets has been a topic of study for
+ some time, the authors do not feel that the depth and breadth of such
+ understanding is complete. More bluntly, we feel that previous
+ experiences, while giving the community insight, are hardly
+ conclusive. By fostering a simple SMI, the minimal number of
+ constraints are imposed on future potential approaches; further, by
+ fostering an extensible SMI, the maximal number of potential
+ approaches are available for experimentation.
+
+ It is believed that this memo and its two companions comply with the
+ guidelines set forth in RFC 1052, "IAB Recommendations for the
+ Development of Internet Network Management Standards" [5] and RFC
+ 1109, "Report of the Second Ad Hoc Network Management Review Group"
+ [6]. In particular, we feel that this memo, along with the memo
+ describing the management information base, provide a solid basis for
+ network management of the Internet.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie [Page 3]
+\f
+RFC 1155 SMI May 1990
+
+
+3. Structure and Identification of Management Information
+
+ Managed objects are accessed via a virtual information store, termed
+ the Management Information Base or MIB. Objects in the MIB are
+ defined using Abstract Syntax Notation One (ASN.1) [1].
+
+ Each type of object (termed an object type) has a name, a syntax, and
+ an encoding. The name is represented uniquely as an OBJECT
+ IDENTIFIER. An OBJECT IDENTIFIER is an administratively assigned
+ name. The administrative policies used for assigning names are
+ discussed later in this memo.
+
+ The syntax for an object type defines the abstract data structure
+ corresponding to that object type. For example, the structure of a
+ given object type might be an INTEGER or OCTET STRING. Although in
+ general, we should permit any ASN.1 construct to be available for use
+ in defining the syntax of an object type, this memo purposely
+ restricts the ASN.1 constructs which may be used. These restrictions
+ are made solely for the sake of simplicity.
+
+ The encoding of an object type is simply how instances of that object
+ type are represented using the object's type syntax. Implicitly tied
+ to the notion of an object's syntax and encoding is how the object is
+ represented when being transmitted on the network. This memo
+ specifies the use of the basic encoding rules of ASN.1 [7].
+
+ It is beyond the scope of this memo to define either the MIB used for
+ network management or the network management protocol. As mentioned
+ earlier, these tasks are left to companion memos. This memo attempts
+ to minimize the restrictions placed upon its companions so as to
+ maximize generality. However, in some cases, restrictions have been
+ made (e.g., the syntax which may be used when defining object types
+ in the MIB) in order to encourage a particular style of management.
+ Future editions of this memo may remove these restrictions.
+
+3.1. Names
+
+ Names are used to identify managed objects. This memo specifies
+ names which are hierarchical in nature. The OBJECT IDENTIFIER
+ concept is used to model this notion. An OBJECT IDENTIFIER can be
+ used for purposes other than naming managed object types; for
+ example, each international standard has an OBJECT IDENTIFIER
+ assigned to it for the purposes of identification. In short, OBJECT
+ IDENTIFIERs are a means for identifying some object, regardless of
+ the semantics associated with the object (e.g., a network object, a
+ standards document, etc.)
+
+ An OBJECT IDENTIFIER is a sequence of integers which traverse a
+
+
+
+Rose & McCloghrie [Page 4]
+\f
+RFC 1155 SMI May 1990
+
+
+ global tree. The tree consists of a root connected to a number of
+ labeled nodes via edges. Each node may, in turn, have children of
+ its own which are labeled. In this case, we may term the node a
+ subtree. This process may continue to an arbitrary level of depth.
+ Central to the notion of the OBJECT IDENTIFIER is the understanding
+ that administrative control of the meanings assigned to the nodes may
+ be delegated as one traverses the tree. A label is a pairing of a
+ brief textual description and an integer.
+
+ The root node itself is unlabeled, but has at least three children
+ directly under it: one node is administered by the International
+ Organization for Standardization, with label iso(1); another is
+ administrated by the International Telegraph and Telephone
+ Consultative Committee, with label ccitt(0); and the third is jointly
+ administered by the ISO and the CCITT, joint-iso-ccitt(2).
+
+ Under the iso(1) node, the ISO has designated one subtree for use by
+ other (inter)national organizations, org(3). Of the children nodes
+ present, two have been assigned to the U.S. National Institutes of
+ Standards and Technology. One of these subtrees has been transferred
+ by the NIST to the U.S. Department of Defense, dod(6).
+
+ As of this writing, the DoD has not indicated how it will manage its
+ subtree of OBJECT IDENTIFIERs. This memo assumes that DoD will
+ allocate a node to the Internet community, to be administered by the
+ Internet Activities Board (IAB) as follows:
+
+ internet OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 }
+
+ That is, the Internet subtree of OBJECT IDENTIFIERs starts with the
+ prefix:
+
+ 1.3.6.1.
+
+ This memo, as a standard approved by the IAB, now specifies the
+ policy under which this subtree of OBJECT IDENTIFIERs is
+ administered. Initially, four nodes are present:
+
+ directory OBJECT IDENTIFIER ::= { internet 1 }
+ mgmt OBJECT IDENTIFIER ::= { internet 2 }
+ experimental OBJECT IDENTIFIER ::= { internet 3 }
+ private OBJECT IDENTIFIER ::= { internet 4 }
+
+3.1.1. Directory
+
+ The directory(1) subtree is reserved for use with a future memo that
+ discusses how the OSI Directory may be used in the Internet.
+
+
+
+
+Rose & McCloghrie [Page 5]
+\f
+RFC 1155 SMI May 1990
+
+
+3.1.2. Mgmt
+
+ The mgmt(2) subtree is used to identify objects which are defined in
+ IAB-approved documents. Administration of the mgmt(2) subtree is
+ delegated by the IAB to the Internet Assigned Numbers Authority for
+ the Internet. As RFCs which define new versions of the Internet-
+ standard Management Information Base are approved, they are assigned
+ an OBJECT IDENTIFIER by the Internet Assigned Numbers Authority for
+ identifying the objects defined by that memo.
+
+ For example, the RFC which defines the initial Internet standard MIB
+ would be assigned management document number 1. This RFC would use
+ the OBJECT IDENTIFIER
+
+ { mgmt 1 }
+
+ or
+
+ 1.3.6.1.2.1
+
+ in defining the Internet-standard MIB.
+
+ The generation of new versions of the Internet-standard MIB is a
+ rigorous process. Section 5 of this memo describes the rules used
+ when a new version is defined.
+
+3.1.3. Experimental
+
+ The experimental(3) subtree is used to identify objects used in
+ Internet experiments. Administration of the experimental(3) subtree
+ is delegated by the IAB to the Internet Assigned Numbers Authority of
+ the Internet.
+
+ For example, an experimenter might received number 17, and would have
+ available the OBJECT IDENTIFIER
+
+ { experimental 17 }
+
+ or
+
+ 1.3.6.1.3.17
+
+ for use.
+
+ As a part of the assignment process, the Internet Assigned Numbers
+ Authority may make requirements as to how that subtree is used.
+
+
+
+
+
+Rose & McCloghrie [Page 6]
+\f
+RFC 1155 SMI May 1990
+
+
+3.1.4. Private
+
+ The private(4) subtree is used to identify objects defined
+ unilaterally. Administration of the private(4) subtree is delegated
+ by the IAB to the Internet Assigned Numbers Authority for the
+ Internet. Initially, this subtree has at least one child:
+
+ enterprises OBJECT IDENTIFIER ::= { private 1 }
+
+ The enterprises(1) subtree is used, among other things, to permit
+ parties providing networking subsystems to register models of their
+ products.
+
+ Upon receiving a subtree, the enterprise may, for example, define new
+ MIB objects in this subtree. In addition, it is strongly recommended
+ that the enterprise will also register its networking subsystems
+ under this subtree, in order to provide an unambiguous identification
+ mechanism for use in management protocols. For example, if the
+ "Flintstones, Inc." enterprise produced networking subsystems, then
+ they could request a node under the enterprises subtree from the
+ Internet Assigned Numbers Authority. Such a node might be numbered:
+
+ 1.3.6.1.4.1.42
+
+ The "Flintstones, Inc." enterprise might then register their "Fred
+ Router" under the name of:
+
+ 1.3.6.1.4.1.42.1.1
+
+3.2. Syntax
+
+ Syntax is used to define the structure corresponding to object types.
+ ASN.1 constructs are used to define this structure, although the full
+ generality of ASN.1 is not permitted.
+
+ The ASN.1 type ObjectSyntax defines the different syntaxes which may
+ be used in defining an object type.
+
+3.2.1. Primitive Types
+
+ Only the ASN.1 primitive types INTEGER, OCTET STRING, OBJECT
+ IDENTIFIER, and NULL are permitted. These are sometimes referred to
+ as non-aggregate types.
+
+3.2.1.1. Guidelines for Enumerated INTEGERs
+
+ If an enumerated INTEGER is listed as an object type, then a named-
+ number having the value 0 shall not be present in the list of
+
+
+
+Rose & McCloghrie [Page 7]
+\f
+RFC 1155 SMI May 1990
+
+
+ enumerations. Use of this value is prohibited.
+
+3.2.2. Constructor Types
+
+ The ASN.1 constructor type SEQUENCE is permitted, providing that it
+ is used to generate either lists or tables.
+
+ For lists, the syntax takes the form:
+
+ SEQUENCE { <type1>, ..., <typeN> }
+
+ where each <type> resolves to one of the ASN.1 primitive types listed
+ above. Further, these ASN.1 types are always present (the DEFAULT
+ and OPTIONAL clauses do not appear in the SEQUENCE definition).
+
+ For tables, the syntax takes the form:
+
+ SEQUENCE OF <entry>
+
+ where <entry> resolves to a list constructor.
+
+ Lists and tables are sometimes referred to as aggregate types.
+
+3.2.3. Defined Types
+
+ In addition, new application-wide types may be defined, so long as
+ they resolve into an IMPLICITly defined ASN.1 primitive type, list,
+ table, or some other application-wide type. Initially, few
+ application-wide types are defined. Future memos will no doubt
+ define others once a consensus is reached.
+
+3.2.3.1. NetworkAddress
+
+ This CHOICE represents an address from one of possibly several
+ protocol families. Currently, only one protocol family, the Internet
+ family, is present in this CHOICE.
+
+3.2.3.2. IpAddress
+
+ This application-wide type represents a 32-bit internet address. It
+ is represented as an OCTET STRING of length 4, in network byte-order.
+
+ When this ASN.1 type is encoded using the ASN.1 basic encoding rules,
+ only the primitive encoding form shall be used.
+
+3.2.3.3. Counter
+
+ This application-wide type represents a non-negative integer which
+
+
+
+Rose & McCloghrie [Page 8]
+\f
+RFC 1155 SMI May 1990
+
+
+ monotonically increases until it reaches a maximum value, when it
+ wraps around and starts increasing again from zero. This memo
+ specifies a maximum value of 2^32-1 (4294967295 decimal) for
+ counters.
+
+3.2.3.4. Gauge
+
+ This application-wide type represents a non-negative integer, which
+ may increase or decrease, but which latches at a maximum value. This
+ memo specifies a maximum value of 2^32-1 (4294967295 decimal) for
+ gauges.
+
+3.2.3.5. TimeTicks
+
+ This application-wide type represents a non-negative integer which
+ counts the time in hundredths of a second since some epoch. When
+ object types are defined in the MIB which use this ASN.1 type, the
+ description of the object type identifies the reference epoch.
+
+3.2.3.6. Opaque
+
+ This application-wide type supports the capability to pass arbitrary
+ ASN.1 syntax. A value is encoded using the ASN.1 basic rules into a
+ string of octets. This, in turn, is encoded as an OCTET STRING, in
+ effect "double-wrapping" the original ASN.1 value.
+
+ Note that a conforming implementation need only be able to accept and
+ recognize opaquely-encoded data. It need not be able to unwrap the
+ data and then interpret its contents.
+
+ Further note that by use of the ASN.1 EXTERNAL type, encodings other
+ than ASN.1 may be used in opaquely-encoded data.
+
+3.3. Encodings
+
+ Once an instance of an object type has been identified, its value may
+ be transmitted by applying the basic encoding rules of ASN.1 to the
+ syntax for the object type.
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie [Page 9]
+\f
+RFC 1155 SMI May 1990
+
+
+4. Managed Objects
+
+ Although it is not the purpose of this memo to define objects in the
+ MIB, this memo specifies a format to be used by other memos which
+ define these objects.
+
+ An object type definition consists of five fields:
+
+ OBJECT:
+ -------
+ A textual name, termed the OBJECT DESCRIPTOR, for the object type,
+ along with its corresponding OBJECT IDENTIFIER.
+
+ Syntax:
+ The abstract syntax for the object type. This must resolve to an
+ instance of the ASN.1 type ObjectSyntax (defined below).
+
+ Definition:
+ A textual description of the semantics of the object type.
+ Implementations should ensure that their instance of the object
+ fulfills this definition since this MIB is intended for use in
+ multi-vendor environments. As such it is vital that objects have
+ consistent meaning across all machines.
+
+ Access:
+ One of read-only, read-write, write-only, or not-accessible.
+
+ Status:
+ One of mandatory, optional, or obsolete.
+
+ Future memos may also specify other fields for the objects which they
+ define.
+
+4.1. Guidelines for Object Names
+
+ No object type in the Internet-Standard MIB shall use a sub-
+ identifier of 0 in its name. This value is reserved for use with
+ future extensions.
+
+ Each OBJECT DESCRIPTOR corresponding to an object type in the
+ internet-standard MIB shall be a unique, but mnemonic, printable
+ string. This promotes a common language for humans to use when
+ discussing the MIB and also facilitates simple table mappings for
+ user interfaces.
+
+4.2. Object Types and Instances
+
+ An object type is a definition of a kind of managed object; it is
+
+
+
+Rose & McCloghrie [Page 10]
+\f
+RFC 1155 SMI May 1990
+
+
+ declarative in nature. In contrast, an object instance is an
+ instantiation of an object type which has been bound to a value. For
+ example, the notion of an entry in a routing table might be defined
+ in the MIB. Such a notion corresponds to an object type; individual
+ entries in a particular routing table which exist at some time are
+ object instances of that object type.
+
+ A collection of object types is defined in the MIB. Each such
+ subject type is uniquely named by its OBJECT IDENTIFIER and also has
+ a textual name, which is its OBJECT DESCRIPTOR. The means whereby
+ object instances are referenced is not defined in the MIB. Reference
+ to object instances is achieved by a protocol-specific mechanism: it
+ is the responsibility of each management protocol adhering to the SMI
+ to define this mechanism.
+
+ An object type may be defined in the MIB such that an instance of
+ that object type represents an aggregation of information also
+ represented by instances of some number of "subordinate" object
+ types. For example, suppose the following object types are defined
+ in the MIB:
+
+
+ OBJECT:
+ -------
+ atIndex { atEntry 1 }
+
+ Syntax:
+ INTEGER
+
+ Definition:
+ The interface number for the physical address.
+
+ Access:
+ read-write.
+
+ Status:
+ mandatory.
+
+
+ OBJECT:
+ -------
+ atPhysAddress { atEntry 2 }
+
+ Syntax:
+ OCTET STRING
+
+ Definition:
+ The media-dependent physical address.
+
+
+
+Rose & McCloghrie [Page 11]
+\f
+RFC 1155 SMI May 1990
+
+
+ Access:
+ read-write.
+
+ Status:
+ mandatory.
+
+
+ OBJECT:
+ -------
+ atNetAddress { atEntry 3 }
+
+ Syntax:
+ NetworkAddress
+
+ Definition:
+ The network address corresponding to the media-dependent physical
+ address.
+
+ Access:
+ read-write.
+
+ Status:
+ mandatory.
+
+ Then, a fourth object type might also be defined in the MIB:
+
+
+ OBJECT:
+ -------
+ atEntry { atTable 1 }
+
+ Syntax:
+
+ AtEntry ::= SEQUENCE {
+ atIndex
+ INTEGER,
+ atPhysAddress
+ OCTET STRING,
+ atNetAddress
+ NetworkAddress
+ }
+
+ Definition:
+ An entry in the address translation table.
+
+ Access:
+ read-write.
+
+
+
+
+Rose & McCloghrie [Page 12]
+\f
+RFC 1155 SMI May 1990
+
+
+ Status:
+ mandatory.
+
+ Each instance of this object type comprises information represented
+ by instances of the former three object types. An object type
+ defined in this way is called a list.
+
+ Similarly, tables can be formed by aggregations of a list type. For
+ example, a fifth object type might also be defined in the MIB:
+
+
+ OBJECT:
+ ------
+ atTable { at 1 }
+
+ Syntax:
+ SEQUENCE OF AtEntry
+
+ Definition:
+ The address translation table.
+
+ Access:
+ read-write.
+
+ Status:
+ mandatory.
+
+ such that each instance of the atTable object comprises information
+ represented by the set of atEntry object types that collectively
+ constitute a given atTable object instance, that is, a given address
+ translation table.
+
+ Consider how one might refer to a simple object within a table.
+ Continuing with the previous example, one might name the object type
+
+ { atPhysAddress }
+
+ and specify, using a protocol-specific mechanism, the object instance
+
+ { atNetAddress } = { internet "10.0.0.52" }
+
+ This pairing of object type and object instance would refer to all
+ instances of atPhysAddress which are part of any entry in some
+ address translation table for which the associated atNetAddress value
+ is { internet "10.0.0.52" }.
+
+ To continue with this example, consider how one might refer to an
+ aggregate object (list) within a table. Naming the object type
+
+
+
+Rose & McCloghrie [Page 13]
+\f
+RFC 1155 SMI May 1990
+
+
+ { atEntry }
+
+ and specifying, using a protocol-specific mechanism, the object
+ instance
+
+ { atNetAddress } = { internet "10.0.0.52" }
+
+ refers to all instances of entries in the table for which the
+ associated atNetAddress value is { internet "10.0.0.52" }.
+
+ Each management protocol must provide a mechanism for accessing
+ simple (non-aggregate) object types. Each management protocol
+ specifies whether or not it supports access to aggregate object
+ types. Further, the protocol must specify which instances are
+ "returned" when an object type/instance pairing refers to more than
+ one instance of a type.
+
+ To afford support for a variety of management protocols, all
+ information by which instances of a given object type may be usefully
+ distinguished, one from another, is represented by instances of
+ object types defined in the MIB.
+
+4.3. Macros for Managed Objects
+
+ In order to facilitate the use of tools for processing the definition
+ of the MIB, the OBJECT-TYPE macro may be used. This macro permits
+ the key aspects of an object type to be represented in a formal way.
+
+ OBJECT-TYPE MACRO ::=
+ BEGIN
+ TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax)
+ "ACCESS" Access
+ "STATUS" Status
+ VALUE NOTATION ::= value (VALUE ObjectName)
+
+ Access ::= "read-only"
+ | "read-write"
+ | "write-only"
+ | "not-accessible"
+ Status ::= "mandatory"
+ | "optional"
+ | "obsolete"
+ END
+
+ Given the object types defined earlier, we might imagine the
+ following definitions being present in the MIB:
+
+ atIndex OBJECT-TYPE
+
+
+
+Rose & McCloghrie [Page 14]
+\f
+RFC 1155 SMI May 1990
+
+
+ SYNTAX INTEGER
+ ACCESS read-write
+ STATUS mandatory
+ ::= { atEntry 1 }
+
+ atPhysAddress OBJECT-TYPE
+ SYNTAX OCTET STRING
+ ACCESS read-write
+ STATUS mandatory
+ ::= { atEntry 2 }
+
+ atNetAddress OBJECT-TYPE
+ SYNTAX NetworkAddress
+ ACCESS read-write
+ STATUS mandatory
+ ::= { atEntry 3 }
+
+ atEntry OBJECT-TYPE
+ SYNTAX AtEntry
+ ACCESS read-write
+ STATUS mandatory
+ ::= { atTable 1 }
+
+ atTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF AtEntry
+ ACCESS read-write
+ STATUS mandatory
+ ::= { at 1 }
+
+ AtEntry ::= SEQUENCE {
+ atIndex
+ INTEGER,
+ atPhysAddress
+ OCTET STRING,
+ atNetAddress
+ NetworkAddress
+ }
+
+ The first five definitions describe object types, relating, for
+ example, the OBJECT DESCRIPTOR atIndex to the OBJECT IDENTIFIER {
+ atEntry 1 }. In addition, the syntax of this object is defined
+ (INTEGER) along with the access permitted (read-write) and status
+ (mandatory). The sixth definition describes an ASN.1 type called
+ AtEntry.
+
+
+
+
+
+
+
+Rose & McCloghrie [Page 15]
+\f
+RFC 1155 SMI May 1990
+
+
+5. Extensions to the MIB
+
+ Every Internet-standard MIB document obsoletes all previous such
+ documents. The portion of a name, termed the tail, following the
+ OBJECT IDENTIFIER
+
+ { mgmt version-number }
+
+ used to name objects shall remain unchanged between versions. New
+ versions may:
+
+ (1) declare old object types obsolete (if necessary), but not
+ delete their names;
+
+ (2) augment the definition of an object type corresponding to a
+ list by appending non-aggregate object types to the object types
+ in the list; or,
+
+ (3) define entirely new object types.
+
+ New versions may not:
+
+ (1) change the semantics of any previously defined object without
+ changing the name of that object.
+
+ These rules are important because they admit easier support for
+ multiple versions of the Internet-standard MIB. In particular, the
+ semantics associated with the tail of a name remain constant
+ throughout different versions of the MIB. Because multiple versions
+ of the MIB may thus coincide in "tail-space," implementations
+ supporting multiple versions of the MIB can be vastly simplified.
+
+ However, as a consequence, a management agent might return an
+ instance corresponding to a superset of the expected object type.
+ Following the principle of robustness, in this exceptional case, a
+ manager should ignore any additional information beyond the
+ definition of the expected object type. However, the robustness
+ principle requires that one exercise care with respect to control
+ actions: if an instance does not have the same syntax as its
+ expected object type, then those control actions must fail. In both
+ the monitoring and control cases, the name of an object returned by
+ an operation must be identical to the name requested by an operation.
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie [Page 16]
+\f
+RFC 1155 SMI May 1990
+
+
+6. Definitions
+
+ RFC1155-SMI DEFINITIONS ::= BEGIN
+
+ EXPORTS -- EVERYTHING
+ internet, directory, mgmt,
+ experimental, private, enterprises,
+ OBJECT-TYPE, ObjectName, ObjectSyntax, SimpleSyntax,
+ ApplicationSyntax, NetworkAddress, IpAddress,
+ Counter, Gauge, TimeTicks, Opaque;
+
+ -- the path to the root
+
+ internet OBJECT IDENTIFIER ::= { iso org(3) dod(6) 1 }
+
+ directory OBJECT IDENTIFIER ::= { internet 1 }
+
+ mgmt OBJECT IDENTIFIER ::= { internet 2 }
+
+ experimental OBJECT IDENTIFIER ::= { internet 3 }
+
+ private OBJECT IDENTIFIER ::= { internet 4 }
+ enterprises OBJECT IDENTIFIER ::= { private 1 }
+
+
+ -- definition of object types
+
+ OBJECT-TYPE MACRO ::=
+ BEGIN
+ TYPE NOTATION ::= "SYNTAX" type (TYPE ObjectSyntax)
+ "ACCESS" Access
+ "STATUS" Status
+ VALUE NOTATION ::= value (VALUE ObjectName)
+
+ Access ::= "read-only"
+ | "read-write"
+ | "write-only"
+ | "not-accessible"
+ Status ::= "mandatory"
+ | "optional"
+ | "obsolete"
+ END
+
+ -- names of objects in the MIB
+
+ ObjectName ::=
+ OBJECT IDENTIFIER
+
+
+
+
+Rose & McCloghrie [Page 17]
+\f
+RFC 1155 SMI May 1990
+
+
+ -- syntax of objects in the MIB
+
+ ObjectSyntax ::=
+ CHOICE {
+ simple
+ SimpleSyntax,
+
+ -- note that simple SEQUENCEs are not directly
+ -- mentioned here to keep things simple (i.e.,
+ -- prevent mis-use). However, application-wide
+ -- types which are IMPLICITly encoded simple
+ -- SEQUENCEs may appear in the following CHOICE
+
+ application-wide
+ ApplicationSyntax
+ }
+
+ SimpleSyntax ::=
+ CHOICE {
+ number
+ INTEGER,
+
+ string
+ OCTET STRING,
+
+ object
+ OBJECT IDENTIFIER,
+
+ empty
+ NULL
+ }
+
+ ApplicationSyntax ::=
+ CHOICE {
+ address
+ NetworkAddress,
+
+ counter
+ Counter,
+
+ gauge
+ Gauge,
+
+ ticks
+ TimeTicks,
+
+ arbitrary
+ Opaque
+
+
+
+Rose & McCloghrie [Page 18]
+\f
+RFC 1155 SMI May 1990
+
+
+ -- other application-wide types, as they are
+ -- defined, will be added here
+ }
+
+
+ -- application-wide types
+
+ NetworkAddress ::=
+ CHOICE {
+ internet
+ IpAddress
+ }
+
+ IpAddress ::=
+ [APPLICATION 0] -- in network-byte order
+ IMPLICIT OCTET STRING (SIZE (4))
+
+ Counter ::=
+ [APPLICATION 1]
+ IMPLICIT INTEGER (0..4294967295)
+
+ Gauge ::=
+ [APPLICATION 2]
+ IMPLICIT INTEGER (0..4294967295)
+
+ TimeTicks ::=
+ [APPLICATION 3]
+ IMPLICIT INTEGER (0..4294967295)
+
+ Opaque ::=
+ [APPLICATION 4] -- arbitrary ASN.1 value,
+ IMPLICIT OCTET STRING -- "double-wrapped"
+
+ END
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie [Page 19]
+\f
+RFC 1155 SMI May 1990
+
+
+7. Acknowledgements
+
+ This memo was influenced by three sets of contributors to earlier
+ drafts:
+
+ First, Lee Labarre of the MITRE Corporation, who as author of the
+ NETMAN SMI [4], presented the basic roadmap for the SMI.
+
+ Second, several individuals who provided valuable comments on this
+ memo prior to its initial distribution:
+
+ James R. Davin, Proteon
+ Mark S. Fedor, NYSERNet
+ Craig Partridge, BBN Laboratories
+ Martin Lee Schoffstall, Rensselaer Polytechnic Institute
+ Wengyik Yeong, NYSERNet
+
+
+ Third, the IETF MIB working group:
+
+ Karl Auerbach, Epilogue Technology
+ K. Ramesh Babu, Excelan
+ Lawrence Besaw, Hewlett-Packard
+ Jeffrey D. Case, University of Tennessee at Knoxville
+ James R. Davin, Proteon
+ Mark S. Fedor, NYSERNet
+ Robb Foster, BBN
+ Phill Gross, The MITRE Corporation
+ Bent Torp Jensen, Convergent Technology
+ Lee Labarre, The MITRE Corporation
+ Dan Lynch, Advanced Computing Environments
+ Keith McCloghrie, The Wollongong Group
+ Dave Mackie, 3Com/Bridge
+ Craig Partridge, BBN (chair)
+ Jim Robertson, 3Com/Bridge
+ Marshall T. Rose, The Wollongong Group
+ Greg Satz, cisco
+ Martin Lee Schoffstall, Rensselaer Polytechnic Institute
+ Lou Steinberg, IBM
+ Dean Throop, Data General
+ Unni Warrier, Unisys
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie [Page 20]
+\f
+RFC 1155 SMI May 1990
+
+
+8. References
+
+ [1] Information processing systems - Open Systems Interconnection,
+ "Specification of Abstract Syntax Notation One (ASN.1)",
+ International Organization for Standardization, International
+ Standard 8824, December 1987.
+
+ [2] McCloghrie K., and M. Rose, "Management Information Base for
+ Network Management of TCP/IP-based Internets", RFC 1156,
+ Performance Systems International and Hughes LAN Systems, May
+ 1990.
+
+ [3] Case, J., M. Fedor, M. Schoffstall, and J. Davin, The Simple
+ Network Management Protocol", RFC 1157, University of Tennessee
+ at Knoxville, Performance Systems International, Performance
+ Systems International, and the MIT Laboratory for Computer
+ Science, May 1990.
+
+ [4] LaBarre, L., "Structure and Identification of Management
+ Information for the Internet", Internet Engineering Task Force
+ working note, Network Information Center, SRI International,
+ Menlo Park, California, April 1988.
+
+ [5] Cerf, V., "IAB Recommendations for the Development of Internet
+ Network Management Standards", RFC 1052, IAB, April 1988.
+
+ [6] Cerf, V., "Report of the Second Ad Hoc Network Management Review
+ Group", RFC 1109, IAB, August 1989.
+
+ [7] Information processing systems - Open Systems Interconnection,
+ "Specification of Basic Encoding Rules for Abstract Notation One
+ (ASN.1)", International Organization for Standardization,
+ International Standard 8825, December 1987.
+
+Security Considerations
+
+ Security issues are not discussed in this memo.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie [Page 21]
+\f
+RFC 1155 SMI May 1990
+
+
+Authors' Addresses
+
+ Marshall T. Rose
+ PSI, Inc.
+ PSI California Office
+ P.O. Box 391776
+ Mountain View, CA 94039
+
+ Phone: (415) 961-3380
+
+ EMail: mrose@PSI.COM
+
+
+ Keith McCloghrie
+ The Wollongong Group
+ 1129 San Antonio Road
+ Palo Alto, CA 04303
+
+ Phone: (415) 962-7160
+
+ EMail: sytek!kzm@HPLABS.HP.COM
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Rose & McCloghrie [Page 22]
+\f
\ No newline at end of file
--- /dev/null
+
+
+
+
+
+
+Network Working Group J. Case
+Request for Comments: 1157 SNMP Research
+Obsoletes: RFC 1098 M. Fedor
+ Performance Systems International
+ M. Schoffstall
+ Performance Systems International
+ J. Davin
+ MIT Laboratory for Computer Science
+ May 1990
+
+
+ A Simple Network Management Protocol (SNMP)
+
+ Table of Contents
+
+ 1. Status of this Memo ................................... 2
+ 2. Introduction .......................................... 2
+ 3. The SNMP Architecture ................................. 5
+ 3.1 Goals of the Architecture ............................ 5
+ 3.2 Elements of the Architecture ......................... 5
+ 3.2.1 Scope of Management Information .................... 6
+ 3.2.2 Representation of Management Information ........... 6
+ 3.2.3 Operations Supported on Management Information ..... 7
+ 3.2.4 Form and Meaning of Protocol Exchanges ............. 8
+ 3.2.5 Definition of Administrative Relationships ......... 8
+ 3.2.6 Form and Meaning of References to Managed Objects .. 12
+ 3.2.6.1 Resolution of Ambiguous MIB References ........... 12
+ 3.2.6.2 Resolution of References across MIB Versions...... 12
+ 3.2.6.3 Identification of Object Instances ............... 12
+ 3.2.6.3.1 ifTable Object Type Names ...................... 13
+ 3.2.6.3.2 atTable Object Type Names ...................... 13
+ 3.2.6.3.3 ipAddrTable Object Type Names .................. 14
+ 3.2.6.3.4 ipRoutingTable Object Type Names ............... 14
+ 3.2.6.3.5 tcpConnTable Object Type Names ................. 14
+ 3.2.6.3.6 egpNeighTable Object Type Names ................ 15
+ 4. Protocol Specification ................................ 16
+ 4.1 Elements of Procedure ................................ 17
+ 4.1.1 Common Constructs .................................. 19
+ 4.1.2 The GetRequest-PDU ................................. 20
+ 4.1.3 The GetNextRequest-PDU ............................. 21
+ 4.1.3.1 Example of Table Traversal ....................... 23
+ 4.1.4 The GetResponse-PDU ................................ 24
+ 4.1.5 The SetRequest-PDU ................................. 25
+ 4.1.6 The Trap-PDU ....................................... 27
+ 4.1.6.1 The coldStart Trap ............................... 28
+ 4.1.6.2 The warmStart Trap ............................... 28
+ 4.1.6.3 The linkDown Trap ................................ 28
+ 4.1.6.4 The linkUp Trap .................................. 28
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 1]
+\f
+RFC 1157 SNMP May 1990
+
+
+ 4.1.6.5 The authenticationFailure Trap ................... 28
+ 4.1.6.6 The egpNeighborLoss Trap ......................... 28
+ 4.1.6.7 The enterpriseSpecific Trap ...................... 29
+ 5. Definitions ........................................... 30
+ 6. Acknowledgements ...................................... 33
+ 7. References ............................................ 34
+ 8. Security Considerations................................ 35
+ 9. Authors' Addresses..................................... 35
+
+1. Status of this Memo
+
+ This RFC is a re-release of RFC 1098, with a changed "Status of this
+ Memo" section plus a few minor typographical corrections. This memo
+ defines a simple protocol by which management information for a
+ network element may be inspected or altered by logically remote
+ users. In particular, together with its companion memos which
+ describe the structure of management information along with the
+ management information base, these documents provide a simple,
+ workable architecture and system for managing TCP/IP-based internets
+ and in particular the Internet.
+
+ The Internet Activities Board recommends that all IP and TCP
+ implementations be network manageable. This implies implementation
+ of the Internet MIB (RFC-1156) and at least one of the two
+ recommended management protocols SNMP (RFC-1157) or CMOT (RFC-1095).
+ It should be noted that, at this time, SNMP is a full Internet
+ standard and CMOT is a draft standard. See also the Host and Gateway
+ Requirements RFCs for more specific information on the applicability
+ of this standard.
+
+ Please refer to the latest edition of the "IAB Official Protocol
+ Standards" RFC for current information on the state and status of
+ standard Internet protocols.
+
+ Distribution of this memo is unlimited.
+
+2. Introduction
+
+ As reported in RFC 1052, IAB Recommendations for the Development of
+ Internet Network Management Standards [1], a two-prong strategy for
+ network management of TCP/IP-based internets was undertaken. In the
+ short-term, the Simple Network Management Protocol (SNMP) was to be
+ used to manage nodes in the Internet community. In the long-term,
+ the use of the OSI network management framework was to be examined.
+ Two documents were produced to define the management information: RFC
+ 1065, which defined the Structure of Management Information (SMI)
+ [2], and RFC 1066, which defined the Management Information Base
+ (MIB) [3]. Both of these documents were designed so as to be
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 2]
+\f
+RFC 1157 SNMP May 1990
+
+
+ compatible with both the SNMP and the OSI network management
+ framework.
+
+ This strategy was quite successful in the short-term: Internet-based
+ network management technology was fielded, by both the research and
+ commercial communities, within a few months. As a result of this,
+ portions of the Internet community became network manageable in a
+ timely fashion.
+
+ As reported in RFC 1109, Report of the Second Ad Hoc Network
+ Management Review Group [4], the requirements of the SNMP and the OSI
+ network management frameworks were more different than anticipated.
+ As such, the requirement for compatibility between the SMI/MIB and
+ both frameworks was suspended. This action permitted the operational
+ network management framework, the SNMP, to respond to new operational
+ needs in the Internet community by producing documents defining new
+ MIB items.
+
+ The IAB has designated the SNMP, SMI, and the initial Internet MIB to
+ be full "Standard Protocols" with "Recommended" status. By this
+ action, the IAB recommends that all IP and TCP implementations be
+ network manageable and that the implementations that are network
+ manageable are expected to adopt and implement the SMI, MIB, and
+ SNMP.
+
+ As such, the current network management framework for TCP/IP- based
+ internets consists of: Structure and Identification of Management
+ Information for TCP/IP-based Internets, which describes how managed
+ objects contained in the MIB are defined as set forth in RFC 1155
+ [5]; Management Information Base for Network Management of TCP/IP-
+ based Internets, which describes the managed objects contained in the
+ MIB as set forth in RFC 1156 [6]; and, the Simple Network Management
+ Protocol, which defines the protocol used to manage these objects, as
+ set forth in this memo.
+
+ As reported in RFC 1052, IAB Recommendations for the Development of
+ Internet Network Management Standards [1], the Internet Activities
+ Board has directed the Internet Engineering Task Force (IETF) to
+ create two new working groups in the area of network management. One
+ group was charged with the further specification and definition of
+ elements to be included in the Management Information Base (MIB).
+ The other was charged with defining the modifications to the Simple
+ Network Management Protocol (SNMP) to accommodate the short-term
+ needs of the network vendor and operations communities, and to align
+ with the output of the MIB working group.
+
+ The MIB working group produced two memos, one which defines a
+ Structure for Management Information (SMI) [2] for use by the managed
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 3]
+\f
+RFC 1157 SNMP May 1990
+
+
+ objects contained in the MIB. A second memo [3] defines the list of
+ managed objects.
+
+ The output of the SNMP Extensions working group is this memo, which
+ incorporates changes to the initial SNMP definition [7] required to
+ attain alignment with the output of the MIB working group. The
+ changes should be minimal in order to be consistent with the IAB's
+ directive that the working groups be "extremely sensitive to the need
+ to keep the SNMP simple." Although considerable care and debate has
+ gone into the changes to the SNMP which are reflected in this memo,
+ the resulting protocol is not backwardly-compatible with its
+ predecessor, the Simple Gateway Monitoring Protocol (SGMP) [8].
+ Although the syntax of the protocol has been altered, the original
+ philosophy, design decisions, and architecture remain intact. In
+ order to avoid confusion, new UDP ports have been allocated for use
+ by the protocol described in this memo.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 4]
+\f
+RFC 1157 SNMP May 1990
+
+
+3. The SNMP Architecture
+
+ Implicit in the SNMP architectural model is a collection of network
+ management stations and network elements. Network management
+ stations execute management applications which monitor and control
+ network elements. Network elements are devices such as hosts,
+ gateways, terminal servers, and the like, which have management
+ agents responsible for performing the network management functions
+ requested by the network management stations. The Simple Network
+ Management Protocol (SNMP) is used to communicate management
+ information between the network management stations and the agents in
+ the network elements.
+
+3.1. Goals of the Architecture
+
+ The SNMP explicitly minimizes the number and complexity of management
+ functions realized by the management agent itself. This goal is
+ attractive in at least four respects:
+
+ (1) The development cost for management agent software
+ necessary to support the protocol is accordingly reduced.
+
+ (2) The degree of management function that is remotely
+ supported is accordingly increased, thereby admitting
+ fullest use of internet resources in the management task.
+
+ (3) The degree of management function that is remotely
+ supported is accordingly increased, thereby imposing the
+ fewest possible restrictions on the form and
+ sophistication of management tools.
+
+ (4) Simplified sets of management functions are easily
+ understood and used by developers of network management
+ tools.
+
+ A second goal of the protocol is that the functional paradigm for
+ monitoring and control be sufficiently extensible to accommodate
+ additional, possibly unanticipated aspects of network operation and
+ management.
+
+ A third goal is that the architecture be, as much as possible,
+ independent of the architecture and mechanisms of particular hosts or
+ particular gateways.
+
+3.2. Elements of the Architecture
+
+ The SNMP architecture articulates a solution to the network
+ management problem in terms of:
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 5]
+\f
+RFC 1157 SNMP May 1990
+
+
+ (1) the scope of the management information communicated by
+ the protocol,
+
+ (2) the representation of the management information
+ communicated by the protocol,
+
+ (3) operations on management information supported by the
+ protocol,
+
+ (4) the form and meaning of exchanges among management
+ entities,
+
+ (5) the definition of administrative relationships among
+ management entities, and
+
+ (6) the form and meaning of references to management
+ information.
+
+3.2.1. Scope of Management Information
+
+ The scope of the management information communicated by operation of
+ the SNMP is exactly that represented by instances of all non-
+ aggregate object types either defined in Internet-standard MIB or
+ defined elsewhere according to the conventions set forth in
+ Internet-standard SMI [5].
+
+ Support for aggregate object types in the MIB is neither required for
+ conformance with the SMI nor realized by the SNMP.
+
+3.2.2. Representation of Management Information
+
+ Management information communicated by operation of the SNMP is
+ represented according to the subset of the ASN.1 language [9] that is
+ specified for the definition of non-aggregate types in the SMI.
+
+ The SGMP adopted the convention of using a well-defined subset of the
+ ASN.1 language [9]. The SNMP continues and extends this tradition by
+ utilizing a moderately more complex subset of ASN.1 for describing
+ managed objects and for describing the protocol data units used for
+ managing those objects. In addition, the desire to ease eventual
+ transition to OSI-based network management protocols led to the
+ definition in the ASN.1 language of an Internet-standard Structure of
+ Management Information (SMI) [5] and Management Information Base
+ (MIB) [6]. The use of the ASN.1 language, was, in part, encouraged
+ by the successful use of ASN.1 in earlier efforts, in particular, the
+ SGMP. The restrictions on the use of ASN.1 that are part of the SMI
+ contribute to the simplicity espoused and validated by experience
+ with the SGMP.
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 6]
+\f
+RFC 1157 SNMP May 1990
+
+
+ Also for the sake of simplicity, the SNMP uses only a subset of the
+ basic encoding rules of ASN.1 [10]. Namely, all encodings use the
+ definite-length form. Further, whenever permissible, non-constructor
+ encodings are used rather than constructor encodings. This
+ restriction applies to all aspects of ASN.1 encoding, both for the
+ top-level protocol data units and the data objects they contain.
+
+3.2.3. Operations Supported on Management Information
+
+ The SNMP models all management agent functions as alterations or
+ inspections of variables. Thus, a protocol entity on a logically
+ remote host (possibly the network element itself) interacts with the
+ management agent resident on the network element in order to retrieve
+ (get) or alter (set) variables. This strategy has at least two
+ positive consequences:
+
+ (1) It has the effect of limiting the number of essential
+ management functions realized by the management agent to
+ two: one operation to assign a value to a specified
+ configuration or other parameter and another to retrieve
+ such a value.
+
+ (2) A second effect of this decision is to avoid introducing
+ into the protocol definition support for imperative
+ management commands: the number of such commands is in
+ practice ever-increasing, and the semantics of such
+ commands are in general arbitrarily complex.
+
+ The strategy implicit in the SNMP is that the monitoring of network
+ state at any significant level of detail is accomplished primarily by
+ polling for appropriate information on the part of the monitoring
+ center(s). A limited number of unsolicited messages (traps) guide
+ the timing and focus of the polling. Limiting the number of
+ unsolicited messages is consistent with the goal of simplicity and
+ minimizing the amount of traffic generated by the network management
+ function.
+
+ The exclusion of imperative commands from the set of explicitly
+ supported management functions is unlikely to preclude any desirable
+ management agent operation. Currently, most commands are requests
+ either to set the value of some parameter or to retrieve such a
+ value, and the function of the few imperative commands currently
+ supported is easily accommodated in an asynchronous mode by this
+ management model. In this scheme, an imperative command might be
+ realized as the setting of a parameter value that subsequently
+ triggers the desired action. For example, rather than implementing a
+ "reboot command," this action might be invoked by simply setting a
+ parameter indicating the number of seconds until system reboot.
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 7]
+\f
+RFC 1157 SNMP May 1990
+
+
+3.2.4. Form and Meaning of Protocol Exchanges
+
+ The communication of management information among management entities
+ is realized in the SNMP through the exchange of protocol messages.
+ The form and meaning of those messages is defined below in Section 4.
+
+ Consistent with the goal of minimizing complexity of the management
+ agent, the exchange of SNMP messages requires only an unreliable
+ datagram service, and every message is entirely and independently
+ represented by a single transport datagram. While this document
+ specifies the exchange of messages via the UDP protocol [11], the
+ mechanisms of the SNMP are generally suitable for use with a wide
+ variety of transport services.
+
+3.2.5. Definition of Administrative Relationships
+
+ The SNMP architecture admits a variety of administrative
+ relationships among entities that participate in the protocol. The
+ entities residing at management stations and network elements which
+ communicate with one another using the SNMP are termed SNMP
+ application entities. The peer processes which implement the SNMP,
+ and thus support the SNMP application entities, are termed protocol
+ entities.
+
+ A pairing of an SNMP agent with some arbitrary set of SNMP
+ application entities is called an SNMP community. Each SNMP
+ community is named by a string of octets, that is called the
+ community name for said community.
+
+ An SNMP message originated by an SNMP application entity that in fact
+ belongs to the SNMP community named by the community component of
+ said message is called an authentic SNMP message. The set of rules
+ by which an SNMP message is identified as an authentic SNMP message
+ for a particular SNMP community is called an authentication scheme.
+ An implementation of a function that identifies authentic SNMP
+ messages according to one or more authentication schemes is called an
+ authentication service.
+
+ Clearly, effective management of administrative relationships among
+ SNMP application entities requires authentication services that (by
+ the use of encryption or other techniques) are able to identify
+ authentic SNMP messages with a high degree of certainty. Some SNMP
+ implementations may wish to support only a trivial authentication
+ service that identifies all SNMP messages as authentic SNMP messages.
+
+ For any network element, a subset of objects in the MIB that pertain
+ to that element is called a SNMP MIB view. Note that the names of
+ the object types represented in a SNMP MIB view need not belong to a
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 8]
+\f
+RFC 1157 SNMP May 1990
+
+
+ single sub-tree of the object type name space.
+
+ An element of the set { READ-ONLY, READ-WRITE } is called an SNMP
+ access mode.
+
+ A pairing of a SNMP access mode with a SNMP MIB view is called an
+ SNMP community profile. A SNMP community profile represents
+ specified access privileges to variables in a specified MIB view. For
+ every variable in the MIB view in a given SNMP community profile,
+ access to that variable is represented by the profile according to
+ the following conventions:
+
+ (1) if said variable is defined in the MIB with "Access:" of
+ "none," it is unavailable as an operand for any operator;
+
+ (2) if said variable is defined in the MIB with "Access:" of
+ "read-write" or "write-only" and the access mode of the
+ given profile is READ-WRITE, that variable is available
+ as an operand for the get, set, and trap operations;
+
+ (3) otherwise, the variable is available as an operand for
+ the get and trap operations.
+
+ (4) In those cases where a "write-only" variable is an
+ operand used for the get or trap operations, the value
+ given for the variable is implementation-specific.
+
+ A pairing of a SNMP community with a SNMP community profile is called
+ a SNMP access policy. An access policy represents a specified
+ community profile afforded by the SNMP agent of a specified SNMP
+ community to other members of that community. All administrative
+ relationships among SNMP application entities are architecturally
+ defined in terms of SNMP access policies.
+
+ For every SNMP access policy, if the network element on which the
+ SNMP agent for the specified SNMP community resides is not that to
+ which the MIB view for the specified profile pertains, then that
+ policy is called a SNMP proxy access policy. The SNMP agent
+ associated with a proxy access policy is called a SNMP proxy agent.
+ While careless definition of proxy access policies can result in
+ management loops, prudent definition of proxy policies is useful in
+ at least two ways:
+
+ (1) It permits the monitoring and control of network elements
+ which are otherwise not addressable using the management
+ protocol and the transport protocol. That is, a proxy
+ agent may provide a protocol conversion function allowing
+ a management station to apply a consistent management
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 9]
+\f
+RFC 1157 SNMP May 1990
+
+
+ framework to all network elements, including devices such
+ as modems, multiplexors, and other devices which support
+ different management frameworks.
+
+ (2) It potentially shields network elements from elaborate
+ access control policies. For example, a proxy agent may
+ implement sophisticated access control whereby diverse
+ subsets of variables within the MIB are made accessible
+ to different management stations without increasing the
+ complexity of the network element.
+
+ By way of example, Figure 1 illustrates the relationship between
+ management stations, proxy agents, and management agents. In this
+ example, the proxy agent is envisioned to be a normal Internet
+ Network Operations Center (INOC) of some administrative domain which
+ has a standard managerial relationship with a set of management
+ agents.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 10]
+\f
+RFC 1157 SNMP May 1990
+
+
+ +------------------+ +----------------+ +----------------+
+ | Region #1 INOC | |Region #2 INOC | |PC in Region #3 |
+ | | | | | |
+ |Domain=Region #1 | |Domain=Region #2| |Domain=Region #3|
+ |CPU=super-mini-1 | |CPU=super-mini-1| |CPU=Clone-1 |
+ |PCommunity=pub | |PCommunity=pub | |PCommunity=slate|
+ | | | | | |
+ +------------------+ +----------------+ +----------------+
+ /|\ /|\ /|\
+ | | |
+ | | |
+ | \|/ |
+ | +-----------------+ |
+ +-------------->| Region #3 INOC |<-------------+
+ | |
+ |Domain=Region #3 |
+ |CPU=super-mini-2 |
+ |PCommunity=pub, |
+ | slate |
+ |DCommunity=secret|
+ +-------------->| |<-------------+
+ | +-----------------+ |
+ | /|\ |
+ | | |
+ | | |
+ \|/ \|/ \|/
+ +-----------------+ +-----------------+ +-----------------+
+ |Domain=Region#3 | |Domain=Region#3 | |Domain=Region#3 |
+ |CPU=router-1 | |CPU=mainframe-1 | |CPU=modem-1 |
+ |DCommunity=secret| |DCommunity=secret| |DCommunity=secret|
+ +-----------------+ +-----------------+ +-----------------+
+
+
+ Domain: the administrative domain of the element
+ PCommunity: the name of a community utilizing a proxy agent
+ DCommunity: the name of a direct community
+
+
+ Figure 1
+ Example Network Management Configuration
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 11]
+\f
+RFC 1157 SNMP May 1990
+
+
+3.2.6. Form and Meaning of References to Managed Objects
+
+ The SMI requires that the definition of a conformant management
+ protocol address:
+
+ (1) the resolution of ambiguous MIB references,
+
+ (2) the resolution of MIB references in the presence multiple
+ MIB versions, and
+
+ (3) the identification of particular instances of object
+ types defined in the MIB.
+
+3.2.6.1. Resolution of Ambiguous MIB References
+
+ Because the scope of any SNMP operation is conceptually confined to
+ objects relevant to a single network element, and because all SNMP
+ references to MIB objects are (implicitly or explicitly) by unique
+ variable names, there is no possibility that any SNMP reference to
+ any object type defined in the MIB could resolve to multiple
+ instances of that type.
+
+3.2.6.2. Resolution of References across MIB Versions
+
+ The object instance referred to by any SNMP operation is exactly that
+ specified as part of the operation request or (in the case of a get-
+ next operation) its immediate successor in the MIB as a whole. In
+ particular, a reference to an object as part of some version of the
+ Internet-standard MIB does not resolve to any object that is not part
+ of said version of the Internet-standard MIB, except in the case that
+ the requested operation is get-next and the specified object name is
+ lexicographically last among the names of all objects presented as
+ part of said version of the Internet-Standard MIB.
+
+3.2.6.3. Identification of Object Instances
+
+ The names for all object types in the MIB are defined explicitly
+ either in the Internet-standard MIB or in other documents which
+ conform to the naming conventions of the SMI. The SMI requires that
+ conformant management protocols define mechanisms for identifying
+ individual instances of those object types for a particular network
+ element.
+
+ Each instance of any object type defined in the MIB is identified in
+ SNMP operations by a unique name called its "variable name." In
+ general, the name of an SNMP variable is an OBJECT IDENTIFIER of the
+ form x.y, where x is the name of a non-aggregate object type defined
+ in the MIB and y is an OBJECT IDENTIFIER fragment that, in a way
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 12]
+\f
+RFC 1157 SNMP May 1990
+
+
+ specific to the named object type, identifies the desired instance.
+
+ This naming strategy admits the fullest exploitation of the semantics
+ of the GetNextRequest-PDU (see Section 4), because it assigns names
+ for related variables so as to be contiguous in the lexicographical
+ ordering of all variable names known in the MIB.
+
+ The type-specific naming of object instances is defined below for a
+ number of classes of object types. Instances of an object type to
+ which none of the following naming conventions are applicable are
+ named by OBJECT IDENTIFIERs of the form x.0, where x is the name of
+ said object type in the MIB definition.
+
+ For example, suppose one wanted to identify an instance of the
+ variable sysDescr The object class for sysDescr is:
+
+ iso org dod internet mgmt mib system sysDescr
+ 1 3 6 1 2 1 1 1
+
+ Hence, the object type, x, would be 1.3.6.1.2.1.1.1 to which is
+ appended an instance sub-identifier of 0. That is, 1.3.6.1.2.1.1.1.0
+ identifies the one and only instance of sysDescr.
+
+3.2.6.3.1. ifTable Object Type Names
+
+ The name of a subnet interface, s, is the OBJECT IDENTIFIER value of
+ the form i, where i has the value of that instance of the ifIndex
+ object type associated with s.
+
+ For each object type, t, for which the defined name, n, has a prefix
+ of ifEntry, an instance, i, of t is named by an OBJECT IDENTIFIER of
+ the form n.s, where s is the name of the subnet interface about which
+ i represents information.
+
+ For example, suppose one wanted to identify the instance of the
+ variable ifType associated with interface 2. Accordingly, ifType.2
+ would identify the desired instance.
+
+3.2.6.3.2. atTable Object Type Names
+
+ The name of an AT-cached network address, x, is an OBJECT IDENTIFIER
+ of the form 1.a.b.c.d, where a.b.c.d is the value (in the familiar
+ "dot" notation) of the atNetAddress object type associated with x.
+
+ The name of an address translation equivalence e is an OBJECT
+ IDENTIFIER value of the form s.w, such that s is the value of that
+ instance of the atIndex object type associated with e and such that w
+ is the name of the AT-cached network address associated with e.
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 13]
+\f
+RFC 1157 SNMP May 1990
+
+
+ For each object type, t, for which the defined name, n, has a prefix
+ of atEntry, an instance, i, of t is named by an OBJECT IDENTIFIER of
+ the form n.y, where y is the name of the address translation
+ equivalence about which i represents information.
+
+ For example, suppose one wanted to find the physical address of an
+ entry in the address translation table (ARP cache) associated with an
+ IP address of 89.1.1.42 and interface 3. Accordingly,
+ atPhysAddress.3.1.89.1.1.42 would identify the desired instance.
+
+3.2.6.3.3. ipAddrTable Object Type Names
+
+ The name of an IP-addressable network element, x, is the OBJECT
+ IDENTIFIER of the form a.b.c.d such that a.b.c.d is the value (in the
+ familiar "dot" notation) of that instance of the ipAdEntAddr object
+ type associated with x.
+
+ For each object type, t, for which the defined name, n, has a prefix
+ of ipAddrEntry, an instance, i, of t is named by an OBJECT IDENTIFIER
+ of the form n.y, where y is the name of the IP-addressable network
+ element about which i represents information.
+
+ For example, suppose one wanted to find the network mask of an entry
+ in the IP interface table associated with an IP address of 89.1.1.42.
+ Accordingly, ipAdEntNetMask.89.1.1.42 would identify the desired
+ instance.
+
+3.2.6.3.4. ipRoutingTable Object Type Names
+
+ The name of an IP route, x, is the OBJECT IDENTIFIER of the form
+ a.b.c.d such that a.b.c.d is the value (in the familiar "dot"
+ notation) of that instance of the ipRouteDest object type associated
+ with x.
+
+ For each object type, t, for which the defined name, n, has a prefix
+ of ipRoutingEntry, an instance, i, of t is named by an OBJECT
+ IDENTIFIER of the form n.y, where y is the name of the IP route about
+ which i represents information.
+
+ For example, suppose one wanted to find the next hop of an entry in
+ the IP routing table associated with the destination of 89.1.1.42.
+ Accordingly, ipRouteNextHop.89.1.1.42 would identify the desired
+ instance.
+
+3.2.6.3.5. tcpConnTable Object Type Names
+
+ The name of a TCP connection, x, is the OBJECT IDENTIFIER of the form
+ a.b.c.d.e.f.g.h.i.j such that a.b.c.d is the value (in the familiar
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 14]
+\f
+RFC 1157 SNMP May 1990
+
+
+ "dot" notation) of that instance of the tcpConnLocalAddress object
+ type associated with x and such that f.g.h.i is the value (in the
+ familiar "dot" notation) of that instance of the tcpConnRemoteAddress
+ object type associated with x and such that e is the value of that
+ instance of the tcpConnLocalPort object type associated with x and
+ such that j is the value of that instance of the tcpConnRemotePort
+ object type associated with x.
+
+ For each object type, t, for which the defined name, n, has a prefix
+ of tcpConnEntry, an instance, i, of t is named by an OBJECT
+ IDENTIFIER of the form n.y, where y is the name of the TCP connection
+ about which i represents information.
+
+ For example, suppose one wanted to find the state of a TCP connection
+ between the local address of 89.1.1.42 on TCP port 21 and the remote
+ address of 10.0.0.51 on TCP port 2059. Accordingly,
+ tcpConnState.89.1.1.42.21.10.0.0.51.2059 would identify the desired
+ instance.
+
+3.2.6.3.6. egpNeighTable Object Type Names
+
+ The name of an EGP neighbor, x, is the OBJECT IDENTIFIER of the form
+ a.b.c.d such that a.b.c.d is the value (in the familiar "dot"
+ notation) of that instance of the egpNeighAddr object type associated
+ with x.
+
+ For each object type, t, for which the defined name, n, has a prefix
+ of egpNeighEntry, an instance, i, of t is named by an OBJECT
+ IDENTIFIER of the form n.y, where y is the name of the EGP neighbor
+ about which i represents information.
+
+ For example, suppose one wanted to find the neighbor state for the IP
+ address of 89.1.1.42. Accordingly, egpNeighState.89.1.1.42 would
+ identify the desired instance.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 15]
+\f
+RFC 1157 SNMP May 1990
+
+
+4. Protocol Specification
+
+ The network management protocol is an application protocol by which
+ the variables of an agent's MIB may be inspected or altered.
+
+ Communication among protocol entities is accomplished by the exchange
+ of messages, each of which is entirely and independently represented
+ within a single UDP datagram using the basic encoding rules of ASN.1
+ (as discussed in Section 3.2.2). A message consists of a version
+ identifier, an SNMP community name, and a protocol data unit (PDU).
+ A protocol entity receives messages at UDP port 161 on the host with
+ which it is associated for all messages except for those which report
+ traps (i.e., all messages except those which contain the Trap-PDU).
+ Messages which report traps should be received on UDP port 162 for
+ further processing. An implementation of this protocol need not
+ accept messages whose length exceeds 484 octets. However, it is
+ recommended that implementations support larger datagrams whenever
+ feasible.
+
+ It is mandatory that all implementations of the SNMP support the five
+ PDUs: GetRequest-PDU, GetNextRequest-PDU, GetResponse-PDU,
+ SetRequest-PDU, and Trap-PDU.
+
+ RFC1157-SNMP DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks
+ FROM RFC1155-SMI;
+
+
+ -- top-level message
+
+ Message ::=
+ SEQUENCE {
+ version -- version-1 for this RFC
+ INTEGER {
+ version-1(0)
+ },
+
+ community -- community name
+ OCTET STRING,
+
+ data -- e.g., PDUs if trivial
+ ANY -- authentication is being used
+ }
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 16]
+\f
+RFC 1157 SNMP May 1990
+
+
+ -- protocol data units
+
+ PDUs ::=
+ CHOICE {
+ get-request
+ GetRequest-PDU,
+
+ get-next-request
+ GetNextRequest-PDU,
+
+ get-response
+ GetResponse-PDU,
+
+ set-request
+ SetRequest-PDU,
+
+ trap
+ Trap-PDU
+ }
+
+ -- the individual PDUs and commonly used
+ -- data types will be defined later
+
+ END
+
+
+4.1. Elements of Procedure
+
+ This section describes the actions of a protocol entity implementing
+ the SNMP. Note, however, that it is not intended to constrain the
+ internal architecture of any conformant implementation.
+
+ In the text that follows, the term transport address is used. In the
+ case of the UDP, a transport address consists of an IP address along
+ with a UDP port. Other transport services may be used to support the
+ SNMP. In these cases, the definition of a transport address should
+ be made accordingly.
+
+ The top-level actions of a protocol entity which generates a message
+ are as follows:
+
+ (1) It first constructs the appropriate PDU, e.g., the
+ GetRequest-PDU, as an ASN.1 object.
+
+ (2) It then passes this ASN.1 object along with a community
+ name its source transport address and the destination
+ transport address, to the service which implements the
+ desired authentication scheme. This authentication
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 17]
+\f
+RFC 1157 SNMP May 1990
+
+
+ service returns another ASN.1 object.
+
+ (3) The protocol entity then constructs an ASN.1 Message
+ object, using the community name and the resulting ASN.1
+ object.
+
+ (4) This new ASN.1 object is then serialized, using the basic
+ encoding rules of ASN.1, and then sent using a transport
+ service to the peer protocol entity.
+
+ Similarly, the top-level actions of a protocol entity which receives
+ a message are as follows:
+
+ (1) It performs a rudimentary parse of the incoming datagram
+ to build an ASN.1 object corresponding to an ASN.1
+ Message object. If the parse fails, it discards the
+ datagram and performs no further actions.
+
+ (2) It then verifies the version number of the SNMP message.
+ If there is a mismatch, it discards the datagram and
+ performs no further actions.
+
+ (3) The protocol entity then passes the community name and
+ user data found in the ASN.1 Message object, along with
+ the datagram's source and destination transport addresses
+ to the service which implements the desired
+ authentication scheme. This entity returns another ASN.1
+ object, or signals an authentication failure. In the
+ latter case, the protocol entity notes this failure,
+ (possibly) generates a trap, and discards the datagram
+ and performs no further actions.
+
+ (4) The protocol entity then performs a rudimentary parse on
+ the ASN.1 object returned from the authentication service
+ to build an ASN.1 object corresponding to an ASN.1 PDUs
+ object. If the parse fails, it discards the datagram and
+ performs no further actions. Otherwise, using the named
+ SNMP community, the appropriate profile is selected, and
+ the PDU is processed accordingly. If, as a result of
+ this processing, a message is returned then the source
+ transport address that the response message is sent from
+ shall be identical to the destination transport address
+ that the original request message was sent to.
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 18]
+\f
+RFC 1157 SNMP May 1990
+
+
+4.1.1. Common Constructs
+
+ Before introducing the six PDU types of the protocol, it is
+ appropriate to consider some of the ASN.1 constructs used frequently:
+
+ -- request/response information
+
+ RequestID ::=
+ INTEGER
+
+ ErrorStatus ::=
+ INTEGER {
+ noError(0),
+ tooBig(1),
+ noSuchName(2),
+ badValue(3),
+ readOnly(4)
+ genErr(5)
+ }
+
+ ErrorIndex ::=
+ INTEGER
+
+
+ -- variable bindings
+
+ VarBind ::=
+ SEQUENCE {
+ name
+ ObjectName,
+
+ value
+ ObjectSyntax
+ }
+
+ VarBindList ::=
+ SEQUENCE OF
+ VarBind
+
+
+ RequestIDs are used to distinguish among outstanding requests. By
+ use of the RequestID, an SNMP application entity can correlate
+ incoming responses with outstanding requests. In cases where an
+ unreliable datagram service is being used, the RequestID also
+ provides a simple means of identifying messages duplicated by the
+ network.
+
+ A non-zero instance of ErrorStatus is used to indicate that an
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 19]
+\f
+RFC 1157 SNMP May 1990
+
+
+ exception occurred while processing a request. In these cases,
+ ErrorIndex may provide additional information by indicating which
+ variable in a list caused the exception.
+
+ The term variable refers to an instance of a managed object. A
+ variable binding, or VarBind, refers to the pairing of the name of a
+ variable to the variable's value. A VarBindList is a simple list of
+ variable names and corresponding values. Some PDUs are concerned
+ only with the name of a variable and not its value (e.g., the
+ GetRequest-PDU). In this case, the value portion of the binding is
+ ignored by the protocol entity. However, the value portion must
+ still have valid ASN.1 syntax and encoding. It is recommended that
+ the ASN.1 value NULL be used for the value portion of such bindings.
+
+4.1.2. The GetRequest-PDU
+
+ The form of the GetRequest-PDU is:
+ GetRequest-PDU ::=
+ [0]
+ IMPLICIT SEQUENCE {
+ request-id
+ RequestID,
+
+ error-status -- always 0
+ ErrorStatus,
+
+ error-index -- always 0
+ ErrorIndex,
+
+ variable-bindings
+ VarBindList
+ }
+
+
+ The GetRequest-PDU is generated by a protocol entity only at the
+ request of its SNMP application entity.
+
+ Upon receipt of the GetRequest-PDU, the receiving protocol entity
+ responds according to any applicable rule in the list below:
+
+ (1) If, for any object named in the variable-bindings field,
+ the object's name does not exactly match the name of some
+ object available for get operations in the relevant MIB
+ view, then the receiving entity sends to the originator
+ of the received message the GetResponse-PDU of identical
+ form, except that the value of the error-status field is
+ noSuchName, and the value of the error-index field is the
+ index of said object name component in the received
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 20]
+\f
+RFC 1157 SNMP May 1990
+
+
+ message.
+
+ (2) If, for any object named in the variable-bindings field,
+ the object is an aggregate type (as defined in the SMI),
+ then the receiving entity sends to the originator of the
+ received message the GetResponse-PDU of identical form,
+ except that the value of the error-status field is
+ noSuchName, and the value of the error-index field is the
+ index of said object name component in the received
+ message.
+
+ (3) If the size of the GetResponse-PDU generated as described
+ below would exceed a local limitation, then the receiving
+ entity sends to the originator of the received message
+ the GetResponse-PDU of identical form, except that the
+ value of the error-status field is tooBig, and the value
+ of the error-index field is zero.
+
+ (4) If, for any object named in the variable-bindings field,
+ the value of the object cannot be retrieved for reasons
+ not covered by any of the foregoing rules, then the
+ receiving entity sends to the originator of the received
+ message the GetResponse-PDU of identical form, except
+ that the value of the error-status field is genErr and
+ the value of the error-index field is the index of said
+ object name component in the received message.
+
+ If none of the foregoing rules apply, then the receiving protocol
+ entity sends to the originator of the received message the
+ GetResponse-PDU such that, for each object named in the variable-
+ bindings field of the received message, the corresponding component
+ of the GetResponse-PDU represents the name and value of that
+ variable. The value of the error- status field of the GetResponse-
+ PDU is noError and the value of the error-index field is zero. The
+ value of the request-id field of the GetResponse-PDU is that of the
+ received message.
+
+4.1.3. The GetNextRequest-PDU
+
+ The form of the GetNextRequest-PDU is identical to that of the
+ GetRequest-PDU except for the indication of the PDU type. In the
+ ASN.1 language:
+
+ GetNextRequest-PDU ::=
+ [1]
+ IMPLICIT SEQUENCE {
+ request-id
+ RequestID,
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 21]
+\f
+RFC 1157 SNMP May 1990
+
+
+ error-status -- always 0
+ ErrorStatus,
+
+ error-index -- always 0
+ ErrorIndex,
+
+ variable-bindings
+ VarBindList
+ }
+
+
+ The GetNextRequest-PDU is generated by a protocol entity only at the
+ request of its SNMP application entity.
+
+ Upon receipt of the GetNextRequest-PDU, the receiving protocol entity
+ responds according to any applicable rule in the list below:
+
+ (1) If, for any object name in the variable-bindings field,
+ that name does not lexicographically precede the name of
+ some object available for get operations in the relevant
+ MIB view, then the receiving entity sends to the
+ originator of the received message the GetResponse-PDU of
+ identical form, except that the value of the error-status
+ field is noSuchName, and the value of the error-index
+ field is the index of said object name component in the
+ received message.
+
+ (2) If the size of the GetResponse-PDU generated as described
+ below would exceed a local limitation, then the receiving
+ entity sends to the originator of the received message
+ the GetResponse-PDU of identical form, except that the
+ value of the error-status field is tooBig, and the value
+ of the error-index field is zero.
+
+ (3) If, for any object named in the variable-bindings field,
+ the value of the lexicographical successor to the named
+ object cannot be retrieved for reasons not covered by any
+ of the foregoing rules, then the receiving entity sends
+ to the originator of the received message the
+ GetResponse-PDU of identical form, except that the value
+ of the error-status field is genErr and the value of the
+ error-index field is the index of said object name
+ component in the received message.
+
+ If none of the foregoing rules apply, then the receiving protocol
+ entity sends to the originator of the received message the
+ GetResponse-PDU such that, for each name in the variable-bindings
+ field of the received message, the corresponding component of the
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 22]
+\f
+RFC 1157 SNMP May 1990
+
+
+ GetResponse-PDU represents the name and value of that object whose
+ name is, in the lexicographical ordering of the names of all objects
+ available for get operations in the relevant MIB view, together with
+ the value of the name field of the given component, the immediate
+ successor to that value. The value of the error-status field of the
+ GetResponse-PDU is noError and the value of the errorindex field is
+ zero. The value of the request-id field of the GetResponse-PDU is
+ that of the received message.
+
+4.1.3.1. Example of Table Traversal
+
+ One important use of the GetNextRequest-PDU is the traversal of
+ conceptual tables of information within the MIB. The semantics of
+ this type of SNMP message, together with the protocol-specific
+ mechanisms for identifying individual instances of object types in
+ the MIB, affords access to related objects in the MIB as if they
+ enjoyed a tabular organization.
+
+ By the SNMP exchange sketched below, an SNMP application entity might
+ extract the destination address and next hop gateway for each entry
+ in the routing table of a particular network element. Suppose that
+ this routing table has three entries:
+
+ Destination NextHop Metric
+
+ 10.0.0.99 89.1.1.42 5
+ 9.1.2.3 99.0.0.3 3
+ 10.0.0.51 89.1.1.42 5
+
+
+ The management station sends to the SNMP agent a GetNextRequest-PDU
+ containing the indicated OBJECT IDENTIFIER values as the requested
+ variable names:
+
+ GetNextRequest ( ipRouteDest, ipRouteNextHop, ipRouteMetric1 )
+
+
+ The SNMP agent responds with a GetResponse-PDU:
+
+ GetResponse (( ipRouteDest.9.1.2.3 = "9.1.2.3" ),
+ ( ipRouteNextHop.9.1.2.3 = "99.0.0.3" ),
+ ( ipRouteMetric1.9.1.2.3 = 3 ))
+
+
+ The management station continues with:
+
+ GetNextRequest ( ipRouteDest.9.1.2.3,
+ ipRouteNextHop.9.1.2.3,
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 23]
+\f
+RFC 1157 SNMP May 1990
+
+
+ ipRouteMetric1.9.1.2.3 )
+
+
+ The SNMP agent responds:
+
+ GetResponse (( ipRouteDest.10.0.0.51 = "10.0.0.51" ),
+ ( ipRouteNextHop.10.0.0.51 = "89.1.1.42" ),
+ ( ipRouteMetric1.10.0.0.51 = 5 ))
+
+
+ The management station continues with:
+
+ GetNextRequest ( ipRouteDest.10.0.0.51,
+ ipRouteNextHop.10.0.0.51,
+ ipRouteMetric1.10.0.0.51 )
+
+
+ The SNMP agent responds:
+
+ GetResponse (( ipRouteDest.10.0.0.99 = "10.0.0.99" ),
+ ( ipRouteNextHop.10.0.0.99 = "89.1.1.42" ),
+ ( ipRouteMetric1.10.0.0.99 = 5 ))
+
+
+ The management station continues with:
+
+ GetNextRequest ( ipRouteDest.10.0.0.99,
+ ipRouteNextHop.10.0.0.99,
+ ipRouteMetric1.10.0.0.99 )
+
+
+ As there are no further entries in the table, the SNMP agent returns
+ those objects that are next in the lexicographical ordering of the
+ known object names. This response signals the end of the routing
+ table to the management station.
+
+4.1.4. The GetResponse-PDU
+
+ The form of the GetResponse-PDU is identical to that of the
+ GetRequest-PDU except for the indication of the PDU type. In the
+ ASN.1 language:
+
+ GetResponse-PDU ::=
+ [2]
+ IMPLICIT SEQUENCE {
+ request-id
+ RequestID,
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 24]
+\f
+RFC 1157 SNMP May 1990
+
+
+ error-status
+ ErrorStatus,
+
+ error-index
+ ErrorIndex,
+
+ variable-bindings
+ VarBindList
+ }
+
+
+ The GetResponse-PDU is generated by a protocol entity only upon
+ receipt of the GetRequest-PDU, GetNextRequest-PDU, or SetRequest-PDU,
+ as described elsewhere in this document.
+
+ Upon receipt of the GetResponse-PDU, the receiving protocol entity
+ presents its contents to its SNMP application entity.
+
+4.1.5. The SetRequest-PDU
+
+ The form of the SetRequest-PDU is identical to that of the
+ GetRequest-PDU except for the indication of the PDU type. In the
+ ASN.1 language:
+
+ SetRequest-PDU ::=
+ [3]
+ IMPLICIT SEQUENCE {
+ request-id
+ RequestID,
+
+ error-status -- always 0
+ ErrorStatus,
+
+ error-index -- always 0
+ ErrorIndex,
+
+ variable-bindings
+ VarBindList
+ }
+
+
+ The SetRequest-PDU is generated by a protocol entity only at the
+ request of its SNMP application entity.
+
+ Upon receipt of the SetRequest-PDU, the receiving entity responds
+ according to any applicable rule in the list below:
+
+ (1) If, for any object named in the variable-bindings field,
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 25]
+\f
+RFC 1157 SNMP May 1990
+
+
+ the object is not available for set operations in the
+ relevant MIB view, then the receiving entity sends to the
+ originator of the received message the GetResponse-PDU of
+ identical form, except that the value of the error-status
+ field is noSuchName, and the value of the error-index
+ field is the index of said object name component in the
+ received message.
+
+ (2) If, for any object named in the variable-bindings field,
+ the contents of the value field does not, according to
+ the ASN.1 language, manifest a type, length, and value
+ that is consistent with that required for the variable,
+ then the receiving entity sends to the originator of the
+ received message the GetResponse-PDU of identical form,
+ except that the value of the error-status field is
+ badValue, and the value of the error-index field is the
+ index of said object name in the received message.
+
+ (3) If the size of the Get Response type message generated as
+ described below would exceed a local limitation, then the
+ receiving entity sends to the originator of the received
+ message the GetResponse-PDU of identical form, except
+ that the value of the error-status field is tooBig, and
+ the value of the error-index field is zero.
+
+ (4) If, for any object named in the variable-bindings field,
+ the value of the named object cannot be altered for
+ reasons not covered by any of the foregoing rules, then
+ the receiving entity sends to the originator of the
+ received message the GetResponse-PDU of identical form,
+ except that the value of the error-status field is genErr
+ and the value of the error-index field is the index of
+ said object name component in the received message.
+
+ If none of the foregoing rules apply, then for each object named in
+ the variable-bindings field of the received message, the
+ corresponding value is assigned to the variable. Each variable
+ assignment specified by the SetRequest-PDU should be effected as if
+ simultaneously set with respect to all other assignments specified in
+ the same message.
+
+ The receiving entity then sends to the originator of the received
+ message the GetResponse-PDU of identical form except that the value
+ of the error-status field of the generated message is noError and the
+ value of the error-index field is zero.
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 26]
+\f
+RFC 1157 SNMP May 1990
+
+
+4.1.6. The Trap-PDU
+
+ The form of the Trap-PDU is:
+
+ Trap-PDU ::=
+ [4]
+
+ IMPLICIT SEQUENCE {
+ enterprise -- type of object generating
+ -- trap, see sysObjectID in [5]
+ OBJECT IDENTIFIER,
+
+ agent-addr -- address of object generating
+ NetworkAddress, -- trap
+
+ generic-trap -- generic trap type
+ INTEGER {
+ coldStart(0),
+ warmStart(1),
+ linkDown(2),
+ linkUp(3),
+ authenticationFailure(4),
+ egpNeighborLoss(5),
+ enterpriseSpecific(6)
+ },
+
+ specific-trap -- specific code, present even
+ INTEGER, -- if generic-trap is not
+ -- enterpriseSpecific
+
+ time-stamp -- time elapsed between the last
+ TimeTicks, -- (re)initialization of the network
+ -- entity and the generation of the
+ trap
+
+ variable-bindings -- "interesting" information
+ VarBindList
+ }
+
+
+ The Trap-PDU is generated by a protocol entity only at the request of
+ the SNMP application entity. The means by which an SNMP application
+ entity selects the destination addresses of the SNMP application
+ entities is implementation-specific.
+
+ Upon receipt of the Trap-PDU, the receiving protocol entity presents
+ its contents to its SNMP application entity.
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 27]
+\f
+RFC 1157 SNMP May 1990
+
+
+ The significance of the variable-bindings component of the Trap-PDU
+ is implementation-specific.
+
+ Interpretations of the value of the generic-trap field are:
+
+4.1.6.1. The coldStart Trap
+
+ A coldStart(0) trap signifies that the sending protocol entity is
+ reinitializing itself such that the agent's configuration or the
+ protocol entity implementation may be altered.
+
+4.1.6.2. The warmStart Trap
+
+ A warmStart(1) trap signifies that the sending protocol entity is
+ reinitializing itself such that neither the agent configuration nor
+ the protocol entity implementation is altered.
+
+4.1.6.3. The linkDown Trap
+
+ A linkDown(2) trap signifies that the sending protocol entity
+ recognizes a failure in one of the communication links represented in
+ the agent's configuration.
+
+ The Trap-PDU of type linkDown contains as the first element of its
+ variable-bindings, the name and value of the ifIndex instance for the
+ affected interface.
+
+4.1.6.4. The linkUp Trap
+
+ A linkUp(3) trap signifies that the sending protocol entity
+ recognizes that one of the communication links represented in the
+ agent's configuration has come up.
+
+ The Trap-PDU of type linkUp contains as the first element of its
+ variable-bindings, the name and value of the ifIndex instance for the
+ affected interface.
+
+4.1.6.5. The authenticationFailure Trap
+
+ An authenticationFailure(4) trap signifies that the sending protocol
+ entity is the addressee of a protocol message that is not properly
+ authenticated. While implementations of the SNMP must be capable of
+ generating this trap, they must also be capable of suppressing the
+ emission of such traps via an implementation-specific mechanism.
+
+4.1.6.6. The egpNeighborLoss Trap
+
+ An egpNeighborLoss(5) trap signifies that an EGP neighbor for whom
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 28]
+\f
+RFC 1157 SNMP May 1990
+
+
+ the sending protocol entity was an EGP peer has been marked down and
+ the peer relationship no longer obtains.
+
+ The Trap-PDU of type egpNeighborLoss contains as the first element of
+ its variable-bindings, the name and value of the egpNeighAddr
+ instance for the affected neighbor.
+
+4.1.6.7. The enterpriseSpecific Trap
+
+ A enterpriseSpecific(6) trap signifies that the sending protocol
+ entity recognizes that some enterprise-specific event has occurred.
+ The specific-trap field identifies the particular trap which
+ occurred.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 29]
+\f
+RFC 1157 SNMP May 1990
+
+
+5. Definitions
+
+ RFC1157-SNMP DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks
+ FROM RFC1155-SMI;
+
+
+ -- top-level message
+
+ Message ::=
+ SEQUENCE {
+ version -- version-1 for this RFC
+ INTEGER {
+ version-1(0)
+ },
+
+ community -- community name
+ OCTET STRING,
+
+ data -- e.g., PDUs if trivial
+ ANY -- authentication is being used
+ }
+
+
+ -- protocol data units
+
+ PDUs ::=
+ CHOICE {
+ get-request
+ GetRequest-PDU,
+
+ get-next-request
+ GetNextRequest-PDU,
+
+ get-response
+ GetResponse-PDU,
+
+ set-request
+ SetRequest-PDU,
+
+ trap
+ Trap-PDU
+ }
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 30]
+\f
+RFC 1157 SNMP May 1990
+
+
+ -- PDUs
+
+ GetRequest-PDU ::=
+ [0]
+ IMPLICIT PDU
+
+ GetNextRequest-PDU ::=
+ [1]
+ IMPLICIT PDU
+
+ GetResponse-PDU ::=
+ [2]
+ IMPLICIT PDU
+
+ SetRequest-PDU ::=
+ [3]
+ IMPLICIT PDU
+
+ PDU ::=
+ SEQUENCE {
+ request-id
+ INTEGER,
+
+ error-status -- sometimes ignored
+ INTEGER {
+ noError(0),
+ tooBig(1),
+ noSuchName(2),
+ badValue(3),
+ readOnly(4),
+ genErr(5)
+ },
+
+ error-index -- sometimes ignored
+ INTEGER,
+
+ variable-bindings -- values are sometimes ignored
+ VarBindList
+ }
+
+ Trap-PDU ::=
+ [4]
+ IMPLICIT SEQUENCE {
+ enterprise -- type of object generating
+ -- trap, see sysObjectID in [5]
+
+
+ OBJECT IDENTIFIER,
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 31]
+\f
+RFC 1157 SNMP May 1990
+
+
+ agent-addr -- address of object generating
+ NetworkAddress, -- trap
+
+ generic-trap -- generic trap type
+ INTEGER {
+ coldStart(0),
+ warmStart(1),
+ linkDown(2),
+ linkUp(3),
+ authenticationFailure(4),
+ egpNeighborLoss(5),
+ enterpriseSpecific(6)
+ },
+
+ specific-trap -- specific code, present even
+ INTEGER, -- if generic-trap is not
+ -- enterpriseSpecific
+
+ time-stamp -- time elapsed between the last
+ TimeTicks, -- (re)initialization of the
+ network
+ -- entity and the generation of the
+ trap
+
+ variable-bindings -- "interesting" information
+ VarBindList
+ }
+
+
+ -- variable bindings
+
+ VarBind ::=
+ SEQUENCE {
+ name
+ ObjectName,
+
+ value
+ ObjectSyntax
+ }
+
+ VarBindList ::=
+ SEQUENCE OF
+ VarBind
+
+ END
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 32]
+\f
+RFC 1157 SNMP May 1990
+
+
+6. Acknowledgements
+
+ This memo was influenced by the IETF SNMP Extensions working
+ group:
+
+ Karl Auerbach, Epilogue Technology
+ K. Ramesh Babu, Excelan
+ Amatzia Ben-Artzi, 3Com/Bridge
+ Lawrence Besaw, Hewlett-Packard
+ Jeffrey D. Case, University of Tennessee at Knoxville
+ Anthony Chung, Sytek
+ James Davidson, The Wollongong Group
+ James R. Davin, MIT Laboratory for Computer Science
+ Mark S. Fedor, NYSERNet
+ Phill Gross, The MITRE Corporation
+ Satish Joshi, ACC
+ Dan Lynch, Advanced Computing Environments
+ Keith McCloghrie, The Wollongong Group
+ Marshall T. Rose, The Wollongong Group (chair)
+ Greg Satz, cisco
+ Martin Lee Schoffstall, Rensselaer Polytechnic Institute
+ Wengyik Yeong, NYSERNet
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 33]
+\f
+RFC 1157 SNMP May 1990
+
+
+7. References
+
+ [1] Cerf, V., "IAB Recommendations for the Development of
+ Internet Network Management Standards", RFC 1052, IAB,
+ April 1988.
+
+ [2] Rose, M., and K. McCloghrie, "Structure and Identification
+ of Management Information for TCP/IP-based internets",
+ RFC 1065, TWG, August 1988.
+
+ [3] McCloghrie, K., and M. Rose, "Management Information Base
+ for Network Management of TCP/IP-based internets",
+ RFC 1066, TWG, August 1988.
+
+ [4] Cerf, V., "Report of the Second Ad Hoc Network Management
+ Review Group", RFC 1109, IAB, August 1989.
+
+ [5] Rose, M., and K. McCloghrie, "Structure and Identification
+ of Management Information for TCP/IP-based Internets",
+ RFC 1155, Performance Systems International and Hughes LAN
+ Systems, May 1990.
+
+ [6] McCloghrie, K., and M. Rose, "Management Information Base
+ for Network Management of TCP/IP-based Internets",
+ RFC 1156, Hughes LAN Systems and Performance Systems
+ International, May 1990.
+
+ [7] Case, J., M. Fedor, M. Schoffstall, and J. Davin,
+ "A Simple Network Management Protocol", Internet
+ Engineering Task Force working note, Network Information
+ Center, SRI International, Menlo Park, California,
+ March 1988.
+
+ [8] Davin, J., J. Case, M. Fedor, and M. Schoffstall,
+ "A Simple Gateway Monitoring Protocol", RFC 1028,
+ Proteon, University of Tennessee at Knoxville,
+ Cornell University, and Rensselaer Polytechnic
+ Institute, November 1987.
+
+ [9] Information processing systems - Open Systems
+ Interconnection, "Specification of Abstract Syntax
+ Notation One (ASN.1)", International Organization for
+ Standardization, International Standard 8824,
+ December 1987.
+
+ [10] Information processing systems - Open Systems
+ Interconnection, "Specification of Basic Encoding Rules
+ for Abstract Notation One (ASN.1)", International
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 34]
+\f
+RFC 1157 SNMP May 1990
+
+
+ Organization for Standardization, International Standard
+ 8825, December 1987.
+
+ [11] Postel, J., "User Datagram Protocol", RFC 768,
+ USC/Information Sciences Institute, November 1980.
+
+Security Considerations
+
+ Security issues are not discussed in this memo.
+
+Authors' Addresses
+
+ Jeffrey D. Case
+ SNMP Research
+ P.O. Box 8593
+ Knoxville, TN 37996-4800
+
+ Phone: (615) 573-1434
+
+ Email: case@CS.UTK.EDU
+
+
+ Mark Fedor
+ Performance Systems International
+ Rensselaer Technology Park
+ 125 Jordan Road
+ Troy, NY 12180
+
+ Phone: (518) 283-8860
+
+ Email: fedor@patton.NYSER.NET
+
+
+ Martin Lee Schoffstall
+ Performance Systems International
+ Rensselaer Technology Park
+ 165 Jordan Road
+ Troy, NY 12180
+
+ Phone: (518) 283-8860
+
+ Email: schoff@NISC.NYSER.NET
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 35]
+\f
+RFC 1157 SNMP May 1990
+
+
+ James R. Davin
+ MIT Laboratory for Computer Science, NE43-507
+ 545 Technology Square
+ Cambridge, MA 02139
+
+ Phone: (617) 253-6020
+
+ EMail: jrd@ptt.lcs.mit.edu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Case, Fedor, Schoffstall, & Davin [Page 36]
+\f
\ No newline at end of file
--- /dev/null
+
+
+
+
+
+
+Network Working Group S. Waldbusser
+Request for Comments: 2790 Lucent Technologies Inc.
+Obsoletes: 1514 P. Grillo
+Category: Standards Track WeSync.com
+ March 2000
+
+
+ Host Resources MIB
+
+Status of this Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (2000). All Rights Reserved.
+
+Abstract
+
+ This memo defines a portion of the Management Information Base (MIB)
+ for use with network management protocols in the Internet community.
+ This memo obsoletes RFC 1514, the "Host Resources MIB". This memo
+ extends that specification by clarifying changes based on
+ implementation and deployment experience and documenting the Host
+ Resources MIB in SMIv2 format while remaining semantically identical
+ to the existing SMIv1-based MIB.
+
+ This memo defines a MIB for use with managing host systems. The term
+ "host" is construed to mean any computer that communicates with other
+ similar computers attached to the internet and that is directly used
+ by one or more human beings. Although this MIB does not necessarily
+ apply to devices whose primary function is communications services
+ (e.g., terminal servers, routers, bridges, monitoring equipment),
+ such relevance is not explicitly precluded. This MIB instruments
+ attributes common to all internet hosts including, for example, both
+ personal computers and systems that run variants of Unix.
+
+
+
+
+
+
+
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 1]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+Table of Contents
+
+ 1 The SNMP Management Framework ............................ 2
+ 2 Host Resources MIB ....................................... 3
+ 3 IANA Considerations ...................................... 4
+ 4 Definitions .............................................. 4
+ 4.1 Textual Conventions .................................... 6
+ 4.2 The Host Resources System Group ........................ 7
+ 4.3 The Host Resources Storage Group ....................... 9
+ 4.4 The Host Resources Device Group ........................ 12
+ 4.5 The Host Resources Running Software Group .............. 26
+ 4.6 The Host Resources Running Software Performance
+ Group ................................................. 29
+ 4.7 The Host Resources Installed Software Group ............ 30
+ 4.8 Conformance Definitions ................................ 33
+ 5 Type Definitions ......................................... 36
+ 6 Internationalization Considerations ...................... 44
+ 7 Security Considerations .................................. 45
+ 8 References ............................................... 46
+ 9 Acknowledgments .......................................... 48
+ 10 Authors' Addresses ...................................... 49
+ 11 Intellectual Property ................................... 49
+ 12 Full Copyright Statement ................................ 50
+
+1. The SNMP Management Framework
+
+ The SNMP Management Framework presently consists of five major
+ components:
+
+ o An overall architecture, described in RFC 2571 [RFC2571].
+
+ o Mechanisms for describing and naming objects and events for the
+ purpose of management. The first version of this Structure of
+ Management Information (SMI) is called SMIv1 and described in STD
+ 16, RFC 1155 [RFC1155], STD 16, RFC 1212 [RFC1212] and RFC 1215
+ [RFC1215]. The second version, called SMIv2, is described in STD
+ 58, RFC 2578 [RFC2578], RFC 2579 [RFC2579] and RFC 2580
+ [RFC2580].
+
+ o Message protocols for transferring management information. The
+ first version of the SNMP message protocol is called SNMPv1 and
+ described in STD 15, RFC 1157 [RFC1157]. A second version of the
+ SNMP message protocol, which is not an Internet standards track
+ protocol, is called SNMPv2c and described in RFC 1901 [RFC1901]
+ and RFC 1906 [RFC1906]. The third version of the message protocol
+ is called SNMPv3 and described in RFC 1906 [RFC1906], RFC 2572
+ [RFC2572] and RFC 2574 [RFC2574].
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 2]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ o Protocol operations for accessing management information. The
+ first set of protocol operations and associated PDU formats is
+ described in STD 15, RFC 1157 [RFC1157]. A second set of protocol
+ operations and associated PDU formats is described in RFC 1905
+ [RFC1905].
+
+ o A set of fundamental applications described in RFC 2573 [RFC2573]
+ and the view-based access control mechanism described in RFC 2575
+ [RFC2575].
+
+ A more detailed introduction to the current SNMP Management Framework
+ can be found in RFC 2570 [RFC2570].
+
+ Managed objects are accessed via a virtual information store, termed
+ the Management Information Base or MIB. Objects in the MIB are
+ defined using the mechanisms defined in the SMI.
+
+ This memo specifies a MIB module that is compliant to the SMIv2. A
+ MIB conforming to the SMIv1 can be produced through the appropriate
+ translations. The resulting translated MIB must be semantically
+ equivalent, except where objects or events are omitted because no
+ translation is possible (use of Counter64). Some machine readable
+ information in SMIv2 will be converted into textual descriptions in
+ SMIv1 during the translation process. However, this loss of machine
+ readable information is not considered to change the semantics of the
+ MIB.
+
+2. Host Resources MIB
+
+ The Host Resources MIB defines a uniform set of objects useful for
+ the management of host computers. Host computers are independent of
+ the operating system, network services, or any software application.
+
+ The Host Resources MIB defines objects which are common across many
+ computer system architectures.
+
+ In addition, there are objects in the SNMPv2-MIB [RFC1907] and IF-MIB
+ [RFC2233] which also provide host management functionality.
+ Implementation of the System and Interfaces groups is mandatory for
+ implementors of the Host Resources MIB.
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED","MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+
+
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 3]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+3. IANA Considerations
+
+ This MIB contains type definitions for storage types, device types,
+ and file system types for use as values for the hrStorageType,
+ hrDeviceType, and hrFSType objects, respectively. As new computing
+ technologies are developed, new types need to be registered for these
+ technologies. The IANA (Internet Assigned Numbers Authority) is
+ designated as the registration authority for new registrations beyond
+ those published in this document. The IANA will maintain the HOST-
+ RESOURCES-TYPES module as new registrations are added and publish new
+ versions of this module.
+
+ Given the large number of such technologies and potential confusion
+ in naming of these technologies (such as a technology known by two
+ names or a name and an acronym), there is a real danger that more
+ than one registration might be created for what is essentially the
+ same technology. In order to ensure that future type registrations
+ are performed correctly, applications for new types will be reviewed
+ by a Designated Expert appointed by the IESG.
+
+4. Definitions
+
+ HOST-RESOURCES-MIB DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ MODULE-IDENTITY, OBJECT-TYPE, mib-2,
+ Integer32, Counter32, Gauge32, TimeTicks FROM SNMPv2-SMI
+
+ TEXTUAL-CONVENTION, DisplayString,
+ TruthValue, DateAndTime, AutonomousType FROM SNMPv2-TC
+
+ MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF
+
+ InterfaceIndexOrZero FROM IF-MIB;
+
+ hostResourcesMibModule MODULE-IDENTITY
+ LAST-UPDATED "200003060000Z" -- 6 March 2000
+ ORGANIZATION "IETF Host Resources MIB Working Group"
+ CONTACT-INFO
+ "Steve Waldbusser
+ Postal: Lucent Technologies, Inc.
+ 1213 Innsbruck Dr.
+ Sunnyvale, CA 94089
+ USA
+ Phone: 650-318-1251
+ Fax: 650-318-1633
+ Email: waldbusser@lucent.com
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 4]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ In addition, the Host Resources MIB mailing list is
+ dedicated to discussion of this MIB. To join the
+ mailing list, send a request message to
+ hostmib-request@andrew.cmu.edu. The mailing list
+ address is hostmib@andrew.cmu.edu."
+
+ DESCRIPTION
+ "This MIB is for use in managing host systems. The term
+ `host' is construed to mean any computer that communicates
+ with other similar computers attached to the internet and
+ that is directly used by one or more human beings. Although
+ this MIB does not necessarily apply to devices whose primary
+ function is communications services (e.g., terminal servers,
+ routers, bridges, monitoring equipment), such relevance is
+ not explicitly precluded. This MIB instruments attributes
+ common to all internet hosts including, for example, both
+ personal computers and systems that run variants of Unix."
+
+ REVISION "200003060000Z" -- 6 March 2000
+ DESCRIPTION
+ "Clarifications and bug fixes based on implementation
+ experience. This revision was also reformatted in the SMIv2
+ format. The revisions made were:
+
+ New RFC document standards:
+ Added Copyright notice, updated introduction to SNMP
+ Framework, updated references section, added reference to
+ RFC 2119, and added a meaningful Security Considerations
+ section.
+
+ New IANA considerations section for registration of new types
+
+ Conversion to new SMIv2 syntax for the following types and
+ macros:
+ Counter32, Integer32, Gauge32, MODULE-IDENTITY,
+ OBJECT-TYPE, TEXTUAL-CONVENTION, OBJECT-IDENTITY,
+ MODULE-COMPLIANCE, OBJECT-GROUP
+
+ Used new Textual Conventions:
+ TruthValue, DateAndTime, AutonomousType,
+ InterfaceIndexOrZero
+
+ Fixed typo in hrPrinterStatus.
+
+ Added missing error bits to hrPrinterDetectedErrorState and
+ clarified confusion resulting from suggested mappings to
+ hrPrinterStatus.
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 5]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ Clarified that size of objects of type
+ InternationalDisplayString is number of octets, not number
+ of encoded symbols.
+
+ Clarified the use of the following objects based on
+ implementation experience:
+ hrSystemInitialLoadDevice, hrSystemInitialLoadParameters,
+ hrMemorySize, hrStorageSize, hrStorageAllocationFailures,
+ hrDeviceErrors, hrProcessorLoad, hrNetworkIfIndex,
+ hrDiskStorageCapacity, hrSWRunStatus, hrSWRunPerfCPU,
+ and hrSWInstalledDate.
+
+ Clarified implementation technique for hrSWInstalledTable.
+
+ Used new AUGMENTS clause for hrSWRunPerfTable.
+
+ Added Internationalization Considerations section.
+
+ This revision published as RFC2790."
+
+ REVISION "9910202200Z" -- 20 October, 1999
+ DESCRIPTION
+ "The original version of this MIB, published as
+ RFC1514."
+ ::= { hrMIBAdminInfo 1 }
+
+ host OBJECT IDENTIFIER ::= { mib-2 25 }
+
+ hrSystem OBJECT IDENTIFIER ::= { host 1 }
+ hrStorage OBJECT IDENTIFIER ::= { host 2 }
+ hrDevice OBJECT IDENTIFIER ::= { host 3 }
+ hrSWRun OBJECT IDENTIFIER ::= { host 4 }
+ hrSWRunPerf OBJECT IDENTIFIER ::= { host 5 }
+ hrSWInstalled OBJECT IDENTIFIER ::= { host 6 }
+ hrMIBAdminInfo OBJECT IDENTIFIER ::= { host 7 }
+
+ -- textual conventions
+
+ KBytes ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "Storage size, expressed in units of 1024 bytes."
+ SYNTAX Integer32 (0..2147483647)
+
+ ProductID ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "This textual convention is intended to identify the
+
+
+
+Waldbusser & Grillo Standards Track [Page 6]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ manufacturer, model, and version of a specific
+ hardware or software product. It is suggested that
+ these OBJECT IDENTIFIERs are allocated such that all
+ products from a particular manufacturer are registered
+ under a subtree distinct to that manufacturer. In
+ addition, all versions of a product should be
+ registered under a subtree distinct to that product.
+ With this strategy, a management station may uniquely
+ determine the manufacturer and/or model of a product
+ whose productID is unknown to the management station.
+ Objects of this type may be useful for inventory
+ purposes or for automatically detecting
+ incompatibilities or version mismatches between
+ various hardware and software components on a system.
+
+ For example, the product ID for the ACME 4860 66MHz
+ clock doubled processor might be:
+ enterprises.acme.acmeProcessors.a4860DX2.MHz66
+
+ A software product might be registered as:
+ enterprises.acme.acmeOperatingSystems.acmeDOS.six(6).one(1)
+ "
+ SYNTAX OBJECT IDENTIFIER
+
+ -- unknownProduct will be used for any unknown ProductID
+ -- unknownProduct OBJECT IDENTIFIER ::= { 0 0 }
+
+ InternationalDisplayString ::= TEXTUAL-CONVENTION
+ STATUS current
+ DESCRIPTION
+ "This data type is used to model textual information
+ in some character set. A network management station
+ should use a local algorithm to determine which
+ character set is in use and how it should be
+ displayed. Note that this character set may be
+ encoded with more than one octet per symbol, but will
+ most often be NVT ASCII. When a size clause is
+ specified for an object of this type, the size refers
+ to the length in octets, not the number of symbols."
+ SYNTAX OCTET STRING
+
+ -- The Host Resources System Group
+
+ hrSystemUptime OBJECT-TYPE
+ SYNTAX TimeTicks
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+
+
+
+Waldbusser & Grillo Standards Track [Page 7]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ "The amount of time since this host was last
+ initialized. Note that this is different from
+ sysUpTime in the SNMPv2-MIB [RFC1907] because
+ sysUpTime is the uptime of the network management
+ portion of the system."
+ ::= { hrSystem 1 }
+
+ hrSystemDate OBJECT-TYPE
+ SYNTAX DateAndTime
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The host's notion of the local date and time of day."
+ ::= { hrSystem 2 }
+
+ hrSystemInitialLoadDevice OBJECT-TYPE
+ SYNTAX Integer32 (1..2147483647)
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The index of the hrDeviceEntry for the device from
+ which this host is configured to load its initial
+ operating system configuration (i.e., which operating
+ system code and/or boot parameters).
+
+ Note that writing to this object just changes the
+ configuration that will be used the next time the
+ operating system is loaded and does not actually cause
+ the reload to occur."
+ ::= { hrSystem 3 }
+
+ hrSystemInitialLoadParameters OBJECT-TYPE
+ SYNTAX InternationalDisplayString (SIZE (0..128))
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "This object contains the parameters (e.g. a pathname
+ and parameter) supplied to the load device when
+ requesting the initial operating system configuration
+ from that device.
+
+ Note that writing to this object just changes the
+ configuration that will be used the next time the
+ operating system is loaded and does not actually cause
+ the reload to occur."
+ ::= { hrSystem 4 }
+
+ hrSystemNumUsers OBJECT-TYPE
+
+
+
+Waldbusser & Grillo Standards Track [Page 8]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of user sessions for which this host is
+ storing state information. A session is a collection
+ of processes requiring a single act of user
+ authentication and possibly subject to collective job
+ control."
+ ::= { hrSystem 5 }
+
+ hrSystemProcesses OBJECT-TYPE
+ SYNTAX Gauge32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of process contexts currently loaded or
+ running on this system."
+ ::= { hrSystem 6 }
+
+ hrSystemMaxProcesses OBJECT-TYPE
+ SYNTAX Integer32 (0..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The maximum number of process contexts this system
+ can support. If there is no fixed maximum, the value
+ should be zero. On systems that have a fixed maximum,
+ this object can help diagnose failures that occur when
+ this maximum is reached."
+ ::= { hrSystem 7 }
+
+ -- The Host Resources Storage Group
+
+ -- Registration point for storage types, for use with hrStorageType.
+ -- These are defined in the HOST-RESOURCES-TYPES module.
+ hrStorageTypes OBJECT IDENTIFIER ::= { hrStorage 1 }
+
+ hrMemorySize OBJECT-TYPE
+ SYNTAX KBytes
+ UNITS "KBytes"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The amount of physical read-write main memory,
+ typically RAM, contained by the host."
+ ::= { hrStorage 2 }
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 9]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrStorageTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF HrStorageEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The (conceptual) table of logical storage areas on
+ the host.
+
+ An entry shall be placed in the storage table for each
+ logical area of storage that is allocated and has
+ fixed resource limits. The amount of storage
+ represented in an entity is the amount actually usable
+ by the requesting entity, and excludes loss due to
+ formatting or file system reference information.
+
+ These entries are associated with logical storage
+ areas, as might be seen by an application, rather than
+ physical storage entities which are typically seen by
+ an operating system. Storage such as tapes and
+ floppies without file systems on them are typically
+ not allocated in chunks by the operating system to
+ requesting applications, and therefore shouldn't
+ appear in this table. Examples of valid storage for
+ this table include disk partitions, file systems, ram
+ (for some architectures this is further segmented into
+ regular memory, extended memory, and so on), backing
+ store for virtual memory (`swap space').
+
+ This table is intended to be a useful diagnostic for
+ `out of memory' and `out of buffers' types of
+ failures. In addition, it can be a useful performance
+ monitoring tool for tracking memory, disk, or buffer
+ usage."
+ ::= { hrStorage 3 }
+
+ hrStorageEntry OBJECT-TYPE
+ SYNTAX HrStorageEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A (conceptual) entry for one logical storage area on
+ the host. As an example, an instance of the
+ hrStorageType object might be named hrStorageType.3"
+ INDEX { hrStorageIndex }
+ ::= { hrStorageTable 1 }
+
+ HrStorageEntry ::= SEQUENCE {
+ hrStorageIndex Integer32,
+
+
+
+Waldbusser & Grillo Standards Track [Page 10]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrStorageType AutonomousType,
+ hrStorageDescr DisplayString,
+ hrStorageAllocationUnits Integer32,
+ hrStorageSize Integer32,
+ hrStorageUsed Integer32,
+ hrStorageAllocationFailures Counter32
+ }
+
+ hrStorageIndex OBJECT-TYPE
+ SYNTAX Integer32 (1..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A unique value for each logical storage area
+ contained by the host."
+ ::= { hrStorageEntry 1 }
+
+ hrStorageType OBJECT-TYPE
+ SYNTAX AutonomousType
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The type of storage represented by this entry."
+ ::= { hrStorageEntry 2 }
+
+ hrStorageDescr OBJECT-TYPE
+ SYNTAX DisplayString
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A description of the type and instance of the storage
+ described by this entry."
+ ::= { hrStorageEntry 3 }
+
+ hrStorageAllocationUnits OBJECT-TYPE
+ SYNTAX Integer32 (1..2147483647)
+ UNITS "Bytes"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The size, in bytes, of the data objects allocated
+ from this pool. If this entry is monitoring sectors,
+ blocks, buffers, or packets, for example, this number
+ will commonly be greater than one. Otherwise this
+ number will typically be one."
+ ::= { hrStorageEntry 4 }
+
+ hrStorageSize OBJECT-TYPE
+
+
+
+Waldbusser & Grillo Standards Track [Page 11]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ SYNTAX Integer32 (0..2147483647)
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The size of the storage represented by this entry, in
+ units of hrStorageAllocationUnits. This object is
+ writable to allow remote configuration of the size of
+ the storage area in those cases where such an
+ operation makes sense and is possible on the
+ underlying system. For example, the amount of main
+ memory allocated to a buffer pool might be modified or
+ the amount of disk space allocated to virtual memory
+ might be modified."
+ ::= { hrStorageEntry 5 }
+
+ hrStorageUsed OBJECT-TYPE
+ SYNTAX Integer32 (0..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The amount of the storage represented by this entry
+ that is allocated, in units of
+ hrStorageAllocationUnits."
+ ::= { hrStorageEntry 6 }
+
+ hrStorageAllocationFailures OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of requests for storage represented by
+ this entry that could not be honored due to not enough
+ storage. It should be noted that as this object has a
+ SYNTAX of Counter32, that it does not have a defined
+ initial value. However, it is recommended that this
+ object be initialized to zero, even though management
+ stations must not depend on such an initialization."
+ ::= { hrStorageEntry 7 }
+
+ -- The Host Resources Device Group
+ --
+ -- The device group is useful for identifying and diagnosing the
+ -- devices on a system. The hrDeviceTable contains common
+ -- information for any type of device. In addition, some devices
+ -- have device-specific tables for more detailed information. More
+ -- such tables may be defined in the future for other device types.
+
+ -- Registration point for device types, for use with hrDeviceType.
+
+
+
+Waldbusser & Grillo Standards Track [Page 12]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ -- These are defined in the HOST-RESOURCES-TYPES module.
+ hrDeviceTypes OBJECT IDENTIFIER ::= { hrDevice 1 }
+
+ hrDeviceTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF HrDeviceEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The (conceptual) table of devices contained by the
+ host."
+ ::= { hrDevice 2 }
+
+ hrDeviceEntry OBJECT-TYPE
+ SYNTAX HrDeviceEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A (conceptual) entry for one device contained by the
+ host. As an example, an instance of the hrDeviceType
+ object might be named hrDeviceType.3"
+ INDEX { hrDeviceIndex }
+ ::= { hrDeviceTable 1 }
+
+ HrDeviceEntry ::= SEQUENCE {
+ hrDeviceIndex Integer32,
+ hrDeviceType AutonomousType,
+ hrDeviceDescr DisplayString,
+ hrDeviceID ProductID,
+ hrDeviceStatus INTEGER,
+ hrDeviceErrors Counter32
+ }
+
+ hrDeviceIndex OBJECT-TYPE
+ SYNTAX Integer32 (1..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A unique value for each device contained by the host.
+ The value for each device must remain constant at
+ least from one re-initialization of the agent to the
+ next re-initialization."
+ ::= { hrDeviceEntry 1 }
+
+ hrDeviceType OBJECT-TYPE
+ SYNTAX AutonomousType
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+
+
+
+Waldbusser & Grillo Standards Track [Page 13]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ "An indication of the type of device.
+
+ If this value is
+ `hrDeviceProcessor { hrDeviceTypes 3 }' then an entry
+ exists in the hrProcessorTable which corresponds to
+ this device.
+
+ If this value is
+ `hrDeviceNetwork { hrDeviceTypes 4 }', then an entry
+ exists in the hrNetworkTable which corresponds to this
+ device.
+
+ If this value is
+ `hrDevicePrinter { hrDeviceTypes 5 }', then an entry
+ exists in the hrPrinterTable which corresponds to this
+ device.
+
+ If this value is
+ `hrDeviceDiskStorage { hrDeviceTypes 6 }', then an
+ entry exists in the hrDiskStorageTable which
+ corresponds to this device."
+ ::= { hrDeviceEntry 2 }
+
+ hrDeviceDescr OBJECT-TYPE
+ SYNTAX DisplayString (SIZE (0..64))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A textual description of this device, including the
+ device's manufacturer and revision, and optionally,
+ its serial number."
+ ::= { hrDeviceEntry 3 }
+
+ hrDeviceID OBJECT-TYPE
+ SYNTAX ProductID
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The product ID for this device."
+ ::= { hrDeviceEntry 4 }
+
+ hrDeviceStatus OBJECT-TYPE
+ SYNTAX INTEGER {
+ unknown(1),
+ running(2),
+ warning(3),
+ testing(4),
+ down(5)
+
+
+
+Waldbusser & Grillo Standards Track [Page 14]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ }
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The current operational state of the device described
+ by this row of the table. A value unknown(1)
+ indicates that the current state of the device is
+ unknown. running(2) indicates that the device is up
+ and running and that no unusual error conditions are
+ known. The warning(3) state indicates that agent has
+ been informed of an unusual error condition by the
+ operational software (e.g., a disk device driver) but
+ that the device is still 'operational'. An example
+ would be a high number of soft errors on a disk. A
+ value of testing(4), indicates that the device is not
+ available for use because it is in the testing state.
+ The state of down(5) is used only when the agent has
+ been informed that the device is not available for any
+ use."
+ ::= { hrDeviceEntry 5 }
+
+ hrDeviceErrors OBJECT-TYPE
+ SYNTAX Counter32
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of errors detected on this device. It
+ should be noted that as this object has a SYNTAX of
+ Counter32, that it does not have a defined initial
+ value. However, it is recommended that this object be
+ initialized to zero, even though management stations
+ must not depend on such an initialization."
+ ::= { hrDeviceEntry 6 }
+
+ hrProcessorTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF HrProcessorEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The (conceptual) table of processors contained by the
+ host.
+
+ Note that this table is potentially sparse: a
+ (conceptual) entry exists only if the correspondent
+ value of the hrDeviceType object is
+ `hrDeviceProcessor'."
+ ::= { hrDevice 3 }
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 15]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrProcessorEntry OBJECT-TYPE
+ SYNTAX HrProcessorEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A (conceptual) entry for one processor contained by
+ the host. The hrDeviceIndex in the index represents
+ the entry in the hrDeviceTable that corresponds to the
+ hrProcessorEntry.
+
+ As an example of how objects in this table are named,
+ an instance of the hrProcessorFrwID object might be
+ named hrProcessorFrwID.3"
+ INDEX { hrDeviceIndex }
+ ::= { hrProcessorTable 1 }
+
+ HrProcessorEntry ::= SEQUENCE {
+ hrProcessorFrwID ProductID,
+ hrProcessorLoad Integer32
+ }
+
+ hrProcessorFrwID OBJECT-TYPE
+ SYNTAX ProductID
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The product ID of the firmware associated with the
+ processor."
+ ::= { hrProcessorEntry 1 }
+
+ hrProcessorLoad OBJECT-TYPE
+ SYNTAX Integer32 (0..100)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The average, over the last minute, of the percentage
+ of time that this processor was not idle.
+ Implementations may approximate this one minute
+ smoothing period if necessary."
+ ::= { hrProcessorEntry 2 }
+
+ hrNetworkTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF HrNetworkEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The (conceptual) table of network devices contained
+ by the host.
+
+
+
+Waldbusser & Grillo Standards Track [Page 16]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ Note that this table is potentially sparse: a
+ (conceptual) entry exists only if the correspondent
+ value of the hrDeviceType object is
+ `hrDeviceNetwork'."
+ ::= { hrDevice 4 }
+
+ hrNetworkEntry OBJECT-TYPE
+ SYNTAX HrNetworkEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A (conceptual) entry for one network device contained
+ by the host. The hrDeviceIndex in the index
+ represents the entry in the hrDeviceTable that
+ corresponds to the hrNetworkEntry.
+
+ As an example of how objects in this table are named,
+ an instance of the hrNetworkIfIndex object might be
+ named hrNetworkIfIndex.3"
+ INDEX { hrDeviceIndex }
+ ::= { hrNetworkTable 1 }
+
+ HrNetworkEntry ::= SEQUENCE {
+ hrNetworkIfIndex InterfaceIndexOrZero
+ }
+
+ hrNetworkIfIndex OBJECT-TYPE
+ SYNTAX InterfaceIndexOrZero
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of ifIndex which corresponds to this
+ network device. If this device is not represented in
+ the ifTable, then this value shall be zero."
+ ::= { hrNetworkEntry 1 }
+
+ hrPrinterTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF HrPrinterEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The (conceptual) table of printers local to the host.
+
+ Note that this table is potentially sparse: a
+ (conceptual) entry exists only if the correspondent
+ value of the hrDeviceType object is
+ `hrDevicePrinter'."
+ ::= { hrDevice 5 }
+
+
+
+Waldbusser & Grillo Standards Track [Page 17]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrPrinterEntry OBJECT-TYPE
+ SYNTAX HrPrinterEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A (conceptual) entry for one printer local to the
+ host. The hrDeviceIndex in the index represents the
+ entry in the hrDeviceTable that corresponds to the
+ hrPrinterEntry.
+
+ As an example of how objects in this table are named,
+ an instance of the hrPrinterStatus object might be
+ named hrPrinterStatus.3"
+ INDEX { hrDeviceIndex }
+ ::= { hrPrinterTable 1 }
+
+ HrPrinterEntry ::= SEQUENCE {
+ hrPrinterStatus INTEGER,
+ hrPrinterDetectedErrorState OCTET STRING
+ }
+
+ hrPrinterStatus OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+ idle(3),
+ printing(4),
+ warmup(5)
+ }
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The current status of this printer device."
+ ::= { hrPrinterEntry 1 }
+
+ hrPrinterDetectedErrorState OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "This object represents any error conditions detected
+ by the printer. The error conditions are encoded as
+ bits in an octet string, with the following
+ definitions:
+
+ Condition Bit #
+
+ lowPaper 0
+
+
+
+Waldbusser & Grillo Standards Track [Page 18]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ noPaper 1
+ lowToner 2
+ noToner 3
+ doorOpen 4
+ jammed 5
+ offline 6
+ serviceRequested 7
+ inputTrayMissing 8
+ outputTrayMissing 9
+ markerSupplyMissing 10
+ outputNearFull 11
+ outputFull 12
+ inputTrayEmpty 13
+ overduePreventMaint 14
+
+ Bits are numbered starting with the most significant
+ bit of the first byte being bit 0, the least
+ significant bit of the first byte being bit 7, the
+ most significant bit of the second byte being bit 8,
+ and so on. A one bit encodes that the condition was
+ detected, while a zero bit encodes that the condition
+ was not detected.
+
+ This object is useful for alerting an operator to
+ specific warning or error conditions that may occur,
+ especially those requiring human intervention."
+ ::= { hrPrinterEntry 2 }
+
+ hrDiskStorageTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF HrDiskStorageEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The (conceptual) table of long-term storage devices
+ contained by the host. In particular, disk devices
+ accessed remotely over a network are not included
+ here.
+
+ Note that this table is potentially sparse: a
+ (conceptual) entry exists only if the correspondent
+ value of the hrDeviceType object is
+ `hrDeviceDiskStorage'."
+ ::= { hrDevice 6 }
+
+ hrDiskStorageEntry OBJECT-TYPE
+ SYNTAX HrDiskStorageEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+
+
+
+Waldbusser & Grillo Standards Track [Page 19]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ DESCRIPTION
+ "A (conceptual) entry for one long-term storage device
+ contained by the host. The hrDeviceIndex in the index
+ represents the entry in the hrDeviceTable that
+ corresponds to the hrDiskStorageEntry. As an example,
+ an instance of the hrDiskStorageCapacity object might
+ be named hrDiskStorageCapacity.3"
+ INDEX { hrDeviceIndex }
+ ::= { hrDiskStorageTable 1 }
+
+ HrDiskStorageEntry ::= SEQUENCE {
+ hrDiskStorageAccess INTEGER,
+ hrDiskStorageMedia INTEGER,
+ hrDiskStorageRemoveble TruthValue,
+ hrDiskStorageCapacity KBytes
+ }
+
+ hrDiskStorageAccess OBJECT-TYPE
+ SYNTAX INTEGER {
+ readWrite(1),
+ readOnly(2)
+ }
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "An indication if this long-term storage device is
+ readable and writable or only readable. This should
+ reflect the media type, any write-protect mechanism,
+ and any device configuration that affects the entire
+ device."
+ ::= { hrDiskStorageEntry 1 }
+
+ hrDiskStorageMedia OBJECT-TYPE
+ SYNTAX INTEGER {
+ other(1),
+ unknown(2),
+ hardDisk(3),
+ floppyDisk(4),
+ opticalDiskROM(5),
+ opticalDiskWORM(6), -- Write Once Read Many
+ opticalDiskRW(7),
+ ramDisk(8)
+ }
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "An indication of the type of media used in this long-
+ term storage device."
+
+
+
+Waldbusser & Grillo Standards Track [Page 20]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ ::= { hrDiskStorageEntry 2 }
+
+ hrDiskStorageRemoveble OBJECT-TYPE
+ SYNTAX TruthValue
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "Denotes whether or not the disk media may be removed
+ from the drive."
+ ::= { hrDiskStorageEntry 3 }
+
+ hrDiskStorageCapacity OBJECT-TYPE
+ SYNTAX KBytes
+ UNITS "KBytes"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total size for this long-term storage device. If
+ the media is removable and is currently removed, this
+ value should be zero."
+ ::= { hrDiskStorageEntry 4 }
+
+ hrPartitionTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF HrPartitionEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The (conceptual) table of partitions for long-term
+ storage devices contained by the host. In particular,
+ partitions accessed remotely over a network are not
+ included here."
+ ::= { hrDevice 7 }
+
+ hrPartitionEntry OBJECT-TYPE
+ SYNTAX HrPartitionEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A (conceptual) entry for one partition. The
+ hrDeviceIndex in the index represents the entry in the
+ hrDeviceTable that corresponds to the
+ hrPartitionEntry.
+
+ As an example of how objects in this table are named,
+ an instance of the hrPartitionSize object might be
+ named hrPartitionSize.3.1"
+ INDEX { hrDeviceIndex, hrPartitionIndex }
+ ::= { hrPartitionTable 1 }
+
+
+
+Waldbusser & Grillo Standards Track [Page 21]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ HrPartitionEntry ::= SEQUENCE {
+ hrPartitionIndex Integer32,
+ hrPartitionLabel InternationalDisplayString,
+ hrPartitionID OCTET STRING,
+ hrPartitionSize KBytes,
+ hrPartitionFSIndex Integer32
+ }
+
+ hrPartitionIndex OBJECT-TYPE
+ SYNTAX Integer32 (1..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A unique value for each partition on this long-term
+ storage device. The value for each long-term storage
+ device must remain constant at least from one re-
+ initialization of the agent to the next re-
+ initialization."
+ ::= { hrPartitionEntry 1 }
+
+ hrPartitionLabel OBJECT-TYPE
+ SYNTAX InternationalDisplayString (SIZE (0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A textual description of this partition."
+ ::= { hrPartitionEntry 2 }
+
+ hrPartitionID OBJECT-TYPE
+ SYNTAX OCTET STRING
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A descriptor which uniquely represents this partition
+ to the responsible operating system. On some systems,
+ this might take on a binary representation."
+ ::= { hrPartitionEntry 3 }
+
+ hrPartitionSize OBJECT-TYPE
+ SYNTAX KBytes
+ UNITS "KBytes"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The size of this partition."
+ ::= { hrPartitionEntry 4 }
+
+ hrPartitionFSIndex OBJECT-TYPE
+
+
+
+Waldbusser & Grillo Standards Track [Page 22]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ SYNTAX Integer32 (0..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The index of the file system mounted on this
+ partition. If no file system is mounted on this
+ partition, then this value shall be zero. Note that
+ multiple partitions may point to one file system,
+ denoting that that file system resides on those
+ partitions. Multiple file systems may not reside on
+ one partition."
+ ::= { hrPartitionEntry 5 }
+
+ -- The File System Table
+
+ -- Registration point for popular File System types,
+ -- for use with hrFSType. These are defined in the
+ -- HOST-RESOURCES-TYPES module.
+ hrFSTypes OBJECT IDENTIFIER ::= { hrDevice 9 }
+
+ hrFSTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF HrFSEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The (conceptual) table of file systems local to this
+ host or remotely mounted from a file server. File
+ systems that are in only one user's environment on a
+ multi-user system will not be included in this table."
+ ::= { hrDevice 8 }
+
+ hrFSEntry OBJECT-TYPE
+ SYNTAX HrFSEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A (conceptual) entry for one file system local to
+ this host or remotely mounted from a file server.
+ File systems that are in only one user's environment
+ on a multi-user system will not be included in this
+ table.
+
+ As an example of how objects in this table are named,
+ an instance of the hrFSMountPoint object might be
+ named hrFSMountPoint.3"
+ INDEX { hrFSIndex }
+ ::= { hrFSTable 1 }
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 23]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ HrFSEntry ::= SEQUENCE {
+ hrFSIndex Integer32,
+ hrFSMountPoint InternationalDisplayString,
+ hrFSRemoteMountPoint InternationalDisplayString,
+ hrFSType AutonomousType,
+ hrFSAccess INTEGER,
+ hrFSBootable TruthValue,
+ hrFSStorageIndex Integer32,
+ hrFSLastFullBackupDate DateAndTime,
+ hrFSLastPartialBackupDate DateAndTime
+ }
+
+ hrFSIndex OBJECT-TYPE
+ SYNTAX Integer32 (1..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A unique value for each file system local to this
+ host. The value for each file system must remain
+ constant at least from one re-initialization of the
+ agent to the next re-initialization."
+ ::= { hrFSEntry 1 }
+
+ hrFSMountPoint OBJECT-TYPE
+ SYNTAX InternationalDisplayString (SIZE(0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The path name of the root of this file system."
+ ::= { hrFSEntry 2 }
+
+ hrFSRemoteMountPoint OBJECT-TYPE
+ SYNTAX InternationalDisplayString (SIZE(0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A description of the name and/or address of the
+ server that this file system is mounted from. This
+ may also include parameters such as the mount point on
+ the remote file system. If this is not a remote file
+ system, this string should have a length of zero."
+ ::= { hrFSEntry 3 }
+
+ hrFSType OBJECT-TYPE
+ SYNTAX AutonomousType
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+
+
+
+Waldbusser & Grillo Standards Track [Page 24]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ "The value of this object identifies the type of this
+ file system."
+ ::= { hrFSEntry 4 }
+
+ hrFSAccess OBJECT-TYPE
+ SYNTAX INTEGER {
+ readWrite(1),
+ readOnly(2)
+ }
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "An indication if this file system is logically
+ configured by the operating system to be readable and
+ writable or only readable. This does not represent
+ any local access-control policy, except one that is
+ applied to the file system as a whole."
+ ::= { hrFSEntry 5 }
+
+ hrFSBootable OBJECT-TYPE
+ SYNTAX TruthValue
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A flag indicating whether this file system is
+ bootable."
+ ::= { hrFSEntry 6 }
+
+ hrFSStorageIndex OBJECT-TYPE
+ SYNTAX Integer32 (0..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The index of the hrStorageEntry that represents
+ information about this file system. If there is no
+ such information available, then this value shall be
+ zero. The relevant storage entry will be useful in
+ tracking the percent usage of this file system and
+ diagnosing errors that may occur when it runs out of
+ space."
+ ::= { hrFSEntry 7 }
+
+ hrFSLastFullBackupDate OBJECT-TYPE
+ SYNTAX DateAndTime
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The last date at which this complete file system was
+
+
+
+Waldbusser & Grillo Standards Track [Page 25]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ copied to another storage device for backup. This
+ information is useful for ensuring that backups are
+ being performed regularly.
+
+ If this information is not known, then this variable
+ shall have the value corresponding to January 1, year
+ 0000, 00:00:00.0, which is encoded as
+ (hex)'00 00 01 01 00 00 00 00'."
+ ::= { hrFSEntry 8 }
+
+ hrFSLastPartialBackupDate OBJECT-TYPE
+ SYNTAX DateAndTime
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The last date at which a portion of this file system
+ was copied to another storage device for backup. This
+ information is useful for ensuring that backups are
+ being performed regularly.
+
+ If this information is not known, then this variable
+ shall have the value corresponding to January 1, year
+ 0000, 00:00:00.0, which is encoded as
+ (hex)'00 00 01 01 00 00 00 00'."
+ ::= { hrFSEntry 9 }
+
+ -- The Host Resources Running Software Group
+ --
+ -- The hrSWRunTable contains an entry for each distinct piece of
+ -- software that is running or loaded into physical or virtual
+ -- memory in preparation for running. This includes the host's
+ -- operating system, device drivers, and applications.
+
+ hrSWOSIndex OBJECT-TYPE
+ SYNTAX Integer32 (1..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of the hrSWRunIndex for the hrSWRunEntry
+ that represents the primary operating system running
+ on this host. This object is useful for quickly and
+ uniquely identifying that primary operating system."
+ ::= { hrSWRun 1 }
+
+ hrSWRunTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF HrSWRunEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+
+
+
+Waldbusser & Grillo Standards Track [Page 26]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ DESCRIPTION
+ "The (conceptual) table of software running on the
+ host."
+ ::= { hrSWRun 2 }
+
+ hrSWRunEntry OBJECT-TYPE
+ SYNTAX HrSWRunEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A (conceptual) entry for one piece of software
+ running on the host Note that because the installed
+ software table only contains information for software
+ stored locally on this host, not every piece of
+ running software will be found in the installed
+ software table. This is true of software that was
+ loaded and run from a non-local source, such as a
+ network-mounted file system.
+
+ As an example of how objects in this table are named,
+ an instance of the hrSWRunName object might be named
+ hrSWRunName.1287"
+ INDEX { hrSWRunIndex }
+ ::= { hrSWRunTable 1 }
+
+ HrSWRunEntry ::= SEQUENCE {
+ hrSWRunIndex Integer32,
+ hrSWRunName InternationalDisplayString,
+ hrSWRunID ProductID,
+ hrSWRunPath InternationalDisplayString,
+ hrSWRunParameters InternationalDisplayString,
+ hrSWRunType INTEGER,
+ hrSWRunStatus INTEGER
+ }
+
+ hrSWRunIndex OBJECT-TYPE
+ SYNTAX Integer32 (1..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A unique value for each piece of software running on
+ the host. Wherever possible, this should be the
+ system's native, unique identification number."
+ ::= { hrSWRunEntry 1 }
+
+ hrSWRunName OBJECT-TYPE
+ SYNTAX InternationalDisplayString (SIZE (0..64))
+ MAX-ACCESS read-only
+
+
+
+Waldbusser & Grillo Standards Track [Page 27]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ STATUS current
+ DESCRIPTION
+ "A textual description of this running piece of
+ software, including the manufacturer, revision, and
+ the name by which it is commonly known. If this
+ software was installed locally, this should be the
+ same string as used in the corresponding
+ hrSWInstalledName."
+ ::= { hrSWRunEntry 2 }
+
+ hrSWRunID OBJECT-TYPE
+ SYNTAX ProductID
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The product ID of this running piece of software."
+ ::= { hrSWRunEntry 3 }
+
+ hrSWRunPath OBJECT-TYPE
+ SYNTAX InternationalDisplayString (SIZE(0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A description of the location on long-term storage
+ (e.g. a disk drive) from which this software was
+ loaded."
+ ::= { hrSWRunEntry 4 }
+
+ hrSWRunParameters OBJECT-TYPE
+ SYNTAX InternationalDisplayString (SIZE(0..128))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A description of the parameters supplied to this
+ software when it was initially loaded."
+ ::= { hrSWRunEntry 5 }
+
+ hrSWRunType OBJECT-TYPE
+ SYNTAX INTEGER {
+ unknown(1),
+ operatingSystem(2),
+ deviceDriver(3),
+ application(4)
+ }
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The type of this software."
+
+
+
+Waldbusser & Grillo Standards Track [Page 28]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ ::= { hrSWRunEntry 6 }
+
+ hrSWRunStatus OBJECT-TYPE
+ SYNTAX INTEGER {
+ running(1),
+ runnable(2), -- waiting for resource
+ -- (i.e., CPU, memory, IO)
+ notRunnable(3), -- loaded but waiting for event
+ invalid(4) -- not loaded
+ }
+ MAX-ACCESS read-write
+ STATUS current
+ DESCRIPTION
+ "The status of this running piece of software.
+ Setting this value to invalid(4) shall cause this
+ software to stop running and to be unloaded. Sets to
+ other values are not valid."
+ ::= { hrSWRunEntry 7 }
+
+ -- The Host Resources Running Software Performance Group
+ --
+ -- The hrSWRunPerfTable contains an entry corresponding to
+ -- each entry in the hrSWRunTable.
+
+ hrSWRunPerfTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF HrSWRunPerfEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The (conceptual) table of running software
+ performance metrics."
+ ::= { hrSWRunPerf 1 }
+
+ hrSWRunPerfEntry OBJECT-TYPE
+ SYNTAX HrSWRunPerfEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A (conceptual) entry containing software performance
+ metrics. As an example, an instance of the
+ hrSWRunPerfCPU object might be named
+ hrSWRunPerfCPU.1287"
+ AUGMENTS { hrSWRunEntry } -- This table augments information in
+ -- the hrSWRunTable.
+ ::= { hrSWRunPerfTable 1 }
+
+ HrSWRunPerfEntry ::= SEQUENCE {
+ hrSWRunPerfCPU Integer32,
+
+
+
+Waldbusser & Grillo Standards Track [Page 29]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrSWRunPerfMem KBytes
+ }
+
+ hrSWRunPerfCPU OBJECT-TYPE
+ SYNTAX Integer32 (0..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The number of centi-seconds of the total system's CPU
+ resources consumed by this process. Note that on a
+ multi-processor system, this value may increment by
+ more than one centi-second in one centi-second of real
+ (wall clock) time."
+ ::= { hrSWRunPerfEntry 1 }
+
+ hrSWRunPerfMem OBJECT-TYPE
+ SYNTAX KBytes
+ UNITS "KBytes"
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The total amount of real system memory allocated to
+ this process."
+ ::= { hrSWRunPerfEntry 2 }
+
+ -- The Host Resources Installed Software Group
+ --
+ -- The hrSWInstalledTable contains an entry for each piece
+ -- of software installed in long-term storage (e.g. a disk
+ -- drive) locally on this host. Note that this does not
+ -- include software loadable remotely from a network
+ -- server.
+ --
+ -- Different implementations may track software in varying
+ -- ways. For example, while some implementations may track
+ -- executable files as distinct pieces of software, other
+ -- implementations may use other strategies such as keeping
+ -- track of software "packages" (e.g., related groups of files)
+ -- or keeping track of system or application "patches".
+ --
+ -- This table is useful for identifying and inventorying
+ -- software on a host and for diagnosing incompatibility
+ -- and version mismatch problems between various pieces
+ -- of hardware and software.
+
+ hrSWInstalledLastChange OBJECT-TYPE
+ SYNTAX TimeTicks
+ MAX-ACCESS read-only
+
+
+
+Waldbusser & Grillo Standards Track [Page 30]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime when an entry in the
+ hrSWInstalledTable was last added, renamed, or
+ deleted. Because this table is likely to contain many
+ entries, polling of this object allows a management
+ station to determine when re-downloading of the table
+ might be useful."
+ ::= { hrSWInstalled 1 }
+
+ hrSWInstalledLastUpdateTime OBJECT-TYPE
+ SYNTAX TimeTicks
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The value of sysUpTime when the hrSWInstalledTable
+ was last completely updated. Because caching of this
+ data will be a popular implementation strategy,
+ retrieval of this object allows a management station
+ to obtain a guarantee that no data in this table is
+ older than the indicated time."
+ ::= { hrSWInstalled 2 }
+
+ hrSWInstalledTable OBJECT-TYPE
+ SYNTAX SEQUENCE OF HrSWInstalledEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "The (conceptual) table of software installed on this
+ host."
+ ::= { hrSWInstalled 3 }
+
+ hrSWInstalledEntry OBJECT-TYPE
+ SYNTAX HrSWInstalledEntry
+ MAX-ACCESS not-accessible
+ STATUS current
+ DESCRIPTION
+ "A (conceptual) entry for a piece of software
+ installed on this host.
+
+ As an example of how objects in this table are named,
+ an instance of the hrSWInstalledName object might be
+ named hrSWInstalledName.96"
+ INDEX { hrSWInstalledIndex }
+ ::= { hrSWInstalledTable 1 }
+
+ HrSWInstalledEntry ::= SEQUENCE {
+ hrSWInstalledIndex Integer32,
+
+
+
+Waldbusser & Grillo Standards Track [Page 31]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrSWInstalledName InternationalDisplayString,
+ hrSWInstalledID ProductID,
+ hrSWInstalledType INTEGER,
+ hrSWInstalledDate DateAndTime
+ }
+
+ hrSWInstalledIndex OBJECT-TYPE
+ SYNTAX Integer32 (1..2147483647)
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A unique value for each piece of software installed
+ on the host. This value shall be in the range from 1
+ to the number of pieces of software installed on the
+ host."
+ ::= { hrSWInstalledEntry 1 }
+
+ hrSWInstalledName OBJECT-TYPE
+ SYNTAX InternationalDisplayString (SIZE (0..64))
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "A textual description of this installed piece of
+ software, including the manufacturer, revision, the
+ name by which it is commonly known, and optionally,
+ its serial number."
+ ::= { hrSWInstalledEntry 2 }
+
+ hrSWInstalledID OBJECT-TYPE
+ SYNTAX ProductID
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The product ID of this installed piece of software."
+ ::= { hrSWInstalledEntry 3 }
+
+ hrSWInstalledType OBJECT-TYPE
+ SYNTAX INTEGER {
+ unknown(1),
+ operatingSystem(2),
+ deviceDriver(3),
+ application(4)
+ }
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The type of this software."
+ ::= { hrSWInstalledEntry 4 }
+
+
+
+Waldbusser & Grillo Standards Track [Page 32]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrSWInstalledDate OBJECT-TYPE
+ SYNTAX DateAndTime
+ MAX-ACCESS read-only
+ STATUS current
+ DESCRIPTION
+ "The last-modification date of this application as it
+ would appear in a directory listing.
+
+ If this information is not known, then this variable
+ shall have the value corresponding to January 1, year
+ 0000, 00:00:00.0, which is encoded as
+ (hex)'00 00 01 01 00 00 00 00'."
+ ::= { hrSWInstalledEntry 5 }
+
+ -- Conformance information
+
+ hrMIBCompliances OBJECT IDENTIFIER ::= { hrMIBAdminInfo 2 }
+ hrMIBGroups OBJECT IDENTIFIER ::= { hrMIBAdminInfo 3 }
+
+ -- Compliance Statements
+ hrMIBCompliance MODULE-COMPLIANCE
+ STATUS current
+ DESCRIPTION
+ "The requirements for conformance to the Host Resources MIB."
+ MODULE -- this module
+ MANDATORY-GROUPS { hrSystemGroup, hrStorageGroup,
+ hrDeviceGroup }
+
+ OBJECT hrSystemDate
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ OBJECT hrSystemInitialLoadDevice
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ OBJECT hrSystemInitialLoadParameters
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ OBJECT hrStorageSize
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 33]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ OBJECT hrFSLastFullBackupDate
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ OBJECT hrFSLastPartialBackupDate
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ GROUP hrSWRunGroup
+ DESCRIPTION
+ "The Running Software Group. Implementation
+ of this group is mandatory only when the
+ hrSWRunPerfGroup is implemented."
+
+ OBJECT hrSWRunStatus
+ MIN-ACCESS read-only
+ DESCRIPTION
+ "Write access is not required."
+
+ GROUP hrSWRunPerfGroup
+ DESCRIPTION
+ "The Running Software Performance Group.
+ Implementation of this group is at the discretion
+ of the implementor."
+
+ GROUP hrSWInstalledGroup
+ DESCRIPTION
+ "The Installed Software Group.
+ Implementation of this group is at the discretion
+ of the implementor."
+
+ ::= { hrMIBCompliances 1 }
+
+ hrSystemGroup OBJECT-GROUP
+ OBJECTS {
+ hrSystemUptime, hrSystemDate,
+ hrSystemInitialLoadDevice,
+ hrSystemInitialLoadParameters,
+ hrSystemNumUsers, hrSystemProcesses,
+ hrSystemMaxProcesses
+ }
+ STATUS current
+ DESCRIPTION
+ "The Host Resources System Group."
+ ::= { hrMIBGroups 1 }
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 34]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrStorageGroup OBJECT-GROUP
+ OBJECTS {
+ hrMemorySize, hrStorageIndex, hrStorageType,
+ hrStorageDescr, hrStorageAllocationUnits,
+ hrStorageSize, hrStorageUsed,
+ hrStorageAllocationFailures
+ }
+ STATUS current
+ DESCRIPTION
+ "The Host Resources Storage Group."
+ ::= { hrMIBGroups 2 }
+
+ hrDeviceGroup OBJECT-GROUP
+ OBJECTS {
+ hrDeviceIndex, hrDeviceType, hrDeviceDescr,
+ hrDeviceID, hrDeviceStatus, hrDeviceErrors,
+ hrProcessorFrwID, hrProcessorLoad,
+ hrNetworkIfIndex, hrPrinterStatus,
+ hrPrinterDetectedErrorState,
+ hrDiskStorageAccess, hrDiskStorageMedia,
+ hrDiskStorageRemoveble, hrDiskStorageCapacity,
+ hrPartitionIndex, hrPartitionLabel,
+ hrPartitionID, hrPartitionSize,
+ hrPartitionFSIndex, hrFSIndex, hrFSMountPoint,
+ hrFSRemoteMountPoint, hrFSType, hrFSAccess,
+ hrFSBootable, hrFSStorageIndex,
+ hrFSLastFullBackupDate,
+ hrFSLastPartialBackupDate
+ }
+ STATUS current
+ DESCRIPTION
+ "The Host Resources Device Group."
+ ::= { hrMIBGroups 3 }
+
+ hrSWRunGroup OBJECT-GROUP
+ OBJECTS {
+ hrSWOSIndex, hrSWRunIndex, hrSWRunName,
+ hrSWRunID, hrSWRunPath, hrSWRunParameters,
+ hrSWRunType, hrSWRunStatus
+ }
+ STATUS current
+ DESCRIPTION
+ "The Host Resources Running Software Group."
+ ::= { hrMIBGroups 4 }
+
+ hrSWRunPerfGroup OBJECT-GROUP
+ OBJECTS { hrSWRunPerfCPU, hrSWRunPerfMem }
+ STATUS current
+
+
+
+Waldbusser & Grillo Standards Track [Page 35]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ DESCRIPTION
+ "The Host Resources Running Software
+ Performance Group."
+ ::= { hrMIBGroups 5 }
+
+ hrSWInstalledGroup OBJECT-GROUP
+ OBJECTS {
+ hrSWInstalledLastChange,
+ hrSWInstalledLastUpdateTime,
+ hrSWInstalledIndex, hrSWInstalledName,
+ hrSWInstalledID, hrSWInstalledType,
+ hrSWInstalledDate
+ }
+ STATUS current
+ DESCRIPTION
+ "The Host Resources Installed Software Group."
+ ::= { hrMIBGroups 6 }
+
+ END
+
+5. Type Definitions
+
+ HOST-RESOURCES-TYPES DEFINITIONS ::= BEGIN
+
+ IMPORTS
+ MODULE-IDENTITY, OBJECT-IDENTITY FROM SNMPv2-SMI
+ hrMIBAdminInfo, hrStorage, hrDevice FROM HOST-RESOURCES-MIB;
+
+ hostResourcesTypesModule MODULE-IDENTITY
+ LAST-UPDATED "200003060000Z" -- 6 March, 2000
+ ORGANIZATION "IETF Host Resources MIB Working Group"
+ CONTACT-INFO
+ "Steve Waldbusser
+ Postal: Lucent Technologies, Inc.
+ 1213 Innsbruck Dr.
+ Sunnyvale, CA 94089
+ USA
+ Phone: 650-318-1251
+ Fax: 650-318-1633
+ Email: waldbusser@ins.com
+
+ In addition, the Host Resources MIB mailing list is dedicated
+ to discussion of this MIB. To join the mailing list, send a
+ request message to hostmib-request@andrew.cmu.edu. The mailing
+ list address is hostmib@andrew.cmu.edu."
+ DESCRIPTION
+ "This MIB module registers type definitions for
+ storage types, device types, and file system types.
+
+
+
+Waldbusser & Grillo Standards Track [Page 36]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ After the initial revision, this module will be
+ maintained by IANA."
+ REVISION "200003060000Z" -- 6 March 2000
+ DESCRIPTION
+ "The original version of this module, published as RFC
+ 2790."
+ ::= { hrMIBAdminInfo 4 }
+
+ -- Registrations for some storage types, for use with hrStorageType
+ hrStorageTypes OBJECT IDENTIFIER ::= { hrStorage 1 }
+
+ hrStorageOther OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The storage type identifier used when no other defined
+ type is appropriate."
+ ::= { hrStorageTypes 1 }
+
+ hrStorageRam OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The storage type identifier used for RAM."
+ ::= { hrStorageTypes 2 }
+
+ hrStorageVirtualMemory OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The storage type identifier used for virtual memory,
+ temporary storage of swapped or paged memory."
+ ::= { hrStorageTypes 3 }
+
+ hrStorageFixedDisk OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The storage type identifier used for non-removable
+ rigid rotating magnetic storage devices."
+ ::= { hrStorageTypes 4 }
+
+ hrStorageRemovableDisk OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The storage type identifier used for removable rigid
+ rotating magnetic storage devices."
+ ::= { hrStorageTypes 5 }
+
+ hrStorageFloppyDisk OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+
+
+
+Waldbusser & Grillo Standards Track [Page 37]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ "The storage type identifier used for non-rigid rotating
+ magnetic storage devices."
+ ::= { hrStorageTypes 6 }
+
+ hrStorageCompactDisc OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The storage type identifier used for read-only rotating
+ optical storage devices."
+ ::= { hrStorageTypes 7 }
+
+ hrStorageRamDisk OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The storage type identifier used for a file system that
+ is stored in RAM."
+ ::= { hrStorageTypes 8 }
+
+ hrStorageFlashMemory OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The storage type identifier used for flash memory."
+ ::= { hrStorageTypes 9 }
+
+ hrStorageNetworkDisk OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The storage type identifier used for a
+ networked file system."
+ ::= { hrStorageTypes 10 }
+
+ -- Registrations for some device types, for use with hrDeviceType
+ hrDeviceTypes OBJECT IDENTIFIER ::= { hrDevice 1 }
+
+ hrDeviceOther OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used when no other defined
+ type is appropriate."
+ ::= { hrDeviceTypes 1 }
+
+ hrDeviceUnknown OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used when the device type is
+ unknown."
+ ::= { hrDeviceTypes 2 }
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 38]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrDeviceProcessor OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a CPU."
+ ::= { hrDeviceTypes 3 }
+
+ hrDeviceNetwork OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a network interface."
+ ::= { hrDeviceTypes 4 }
+
+ hrDevicePrinter OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a printer."
+ ::= { hrDeviceTypes 5 }
+
+ hrDeviceDiskStorage OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a disk drive."
+ ::= { hrDeviceTypes 6 }
+
+ hrDeviceVideo OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a video device."
+ ::= { hrDeviceTypes 10 }
+
+ hrDeviceAudio OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for an audio device."
+ ::= { hrDeviceTypes 11 }
+
+ hrDeviceCoprocessor OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a co-processor."
+ ::= { hrDeviceTypes 12 }
+
+ hrDeviceKeyboard OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a keyboard device."
+ ::= { hrDeviceTypes 13 }
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 39]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrDeviceModem OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a modem."
+ ::= { hrDeviceTypes 14 }
+
+ hrDeviceParallelPort OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a parallel port."
+ ::= { hrDeviceTypes 15 }
+
+ hrDevicePointing OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a pointing device
+ (e.g., a mouse)."
+ ::= { hrDeviceTypes 16 }
+
+ hrDeviceSerialPort OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a serial port."
+ ::= { hrDeviceTypes 17 }
+
+ hrDeviceTape OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a tape storage device."
+ ::= { hrDeviceTypes 18 }
+
+ hrDeviceClock OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a clock device."
+ ::= { hrDeviceTypes 19 }
+
+ hrDeviceVolatileMemory OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a volatile memory
+ storage device."
+ ::= { hrDeviceTypes 20 }
+
+ hrDeviceNonVolatileMemory OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The device type identifier used for a non-volatile memory
+
+
+
+Waldbusser & Grillo Standards Track [Page 40]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ storage device."
+ ::= { hrDeviceTypes 21 }
+
+ -- Registrations for some popular File System types,
+ -- for use with hrFSType.
+ hrFSTypes OBJECT IDENTIFIER ::= { hrDevice 9 }
+
+ hrFSOther OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used when no other
+ defined type is appropriate."
+ ::= { hrFSTypes 1 }
+
+ hrFSUnknown OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used when the type of
+ file system is unknown."
+ ::= { hrFSTypes 2 }
+
+ hrFSBerkeleyFFS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ Berkeley Fast File System."
+ ::= { hrFSTypes 3 }
+
+ hrFSSys5FS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ System V File System."
+ ::= { hrFSTypes 4 }
+
+ hrFSFat OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for
+ DOS's FAT file system."
+ ::= { hrFSTypes 5 }
+
+ hrFSHPFS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for OS/2's
+ High Performance File System."
+ ::= { hrFSTypes 6 }
+
+
+
+Waldbusser & Grillo Standards Track [Page 41]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrFSHFS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ Macintosh Hierarchical File System."
+ ::= { hrFSTypes 7 }
+
+ hrFSMFS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ Macintosh File System."
+ ::= { hrFSTypes 8 }
+
+ hrFSNTFS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ Windows NT File System."
+ ::= { hrFSTypes 9 }
+
+ hrFSVNode OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ VNode File System."
+ ::= { hrFSTypes 10 }
+
+ hrFSJournaled OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ Journaled File System."
+ ::= { hrFSTypes 11 }
+
+ hrFSiso9660 OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ ISO 9660 File System for CD's."
+ ::= { hrFSTypes 12 }
+
+ hrFSRockRidge OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ RockRidge File System for CD's."
+ ::= { hrFSTypes 13 }
+
+
+
+Waldbusser & Grillo Standards Track [Page 42]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrFSNFS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ NFS File System."
+ ::= { hrFSTypes 14 }
+
+ hrFSNetware OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ Netware File System."
+ ::= { hrFSTypes 15 }
+
+ hrFSAFS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ Andrew File System."
+ ::= { hrFSTypes 16 }
+
+ hrFSDFS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ OSF DCE Distributed File System."
+ ::= { hrFSTypes 17 }
+
+ hrFSAppleshare OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ AppleShare File System."
+ ::= { hrFSTypes 18 }
+
+ hrFSRFS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ RFS File System."
+ ::= { hrFSTypes 19 }
+
+ hrFSDGCFS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ Data General DGCFS."
+ ::= { hrFSTypes 20 }
+
+
+
+Waldbusser & Grillo Standards Track [Page 43]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ hrFSBFS OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ SVR4 Boot File System."
+ ::= { hrFSTypes 21 }
+
+ hrFSFAT32 OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ Windows FAT32 File System."
+ ::= { hrFSTypes 22 }
+
+ hrFSLinuxExt2 OBJECT-IDENTITY
+ STATUS current
+ DESCRIPTION
+ "The file system type identifier used for the
+ Linux EXT2 File System."
+ ::= { hrFSTypes 23 }
+
+ END
+
+6. Internationalization Considerations
+
+ This MIB has many objects that identify file-system pathnames on the
+ managed host. Many file systems allow pathnames to be encoded in a
+ variety of character sets (other than ASCII), but do not support the
+ encoding of the actual character set used with the pathname. The
+ implementation strategy is that user interfaces (i.e. character-based
+ shells or graphical applications) will have configuration options
+ that control with which character set they will interpret and display
+ all pathnames. This is often a per-user configuration (e.g. an
+ environment variable), so that users using different languages and
+ character sets on a multi-user system may each work effectively with
+ their preferred character set. A human usually controls this
+ configuration. If an application is not configured or is configured
+ incorrectly, it will often have trouble displaying pathnames in the
+ intended character set.
+
+ This situation made it important for this MIB to handle two issues:
+
+ 1) Pathname objects must be able to transfer a variety of character
+ sets with potentially multi-byte encodings; and,
+
+
+
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 44]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ 2) HostMIB agents will generally not be correctly configured for the
+ appropriate character set to be used for all files on the system,
+ particularly on a system with multiple users using different
+ character sets. It was thus impossible to mandate that the agent
+ tag pathnames with the character set in use.
+
+ These issues were solved with the introduction of the
+ InternationalDisplayString textual convention, which supports multi-
+ byte encodings. Network management stations should use a local
+ algorithm to determine which character set is in use and how it
+ should be displayed. It is expected that network management station
+ applications will rely on human configuration to choose which
+ character set in which to interpret InternationalDisplayString
+ objects, much like an application running locally on that host.
+
+7. Security Considerations
+
+ There are a number of management objects defined in this MIB that
+ have a MAX-ACCESS clause of read-write. Such objects may be
+ considered sensitive or vulnerable in some network environments. The
+ support for SET operations in a non-secure environment without proper
+ protection can have a negative effect on system operations.
+
+ There are a number of managed objects in this MIB that may contain
+ sensitive information. The objects in the Running Software Group list
+ information about running software on the system (including the
+ operating system software and version). Some may wish not to
+ disclose to others what software they are running. Further, an
+ inventory of the running software and versions may be helpful to an
+ attacker who hopes to exploit software bugs in certain applications.
+ The same issues exist for the objects in the Installed Software
+ Group.
+
+ It is thus important to control even GET access to these objects and
+ possibly to even encrypt the values of these object when sending them
+ over the network via SNMP. Not all versions of SNMP provide features
+ for such a secure environment.
+
+ SNMPv1 by itself is not a secure environment. Even if the network
+ itself is secure (for example by using IPSec), even then, there is no
+ control as to who on the secure network is allowed to access and
+ GET/SET (read/change/create/delete) the objects in this MIB.
+
+ It is recommended that the implementers consider the security
+ features as provided by the SNMPv3 framework. Specifically, the use
+ of the User-based Security Model RFC 2574 [RFC2574] and the View-
+ based Access Control Model RFC 2575 [RFC2575] is recommended.
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 45]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ It is then a customer/user responsibility to ensure that the SNMP
+ entity giving access to an instance of this MIB, is properly
+ configured to give access to the objects only to those principals
+ (users) that have legitimate rights to indeed GET or SET
+ (change/create/delete) them.
+
+8. References
+
+ [RFC2571] Harrington, D., Presuhn, R. and B. Wijnen, "An
+ Architecture for Describing SNMP Management Frameworks",
+ RFC 2571, April 1999.
+
+ [RFC1155] Rose, M. and K. McCloghrie, "Structure and Identification
+ of Management Information for TCP/IP-based Internets",
+ STD 16, RFC 1155, May 1990.
+
+ [RFC1212] Rose, M. and K. McCloghrie, "Concise MIB Definitions",
+ STD 16, RFC 1212, March 1991.
+
+ [RFC1215] Rose, M., "A Convention for Defining Traps for use with
+ the SNMP", RFC 1215, March 1991.
+
+ [RFC2578] McCloghrie, K., Perkins, D., Schoenwaelder, J., Case, J.,
+ Rose, M. and S. Waldbusser, "Structure of Management
+ Information Version 2 (SMIv2)", STD 58, RFC 2578, April
+ 1999.
+
+ [RFC2579] McCloghrie, K., Perkins, D., Schoenwaelder, J., Case, J.,
+ Rose, M. and S. Waldbusser, "Textual Conventions for
+ SMIv2", STD 58, RFC 2579, April 1999.
+
+ [RFC2580] McCloghrie, K., Perkins, D., Schoenwaelder, J., Case, J.,
+ Rose, M. and S. Waldbusser, "Conformance Statements for
+ SMIv2", STD 58, RFC 2580, April 1999.
+
+ [RFC1157] Case, J., Fedor, M., Schoffstall, M. and J. Davin,
+ "Simple Network Management Protocol", STD 15, RFC 1157,
+ May 1990.
+
+ [RFC1901] Case, J., McCloghrie, K., Rose, M. and S. Waldbusser,
+ "Introduction to Community-based SNMPv2", RFC 1901,
+ January 1996.
+
+ [RFC1906] Case, J., McCloghrie, K., Rose, M. and S. Waldbusser,
+ "Transport Mappings for Version 2 of the Simple Network
+ Management Protocol (SNMPv2)", RFC 1906, January 1996.
+
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 46]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+ [RFC2572] Case, J., Harrington D., Presuhn R. and B. Wijnen,
+ "Message Processing and Dispatching for the Simple
+ Network Management Protocol (SNMP)", RFC 2572, April 1999
+
+ [RFC2574] Blumenthal, U. and B. Wijnen, "User-based Security Model
+ (USM) for version 3 of the Simple Network Management
+ Protocol (SNMPv3)", RFC 2574, April 1999.
+
+ [RFC1905] Case, J., McCloghrie, K., Rose, M. and S. Waldbusser,
+ "Protocol Operations for Version 2 of the Simple Network
+ Management Protocol (SNMPv2)", RFC 1905, January 1996.
+
+ [RFC2573] Levi, D., Meyer, P. and B. Stewart, "SNMPv3
+ Applications", RFC 2573, April 1999.
+
+ [RFC2575] Wijnen, B., Presuhn, R. and K. McCloghrie, "View-based
+ Access Control Model (VACM) for the Simple Network
+ Management Protocol (SNMP)", RFC 2575, April 1999.
+
+ [RFC2570] Case, J., Mundy, R., Partain, D. and B. Stewart,
+ "Introduction to Version 3 of the Internet- standard
+ Network Management Framework", RFC 2570, April 1999.
+
+ [RFC1907] Case, J., McCloghrie, K., Rose, M. and S. Waldbusser,
+ "Management Information Base for Version 2 of the Simple
+ Network Management Protocol (SNMPv2)", RFC 1907, January
+ 1996.
+
+ [RFC2233] McCloghrie, K. and F. Kastenholz, "The Interfaces Group
+ MIB", RFC 2233, November 1997.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 47]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+9. Acknowledgments
+
+ This document was produced by the Host Resources MIB working group.
+
+ Bobby Krupczak's efforts were particularly helpful in the creation of
+ the draft standard version of this document.
+
+ In addition, the authors gratefully acknowledge the comments of the
+ following individuals:
+
+ Amatzia Ben-Artzi NetManage
+ Ron Bergman Hitachi, Inc.
+ Steve Bostock Novell
+ Stephen Bush GE Information Systems
+ Jeff Case SNMP Research
+ Chuck Davin Bellcore
+ Ray Edgarton Bell Atlantic
+ Mike Erlinger Aerospace Corporation
+ Tim Farley Magee Enterprises
+ Mark Kepke Hewlett Packard
+ Bobby Krupczak Empire Technologies, Inc.
+ Cheryl Krupczak Empire Technologies, Inc.
+ Harry Lewis IBM Corp.
+ Keith McCloghrie Cisco Systems
+ Greg Minshall Novell
+ Steve Moulton SNMP Research
+ Dave Perkins Synoptics
+ Ed Reeder Objective Systems Integrators
+ Mike Ritter Apple Computer
+ Marshall Rose Dover Beach Consulting
+ Jon Saperia DEC
+ Rodney Thayer Sable Technology
+ Kaj Tesink Bellcore
+ Dean Throop Data General
+ Bert Wijnen Lucent
+ Lloyd Young Lexmark International
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 48]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+10. Authors' Addresses
+
+ Pete Grillo
+ WeSync.com
+ 1001 SW Fifth Ave, Fifth Floor
+ Portland, OR 97204
+
+ Phone: 503-425-5051
+ Fax: 503-827-6718
+ email: pete@wesync.com
+ Phone: +1 503 827 6717
+
+
+ Steven Waldbusser
+ Lucent Technologies, Inc.
+ 1213 Innsbruck Dr.
+ Sunnyvale CA 94089
+
+ Phone: +1 650 318 1251
+ Fax: +1 650 318 1633
+ EMail: waldbusser@ins.com
+
+11. Intellectual Property
+
+ The IETF takes no position regarding the validity or scope of
+ any intellectual property or other rights that might be
+ claimed to pertain to the implementation or use of the
+ technology described in this document or the extent to which
+ any license under such rights might or might not be available;
+ neither does it represent that it has made any effort to
+ identify any such rights. Information on the IETF's
+ procedures with respect to rights in standards-track and
+ standards-related documentation can be found in BCP-11.
+ Copies of claims of rights made available for publication and
+ any assurances of licenses to be made available, or the result
+ of an attempt made to obtain a general license or permission
+ for the use of such proprietary rights by implementors or
+ users of this specification can be obtained from the IETF
+ Secretariat.
+
+ The IETF invites any interested party to bring to its
+ attention any copyrights, patents or patent applications, or
+ other proprietary rights which may cover technology that may
+ be required to practice this standard. Please address the
+ information to the IETF Executive Director.
+
+
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 49]
+\f
+RFC 2790 Host Resources MIB March 2000
+
+
+12. Full Copyright Statement
+
+ Copyright (C) The Internet Society (2000). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Acknowledgement
+
+ Funding for the RFC Editor function is currently provided by the
+ Internet Society.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Waldbusser & Grillo Standards Track [Page 50]
+\f
/*
- * "$Id: cupstestdsc.c 5320 2006-03-21 19:03:25Z mike $"
+ * "$Id: cupstestdsc.c 5392 2006-04-14 17:50:39Z mike $"
*
* DSC test program for the Common UNIX Printing System (CUPS).
*
*
* Contents:
*
+ * main() - Main entry for test program.
+ * check() - Check a file for conformance.
+ * usage() - Show program usage.
*/
/*
/*
- * 'check()' - Main entry for test program.
+ * 'check()' - Check a file for conformance.
*/
static int /* O - 0 on success, 1 on failure */
int lbrt[4]; /* Bounding box */
char page_label[256]; /* Page label string */
int page_number; /* Page number */
+ int last_page_number; /* Last page number seen */
int level; /* Embedded document level */
int saw_bounding_box, /* %%BoundingBox seen? */
saw_pages, /* %%Pages seen? */
*/
binary = 0;
+ last_page_number = 0;
level = 0;
linenum = 0;
saw_begin_prolog = 0;
{
if (!strncmp(line, "%%Page:", 7))
{
- if (sscanf(line + 7, "%255s%d", page_label, &page_number) != 2)
+ if (sscanf(line + 7, "%255s%d", page_label, &page_number) != 2 ||
+ page_number != (last_page_number + 1) || page_number < 1)
{
if (!status)
_cupsLangPuts(stdout, _("FAIL\n"));
linenum);
}
else
- saw_page = 1;
+ {
+ last_page_number = page_number;
+ saw_page = 1;
+ }
}
else if (!strncmp(line, "%%BeginProlog", 13))
saw_begin_prolog = 1;
/*
- * End of "$Id: cupstestdsc.c 5320 2006-03-21 19:03:25Z mike $".
+ * End of "$Id: cupstestdsc.c 5392 2006-04-14 17:50:39Z mike $".
*/
/*
- * "$Id: cupstestppd.c 5189 2006-02-27 01:45:57Z mike $"
+ * "$Id: cupstestppd.c 5422 2006-04-18 15:16:00Z mike $"
*
* PPD test program for the Common UNIX Printing System (CUPS).
*
if (!strncmp(attr->name, "Default", 7))
{
- if ((option = ppdFindOption(ppd, attr->name + 7)) == NULL)
- _cupsLangPrintf(stdout,
- _(" WARN %s has no corresponding "
- "options!\n"),
- attr->name);
- else if (strcmp(attr->value, "Unknown"))
+ if ((option = ppdFindOption(ppd, attr->name + 7)) != NULL &&
+ strcmp(attr->value, "Unknown"))
{
/*
* Check that the default option value matches a choice...
}
}
+ if (ppdFindAttr(ppd, "1284DeviceId", NULL))
+ {
+ if (verbose >= 0)
+ {
+ if (!errors && !verbose)
+ _cupsLangPuts(stdout, _(" FAIL\n"));
+
+ _cupsLangPuts(stdout,
+ _(" **FAIL** 1284DeviceId must be 1284DeviceID!\n"
+ " REF: Page 72, section 5.5\n"));
+ }
+
+ errors ++;
+ }
+
if (errors)
status = ERROR_CONFORMANCE;
else if (!verbose)
{
check_basics(argv[i]);
- if (option &&
- strcmp(option->keyword, "Duplex") &&
- strcmp(option->keyword, "JCLDuplex"))
+ /*
+ * Look for default keywords with no corresponding option...
+ */
+
+ for (i = 0; i < ppd->num_attrs; i ++)
+ {
+ attr = ppd->attrs[i];
+
+ if (!strcmp(attr->name, "DefaultColorSpace") ||
+ !strcmp(attr->name, "DefaultColorSep") ||
+ !strcmp(attr->name, "DefaultFont") ||
+ !strcmp(attr->name, "DefaultImageableArea") ||
+ !strcmp(attr->name, "DefaultOutputOrder") ||
+ !strcmp(attr->name, "DefaultPaperDimension") ||
+ !strcmp(attr->name, "DefaultScreenProc") ||
+ !strcmp(attr->name, "DefaultTransfer"))
+ continue;
+
+ if (!strncmp(attr->name, "Default", 7) &&
+ !ppdFindOption(ppd, attr->name + 7))
+ _cupsLangPrintf(stdout,
+ _(" WARN %s has no corresponding "
+ "options!\n"),
+ attr->name);
+ }
+
+ /*
+ * Check for old Duplex option names...
+ */
+
+ if ((option = ppdFindOption(ppd, "EFDuplex")) == NULL)
+ option = ppdFindOption(ppd, "KD03Duplex");
+
+ if (option)
{
_cupsLangPrintf(stdout,
_(" WARN Duplex option keyword %s "
/*
- * End of "$Id: cupstestppd.c 5189 2006-02-27 01:45:57Z mike $".
+ * End of "$Id: cupstestppd.c 5422 2006-04-18 15:16:00Z mike $".
*/
</P>
{#device_uri=0?:<P><B>New Printers Found:</B></P><UL>{[device_uri]
-<LI>{device_make_and_model} ({device_info})
-<A HREF="/admin?op=add-printer&{device_options}"><IMG
+<LI><A HREF="/admin?op=add-printer&{device_options}"><IMG
SRC="/images/button-add-this-printer.gif" ALT="Add This Printer" CLASS="button"
-ALIGN="MIDDLE"></A></LI>
+ALIGN="MIDDLE"></A>
+{device_make_and_model} ({device_info})</LI>
}</UL>}
<H2 CLASS="title">Classes</H2>
"\\n" +
"# Restrict access to the admin pages...\\n" +
"<Location /admin>\\n" +
+"@ENCRYPTION_REQUIRED\\n" +
" Order allow,deny\\n" +
" Allow localhost\\n" +
"</Location>\\n" +
</P>
{#device_uri=0?:<P><B>Encontradas nuevas impresoras:</B></P><UL>{[device_uri]
-<LI>{device_make_and_model} ({device_info})
-<A HREF="/admin?op=add-printer&{device_options}"><IMG
-SRC="/images/button-add-this-printer.gif" ALT="Añadir esta impresora" CLASS="button"
-ALIGN="MIDDLE"></A></LI>
+<LI><A HREF="/admin?op=add-printer&{device_options}"><IMG
+SRC="/images/button-add-this-printer.gif" ALT="Añadir esta impresora"
+CLASS="button" ALIGN="MIDDLE"></A>
+{device_make_and_model} ({device_info})</LI>
}</UL>}
<H2 CLASS="title">Clases</H2>
function reset_config()
{
document.cups.CUPSDCONF.value =
-"# Guarda información general en error_log - cambie \\"info\\" por \\"debug\\" para\\n" +
-"# búsqueda de problemas...\\n" +
+"# Log general information in error_log - change \\"info\\" to \\"debug\\" for\\n" +
+"# troubleshooting...\\n" +
"LogLevel info\\n" +
"\\n" +
"\\n" +
-"# Grupo de usuario del Administrador...\\n" +
+"# Administrator user group...\\n" +
"SystemGroup @CUPS_SYSTEM_GROUPS@\\n" +
"\\n" +
"\\n" +
-"# Sólo escucha conexiones que provengan de la máquina local.\\n" +
+"# Only listen for connections from the local machine.\\n" +
"Listen 127.0.0.1:@DEFAULT_IPP_PORT@\\n" +
"@CUPS_LISTEN_DOMAINSOCKET@\\n" +
"\\n" +
"\\n" +
-"# Muestra impresoras compartidas en la red local.\\n" +
+"# Show shared printers on the local network.\\n" +
"Browsing On\\n" +
"BrowseOrder allow,deny\\n" +
"BrowseAllow @LOCAL\\n" +
"\\n" +
"\\n" +
-"# De forma predeterminada, la autentificación se hace contra las cuentas del sistema...\\n" +
+"# Authenticate against system accounts by default...\\n" +
"DefaultAuthType Basic\\n" +
"\\n" +
-"# Limita el acceso al servidor...\\n" +
+"# Restrict access to the server...\\n" +
"<Location />\\n" +
" Order allow,deny\\n" +
" Allow localhost\\n" +
"</Location>\\n" +
"\\n" +
-"# Limita el acceso a las páginas de administración...\\n" +
+"# Restrict access to the admin pages...\\n" +
"<Location /admin>\\n" +
+"@ENCRYPTION_REQUIRED\\n" +
" Order allow,deny\\n" +
" Allow localhost\\n" +
"</Location>\\n" +
"\\n" +
-"# Limita el acceso a los archivos de configuración...\\n" +
+"# Restrict access to configuration files...\\n" +
"<Location /admin/conf>\\n" +
" AuthType Basic\\n" +
" Require user @SYSTEM\\n" +
" Allow localhost\\n" +
"</Location>\\n" +
"\\n" +
-"# Establece la impresora predeterminada/reglas de trabajos...\\n" +
+"# Set the default printer/job policies...\\n" +
"<Policy default>\\n" +
-" # Las operaciones con trabajos las debe hacer el propietario o un administrador...\\n" +
+" # Job-related operations must be done by the owner or an adminstrator...\\n" +
" <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>\\n" +
" Require user @OWNER @SYSTEM\\n" +
" Order deny,allow\\n" +
" </Limit>\\n" +
"\\n" +
-" # Todas las operaciones de administración requieren la autentificación de un administrador...\\n" +
+" # All administration operations require an adminstrator to authenticate...\\n" +
" <Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>\\n" +
" AuthType Basic\\n" +
" Require user @SYSTEM\\n" +
" Order deny,allow\\n" +
" </Limit>\\n" +
"\\n" +
-" # Sólo el propietario o un administrador pueden cancelar autenticar un trabajo...\\n" +
+" # Only the owner or an administrator can cancel or authenticate a job...\\n" +
" <Limit Cancel-Job CUPS-Authenticate-Job>\\n" +
" Require user @OWNER @SYSTEM\\n" +
" Order deny,allow\\n" +
</P>
{#device_uri=0?:<P><B>新しいプリンタが見つかりました:</B></P><UL>{[device_uri]
-<LI>{device_make_and_model} ({device_info})
-<A HREF="/admin?op=add-printer&{device_options}"><IMG
-SRC="/images/button-add-this-printer.gif" ALT="このプリンタを追加" CLASS="button"
-ALIGN="MIDDLE"></A></LI>
+<LI><A HREF="/admin?op=add-printer&{device_options}"><IMG
+SRC="/images/button-add-this-printer.gif" ALT="このプリンタを追加"
+CLASS="button" ALIGN="MIDDLE"></A>
+{device_make_and_model} ({device_info})</LI>
}</UL>}
<H2 CLASS="title">クラス</H2>
--- /dev/null
+<SCRIPT TYPE="text/javascript">
+function reset_config()
+{
+ document.cups.CUPSDCONF.value =
+"# Log general information in error_log - change \\"info\\" to \\"debug\\" for\\n" +
+"# troubleshooting...\\n" +
+"LogLevel info\\n" +
+"\\n" +
+"\\n" +
+"# Administrator user group...\\n" +
+"SystemGroup @CUPS_SYSTEM_GROUPS@\\n" +
+"\\n" +
+"\\n" +
+"# Only listen for connections from the local machine.\\n" +
+"Listen 127.0.0.1:@DEFAULT_IPP_PORT@\\n" +
+"@CUPS_LISTEN_DOMAINSOCKET@\\n" +
+"\\n" +
+"\\n" +
+"# Show shared printers on the local network.\\n" +
+"Browsing On\\n" +
+"BrowseOrder allow,deny\\n" +
+"BrowseAllow @LOCAL\\n" +
+"\\n" +
+"\\n" +
+"# Authenticate against system accounts by default...\\n" +
+"DefaultAuthType Basic\\n" +
+"\\n" +
+"# Restrict access to the server...\\n" +
+"<Location />\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to the admin pages...\\n" +
+"<Location /admin>\\n" +
+"@ENCRYPTION_REQUIRED\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to configuration files...\\n" +
+"<Location /admin/conf>\\n" +
+" AuthType Basic\\n" +
+" Require user @SYSTEM\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Set the default printer/job policies...\\n" +
+"<Policy default>\\n" +
+" # Job-related operations must be done by the owner or an adminstrator...\\n" +
+" <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>\\n" +
+" Require user @OWNER @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" # All administration operations require an adminstrator to authenticate...\\n" +
+" <Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>\\n" +
+" AuthType Basic\\n" +
+" Require user @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" # Only the owner or an administrator can cancel or authenticate a job...\\n" +
+" <Limit Cancel-Job CUPS-Authenticate-Job>\\n" +
+" Require user @OWNER @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" <Limit All>\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"</Policy>\\n";
+}
+</SCRIPT>
+
+<H2 CLASS="title">サーバ設定ファイル</H2>
+
+<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
+
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+
+<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-save-changes.gif"
+ALT="変更を保存"> <A
+HREF="javascript:reset_config();"><IMG
+SRC="/images/button-use-default-config.gif" CLASS="button"
+ALT="デフォルトの設定ファイルを使用"></A></P>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Utwórz Grupę</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nazwa:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Opis:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Składniki:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-add-class.gif" ALT="Dodaj Klasę"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Dodaj Nową Drukarkę</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nazwa:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Może zawierać wszystkie drukowalne znaki oprócz "/", "#", i spacji)</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Położenie zrozumiałe dla ludzi takie jak "Laboratorium 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Opis:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Opis zrozumiały dla ludzi taki jak "HP LaserJet z Dupleksem")</SMALL></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<TABLE CELLPADDING="0" CELLSPACING="0" WIDTH="100%" SUMMARY="Administration Tasks">
+<TR><TD VALIGN="TOP" NOWRAP>
+
+<H2 CLASS="title">Drukarki</H2>
+
+<P>
+<A HREF="/admin?op=add-printer"><IMG
+SRC="/images/button-add-printer.gif" ALT="Dodaj Drukarkę" CLASS="button"></A>
+<A HREF="/printers/"><IMG SRC="/images/button-manage-printers.gif"
+ALT="Manage Printers" CLASS="button"></A>
+{have_samba?<A HREF="/admin/?op=export-samba"><IMG
+SRC="/images/button-export-samba.gif" ALT="Eksportuj do Samby"
+CLASS="button"></A>:}
+</P>
+
+{#device_uri=0?:<P><B>Znaleziono Nową Drukarkę:</B></P><UL>{[device_uri]
+<LI>{device_make_and_model} ({device_info})
+<A HREF="/admin?op=add-printer&{device_options}"><IMG
+SRC="/images/button-add-this-printer.gif" ALT="Dodaj Tę Drukarkę" CLASS="button"
+ALIGN="MIDDLE"></A></LI>
+}</UL>}
+
+<H2 CLASS="title">Grupy</H2>
+
+<P>
+<A HREF="/admin?op=add-class"><IMG SRC="/images/button-add-class.gif"
+ALT="Utwórz Grupę" CLASS="button"></A>
+<A HREF="/classes/"><IMG SRC="/images/button-manage-classes.gif"
+ALT="Zarządzaj Grupami" CLASS="button"></A>
+</P>
+
+<H2 CLASS="title">Wydruki</H2>
+
+<P>
+<A HREF="/jobs/"><IMG SRC="/images/button-manage-jobs.gif" ALT="Zarządzaj Wydrukami" CLASS="button"></A>
+</P>
+
+</TD><TD> </TD><TD VALIGN="TOP">
+
+<H2 CLASS="title">Serwer</H2>
+
+<P>
+<A HREF="/admin?op=config-server"><IMG
+SRC="/images/button-edit-configuration-file.gif" ALT="Edytuj Plik Konfiguracji" CLASS="button"></A>
+<A HREF="/admin/log/access_log" TARGET="_blank"><IMG
+SRC="/images/button-view-access-log.gif" ALT="Pokaż Dziennik Dostępu"
+CLASS="button"></A>
+<A HREF="/admin/log/error_log" TARGET="_blank"><IMG
+SRC="/images/button-view-error-log.gif" ALT="Pokaż Dziennik Błędów"
+CLASS="button"></A>
+<A HREF="/admin/log/page_log" TARGET="_blank"><IMG
+SRC="/images/button-view-page-log.gif" ALT="Pokaż Dziennik Wydruków"
+CLASS="button"></A>
+</P>
+
+{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+<FORM METHOD="POST" ACTION="/admin">
+
+<P><B>Podstawowe Ustawienia Serwera:</B></P>
+
+<P><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_PRINTERS" {?remote_printers}> Pokazuj drukarki udostępnione przez inne systemy<BR>
+<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Udostępniaj upublicznione drukarki podłączone do tego systemu<BR>
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Zezwalaj na zdalną administrację<BR>
+<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Zezwalaj użytkownikom na anulowanie wszystkich wydruków (nie tylko własnych)<BR>
+<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Zachowuj informacje odpluskwiania dla rozwiązania problemów</P>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-change-settings.gif" ALT="Zmień Ustawienia"></P>
+
+</FORM>}
+
+</TD></TR>
+</TABLE>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
+
+<H2 CLASS="title">Komunikacja z urządzeniem {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Interfejs:</TH>
+<TD>
+<SELECT NAME="DEVICE_URI">
+{[device_uri]<OPTION VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}" {?current_device_uri={device_uri}?SELECTED:{current_device_scheme={device_uri}?SELECTED:}}>
+{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}</OPTION>
+}</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+
+<H2 CLASS="title">Producent urządzenia {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Producent:</TH>
+<TD>
+<SELECT NAME="PPD_MAKE" SIZE="10">
+{[ppd_make]<OPTION VALUE="{ppd_make}" {?current_make={ppd_make}?SELECTED:}>{ppd_make}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD> </TD>
+</TR>
+<TR>
+<TH CLASS="label">Lub Zaakceptuj Plik PPD:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Dodaj Drukarkę:Modyfikuj Drukarkę}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+
+<H2 CLASS="title">Typ/Sterownik urządzenia {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Typ:</TH>
+<TD>
+<SELECT NAME="PPD_NAME" SIZE="10">
+{[ppd_name]<OPTION VALUE="{ppd_name}" {?current_make_and_model={ppd_make_and_model}?SELECTED:}>{ppd_make_and_model} ({ppd_natural_language})
+}</SELECT>
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Lub Zaakceptuj Plik PPD:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Dodaj Drukarkę:Modyfikuj Drukarkę}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+
+<H2 CLASS="title">Ustawienia Portu Szeregowego dla Urządzenia {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Szybkość Transmisji:</TH>
+<TD><SELECT NAME="BAUDRATE">
+{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">KontrolaParzystości:</TH>
+<TD><SELECT NAME="PARITY">
+<OPTION VALUE="none" {?parity=none?SELECTED:}>Brak
+<OPTION VALUE="even" {?parity=even?SELECTED:}>Parzystość
+<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Nieparzystość
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Bity Danych:</TH>
+<TD><SELECT NAME="BITS">
+<OPTION {?bits=8?SELECTED:}>8
+<OPTION {?bits=7?SELECTED:}>7
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Kontrola Przepływu:</TH>
+<TD><SELECT NAME="FLOW">
+<OPTION VALUE="none" {?flow=none?SELECTED:}>Brak
+<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Programowa)
+<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Sprzętowa)
+<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Sprzętowa)
+</SELECT></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
+
+<H2 CLASS="title">URI urządzenia {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">URI urządzenia:</TH>
+<TD><INPUT TYPE="TEXT" SIZE="60" MAXLENGTH="1024" NAME="DEVICE_URI" VALUE="{device_uri}"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>Przykłady:
+<PRE>
+ http://hostname:631/ipp/
+ http://hostname:631/ipp/port1
+
+ ipp://hostname/ipp/
+ ipp://hostname/ipp/port1
+
+ lpd://hostname/queue
+
+ socket://hostname
+ socket://hostname:9100
+</PRE>
+
+<P>Zobacz <A HREF="/help/network.html" TARGET="_blank">"Używanie Drukarek Sieciowych"</A> aby określić poprawny URI twojej drukarki.</P>
+
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<P>Grupa <A HREF="/classes/{printer_name}">{printer_name}</A> została pomyślnie dodana.
--- /dev/null
+<P><B>Ostrzeżenie:</B> Czy napewno chcesz usunąć grupę
+{printer_name}?</P>
+
+<P ALIGN="CENTER"><A
+HREF="/admin?op=delete-class&printer_name={printer_name}&confirm=yes"><IMG
+SRC="/images/button-delete-class.gif" ALT="Usuń Grupę"
+CLASS="button"></A></P>
--- /dev/null
+<P>Grupa {printer_name} została pomyślnie usunięta.
--- /dev/null
+<H3 CLASS="title">Wydruki</H3>
--- /dev/null
+<P>Grupa <A HREF="/classes/{printer_name}">{printer_name}</A> została pomyślnie zmodyfikowana.
--- /dev/null
+<P ALIGN="CENTER">{total=0?Brak grup:Wyświetlam {#printer_name} z {total} grup{total=1?y:}}.</P>
--- /dev/null
+{#printer_name=0?:
+{[printer_name]
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>{default_name={printer_name}? (Default Printer):}
+{?printer_state_message=?:<SPAN CLASS="message">"{printer_state_message}"</SPAN>}</H2>
+
+<TABLE WIDTH="100%" CLASS="button" CELLSPACING="0" CELLPADDING="0" SUMMARY="{printer_name}">
+<TR>
+<TD VALIGN=TOP><A HREF="{printer_uri_supported}">
+<IMG SRC="/images/classes.gif" CLASS="button" ALT=""></A></TD>
+<TD VALIGN=TOP><B>Opis:</B> {printer_info}<BR>
+<B>Położenie:</B> {printer_location}<BR>
+<B>Stan Grupy:</B> {printer_state=3?bezczynna:{printer_state=4?drukuje:zatrzymana}},
+{printer_is_accepting_jobs=0?odrzuca wydruki:akceptuje wydruki}, {printer_is_shared=0?nie upubliczniona:upubliczniona}.
+{?member_uris=?:<BR>Składniki: {member_uris}}
+
+<P>
+<A HREF="{printer_uri_supported}?op=print-test-page">
+<IMG SRC="/images/button-print-test-page.gif" ALT="Drukuj Stronę Testową" CLASS="button"></A>
+{printer_state=5?
+<A HREF="{admin_uri}?op=start-class&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-start-class.gif" ALT="Start Grupy" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=stop-class&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-stop-class.gif" ALT="Zatrzymaj Grupę" CLASS="button"></A>
+}
+{printer_is_accepting_jobs=0?
+<A HREF="{admin_uri}?op=accept-jobs&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-accept-jobs.gif" ALT="Akceptuj Wydruki" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=reject-jobs&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Odrzucaj Wydruki" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=purge-jobs&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Skasuj Wszystkie Wydruki" CLASS="button"></A>
+{printer_is_shared=0?
+<A HREF="{admin_uri}?op=set-sharing&printer_name={printer_name}&shared=1&is_class=Y">
+<IMG SRC="/images/button-publish-printer.gif" ALT="Upublicznij Drukarkę" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=set-sharing&printer_name={printer_name}&shared=0&is_class=Y">
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="Nie Upubliczniaj Drukarki" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=modify-class&printer_name={printer_name}">
+<IMG SRC="/images/button-modify-class.gif" ALT="Modyfikuj Grupę" CLASS="button"></A>
+<A HREF="{admin_uri}?op=delete-class&printer_name={printer_name}">
+<IMG SRC="/images/button-delete-class.gif" ALT="Usuń Grupę" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-as-default&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-set-as-default.gif" ALT="Ustaw Jako Domyślną" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-allowed-users&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Ustaw Uprawnienia Użytkowników" CLASS="button"></A>
+</P>
+</TD>
+</TR>
+</TABLE>
+}}
--- /dev/null
+<SCRIPT TYPE="text/javascript">
+function reset_config()
+{
+ document.cups.CUPSDCONF.value =
+"# Log general information in error_log - change \\"info\\" to \\"debug\\" for\\n" +
+"# troubleshooting...\\n" +
+"LogLevel info\\n" +
+"\\n" +
+"\\n" +
+"# Administrator user group...\\n" +
+"SystemGroup @CUPS_SYSTEM_GROUPS@\\n" +
+"\\n" +
+"\\n" +
+"# Only listen for connections from the local machine.\\n" +
+"Listen 127.0.0.1:@DEFAULT_IPP_PORT@\\n" +
+"@CUPS_LISTEN_DOMAINSOCKET@\\n" +
+"\\n" +
+"\\n" +
+"# Show shared printers on the local network.\\n" +
+"Browsing On\\n" +
+"BrowseOrder allow,deny\\n" +
+"BrowseAllow @LOCAL\\n" +
+"\\n" +
+"\\n" +
+"# Authenticate against system accounts by default...\\n" +
+"DefaultAuthType Basic\\n" +
+"\\n" +
+"# Restrict access to the server...\\n" +
+"<Location />\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to the admin pages...\\n" +
+"<Location /admin>\\n" +
+"@ENCRYPTION_REQUIRED\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to configuration files...\\n" +
+"<Location /admin/conf>\\n" +
+" AuthType Basic\\n" +
+" Require user @SYSTEM\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Set the default printer/job policies...\\n" +
+"<Policy default>\\n" +
+" # Job-related operations must be done by the owner or an adminstrator...\\n" +
+" <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>\\n" +
+" Require user @OWNER @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" # All administration operations require an adminstrator to authenticate...\\n" +
+" <Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>\\n" +
+" AuthType Basic\\n" +
+" Require user @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" # Only the owner or an administrator can cancel or authenticate a job...\\n" +
+" <Limit Cancel-Job CUPS-Authenticate-Job>\\n" +
+" Require user @OWNER @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" <Limit All>\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"</Policy>\\n";
+}
+</SCRIPT>
+
+<H2 CLASS="title">Plik Konfiguracji Serwera</H2>
+
+<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
+
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+
+<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-save-changes.gif"
+ALT="Zachowaj Zmiany"> <A
+HREF="javascript:reset_config();"><IMG
+SRC="/images/button-use-default-config.gif" CLASS="button"
+ALT="Użyj Domyślnego Pliku Konfiguracji"></A></P>
+
+</FORM>
--- /dev/null
+<P>Błąd:</P>
+
+<BLOCKQUOTE>Nieznana operacja "{op}"!</BLOCKQUOTE>
--- /dev/null
+<P>{?message?{message}:Błąd:}</P>
+
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+ <TITLE>{title} - CUPS @CUPS_VERSION@@CUPS_REVISION@</TITLE>
+ <!-- Prevent caching of CGI content -->
+ <META HTTP-EQUIV="Expires" CONTENT="now">
+ <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+ {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
+ <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
+ <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+<TABLE WIDTH="100%" STYLE="height: 100%;" BORDER="0" CELLSPACING="0" CELLPADDING="0" SUMMARY="{title}">
+<TR CLASS="HEADER">
+<TD VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG SRC="/images/top-left.gif" WIDTH="15" HEIGHT="80" ALT=""></TD>
+<TD VALIGN="TOP" WIDTH="55" ROWSPAN="2"><IMG SRC="/images/top-middle.gif" WIDTH="55" HEIGHT="80" ALT=""></TD>
+<TD WIDTH="100%" HEIGHT="60"><H1>{title}</H1></TD>
+<TD ALIGN="RIGHT" VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG
+SRC="/images/top-right.gif" WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+<TR CLASS="HEADER"><TD WIDTH="100%" VALIGN="BOTTOM" NOWRAP>
+
+<A CLASS="unsel" HREF="/"><IMG SRC="/images/tab-left.gif"
+WIDTH="4" HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Strona Główna <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="{SECTION=admin?:un}sel" HREF="/admin"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""> Administracja <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="{SECTION=classes?:un}sel" HREF="/classes/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""> Grupy <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="{SECTION=help?:un}sel" HREF="/help/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""> Dokumentacja/Pomoc <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="{SECTION=jobs?:un}sel" HREF="/jobs/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""> Wydruki <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="{SECTION=printers?:un}sel" HREF="/printers/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""> Drukarki <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+</TD></TR>
+<TR CLASS="page">
+<TD WIDTH="15"> </TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="height: 100%;" VALIGN="TOP" CLASS="page">
--- /dev/null
+<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
+{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
+
+<P ALIGN="CENTER"><B>Przeszukaj
+{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Wszystkie Dokumenty}}:</B> <INPUT
+TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Szukaj">
+<A HREF="/help/{?HELPFILE}{QUERY?{TOPIC??TOPIC={TOPIC}:}:}"><IMG
+SRC="/images/button-clear.gif" ALT="Wyczyść" CLASS="button"></A></P>
+
+</FORM>
+
+<!-- Bookmarks -->
+<DIV CLASS="sidebar">
+<H3 CLASS="title">Dokumenty Pomocy On-Line</H3>
+
+<P CLASS="l0"><A HREF="/help{QUERY??QUERY={QUERY}:}">Wszystkie Dokumenty</A></P>
+<HR>
+
+{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
+}
+</DIV>
+
+{QUERY?<P>Rezultaty przeszukiwania - {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Wszystkie Dokumenty}}\:</P>
+{QTEXT?<UL>
+{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (w <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
+{QTEXT?</UL>:}
+:<P>Nie znaleziono.</P>}
+<HR NOSHADE>:}
+{HELPTITLE?<H1>{HELPTITLE}
+<A HREF="/help/{HELPFILE}?PRINTABLE=YES" TARGET="_blank"><IMG
+SRC="/images/button-view-printable-version.gif" ALT="Pokaż wersję do Wydruku"
+CLASS="button"></A></H1>:<H1>Strony Pomocy CUPS</H1>
+
+<P>To jest interfejs pomocy on-line CUPS. Wprowadź poszukiwane słowa powyżej lub klikaj na odnośniki aby wyświetlić dokumenty pomocy on-line.</P>
+
+<P>Jeśli dopiero zaczynasz pracę z CUPS, przeczytaj stronę "<a
+href="overview.html">Przegląd Możliwości CUPS</a>". Doświadczeni użytkownicy powinni przeczytać stronę "<a href="whatsnew.html">Co Nowego w CUPS 1.2</a>".</P>
+
+<P>Strona domowa <A HREF="http://www.cups.org/">CUPS Home Page</A> także zawiera wiele informacji, w tym forum dyskusyjne użytkowników, odpowiedzi na często-zadawane pytania oraz formularze do zgłaszania raportów o błędach i prośby o nowe funkcjonalności.</P>}
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+ <TITLE>{HELPTITLE}</TITLE>
+ <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups-printable.css">
+ <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+
+<H1>{HELPTITLE}</H1>
--- /dev/null
+<P><A HREF="{job_printer_uri}">Wydruk {job_id}</A> został anulowany.
--- /dev/null
+<P><A HREF="{job_printer_uri}">Wydruk {job_id}</A> został wstrzymany.
--- /dev/null
+<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
+
+<H2 CLASS="title">{job_id?Przenieś Wydruk {job_id}:Przenieś Wszystkie Wydruki}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Miejsce przeznaczenia:</TH>
+<TD>
+<SELECT NAME="JOB_PRINTER_URI" SIZE="10">
+{[job_printer_uri]<OPTION VALUE="{job_printer_uri}">{job_printer_name}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-move-job{job_id?:s}.gif" ALT="{job_id?Przenieś Wydruk:Przenieś Wszystkie Wydruki}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<P>{job_id?Wydruk <A HREF="/jobs/{job_id}">{job_id}</A> przeniesiony :Wydruki przeniesione} do
+<A HREF="{job_printer_uri}">{job_printer_name}</A>.</P>
--- /dev/null
+<P>Wydruk <A HREF="{job_printer_uri}">{job_id}</A> został wznowiony.
--- /dev/null
+<P><A HREF="{job_printer_uri}">Wydruk {job_id}</A> został powtórzony.
--- /dev/null
+<P>{?which_jobs=?<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Pokaż Zakończone Wydruki"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Pokaż Wszystkie Wydruki">:{which_jobs=all?<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Pokaż Zakończone Wydruki"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Pokaż Aktywne Wydruki">:<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Pokaż Aktywne Wydruki"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Pokaż Aktywne Wydruki">}}</A></P>
+
+<P ALIGN="CENTER">{total=0?Brak wydruków:Wyświetlam {#job_id} z {total} {?which_jobs=?aktywny{total=1?:ch}:{which_jobs=all?:zakończony{total=1?:ch}}} wydruk{total=1?:ów}}.</P>
--- /dev/null
+{#job_id=0?:
+<TABLE CELLPADDING="0" CELLSPACING="0" CLASS="button" WIDTH="100%" SUMMARY="Job List">
+<TR CLASS="data">
+<TH>ID </TH>
+<TH>Name </TH>
+<TH>User </TH>
+<TH>Size </TH>
+<TH>Pages </TH>
+<TH>State </TH>
+<TH>Control </TH>
+</TR>
+
+{[job_id]
+<TR CLASS="data" VALIGN="TOP">
+<TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id} </TD>
+<TD>{?job_name=?Nieznana:{job_name}} </TD>
+<TD>{job_originating_user_name} </TD>
+<TD>{job_k_octets}k </TD>
+<TD>{job_media_sheets_completed=0?brak danych:{?job_media_sheets_completed}}</TD>
+<TD>{job_state=3?oczekuje od<BR>{time_at_creation}:{job_state=4?wstrzymany od<BR>{time_at_creation}:
+{job_state=5?drukowany od<BR>{time_at_processing}:{job_state=6?zatrzymany<BR>{time_at_completed}:
+{job_state=7?anulowany<BR>{time_at_completed}:{job_state=8?przerwany:zakończony<BR>{time_at_completed}}}}}}} </TD>
+<TD>
+{job_preserved>0?
+<A HREF="/jobs/?op=restart-job&job_id={job_id}&job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-restart-job.gif" ALT="Wydrukuj Ponownie" CLASS="button"></A>:}
+{job_state=4?
+<A HREF="/jobs/?op=release-job&job_id={job_id}&job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-release-job.gif" ALT="Wznów Wydruk" CLASS="button"></A>:}
+{job_state=3?
+<A HREF="/jobs/?op=hold-job&job_id={job_id}&job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-hold-job.gif" ALT="Wstrzymaj Wydruk" CLASS="button"></A>:}
+{job_state<7?
+<A HREF="/jobs/?op=cancel-job&job_id={job_id}&job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-cancel-job.gif" ALT="Anuluj Wydruk" CLASS="button"></A>
+<A HREF="/jobs/?op=move-job&job_id={job_id}"><IMG
+SRC="/images/button-move-job.gif" ALT="Przenieś Wydruk" CLASS="button"></A>:}
+ </TD>
+</TR>
+}
+</TABLE>
+}
--- /dev/null
+<P>Komendy administracyjne wysłane; ID wydruku to <A HREF="/printers/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Modyfikuj Grupę {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nazwa:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+{printer_name}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Opis:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Składniki:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-modify-class.gif" ALT="Modyfikuj Grupę"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{?device_uri=?:<INPUT TYPE="HIDDEN" NAME="CURRENT_DEVICE_URI" VALUE="{device_uri}">}
+{?printer_make_and_model=?:<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{printer_make_and_model}">}
+
+<H2 CLASS="title">Modyfikuj Drukarkę {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nazwa:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Położenie:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Położenie zrozumiałe dla ludzi takie jak "Laboratorium 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Description:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Opis zrozumiały dla ludzi taki jak "HP LaserJet z Dupleksem")</SMALL></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Dalej"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD>
+{[choices]<INPUT TYPE="RADIO" NAME="{keyword}" {choices={defchoice}?CHECKED:} VALUE="{choices}">{text}}
+</TD>
+</TR>
--- /dev/null
+<P><B>Error:</B> Poniższe opcje powodują konflikt:</P>
+
+<UL>
+{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A></LI>
+}</UL>
+
+<P>Proszę zmienić jedną lub więcej z tych opcji aby rozwiązać konflikty.</P>
--- /dev/null
+<H2 CLASS="title">{printer_name}: {group}</H2>
+
+<TABLE>
--- /dev/null
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}" MULTIPLE SIZE="10">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT></TD>
+</TR>
--- /dev/null
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT></TD>
+</TR>
--- /dev/null
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-set-printer-options.gif" ALT="Ustaw Opcje Drukarki"></TD>
+</TR>
+</TABLE>
--- /dev/null
+<TABLE WIDTH="100%" CLASS="pager" SUMMARY="Paging Bar">
+<TR>
+ <TD WIDTH="33%">{PREVURL?<A HREF="{PREVURL}"><IMG SRC="/images/button-show-previous.gif" ALT="Pokaż Poprzedni" CLASS="button"></A>: }</TD>
+ <TD WIDTH="34%" ALIGN="CENTER">{ORDER=dec?<A HREF="{THISURL}&ORDER=asc"><IMG SRC="/images/button-sort-ascending.gif" ALT="Sortuj Rosnąco" CLASS="button"></A>:<A HREF="{THISURL}&ORDER=dec"><IMG SRC="/images/button-sort-descending.gif" ALT="Sortuj Malejąco" CLASS="button"></A>}</TD>
+ <TD WIDTH="33%" ALIGN="RIGHT">{NEXTURL?<A HREF="{NEXTURL}"><IMG SRC="/images/button-show-next.gif" ALT="Pokaż Następny" CLASS="button"></A>: }</TD>
+</TR>
+</TABLE>
--- /dev/null
+<P>{is_class?Grupa:Drukarka} <A
+HREF="/{is_class?Grupa:Drukarka}/{printer_name}">{printer_name}</A>
+przyjmuje wydruki.</P>
--- /dev/null
+<P>Drukarka <A HREF="/printers/{printer_name}">{printer_name}</A> została pomyślnie dodana.
--- /dev/null
+<P>Drukarka <A HREF="/printers/{printer_name}">{printer_name}</A> została pomyślnie skonfigurowana.
--- /dev/null
+<P><B>Ostrzeżenie:</B> Czy napewno chcesz usunąć drukarkę
+{printer_name}?</P>
+
+<P ALIGN="CENTER"><A
+HREF="/admin?op=delete-printer&printer_name={printer_name}&confirm=yes"><IMG
+SRC="/images/button-delete-printer.gif" ALT="Usuń Drukarkę"
+CLASS="button"></A></P>
--- /dev/null
+<P>{is_class?Grupa:Drukarka} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+została ustawiona jako domyślna na tym serwerze.</P>
+
+<BLOCKQUOTE><B>Uwaga:</B> Domyślne ustawienia każdego użytkownika, które zostały określone przez polecenie <TT>lpoptions</TT> zignorują te ustawiena domyślne.</BLOCKQUOTE>
--- /dev/null
+<P>Drukarka {printer_name} została pomyślnie usunięta.
--- /dev/null
+<H3 CLASS="title">Wydruki</H3>
--- /dev/null
+<P>Drukarka <A HREF="/printers/{printer_name}">{printer_name}</A> została pomyślnie zmodyfikowana.
--- /dev/null
+<P>Wszystkie wydruki z {is_class?Grupy:Drukarki} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+zostały skasowane.</P>
--- /dev/null
+<P>{is_class?Grupa:Drukarka} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+odrzuca wydruki.</P>
--- /dev/null
+<P>{is_class?Grupa:Drukarka} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+została uruchomiona.</P>
--- /dev/null
+<P>{is_class?Grupa:Drukarka} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+została zatrzymana.</P>
--- /dev/null
+<P ALIGN="CENTER">{total=0?Brak drukarek:Wyświetlam {#printer_name} z {total}{total=1?drukarkę:drukarek}}.</P>
--- /dev/null
+{printer_type?:}{#printer_name=0?:
+{[printer_name]
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>{default_name={printer_name}? (Drukarka Domyślna):}
+{?printer_state_message=?:<SPAN CLASS="message">"{printer_state_message}"</SPAN>}</H2>
+
+<TABLE WIDTH="100%" CLASS="button" CELLSPACING="0" CELLPADDING="0" SUMMARY="{printer_name}">
+<TR>
+<TD VALIGN="TOP"><A HREF="{printer_uri_supported}">
+<IMG SRC="/images/printer-{printer_state=3?bezczynna:{printer_state=4?drukuje:zatrzymana}}.gif" CLASS="button" ALT=""></A>
+</TD>
+<TD VALIGN="TOP"><B>Opis:</B> {printer_info}<BR>
+<B>Położenie:</B> {printer_location}<BR>
+<B>Producent i Typ:</B> {printer_make_and_model}<BR>
+<B>Stan Drukarki:</B> {printer_state=3?bezczynna:{printer_state=4?drukuje:zatrzymana}},
+{printer_is_accepting_jobs=0?odrzuca wydruki:akceptuje wydruki}, {printer_is_shared=0?nie:} upubliczniona.
+{?device_uri=?:<BR><B>URI Urządzenia:</B> {device_uri}}
+
+<P>
+<A HREF="{printer_uri_supported}?op=print-test-page">
+<IMG SRC="/images/button-print-test-page.gif" ALT="Drukuj Stronę Testową" CLASS="button"></A>
+{?cupscommand=1?<A HREF="{printer_uri_supported}?op=clean-print-heads">
+<IMG SRC="/images/button-clean-print-heads.gif" ALT="Wyczyść Głowice Drukujące" CLASS="button"></A>
+<A HREF="{printer_uri_supported}?op=print-self-test-page">
+<IMG SRC="/images/button-print-self-test-page.gif" ALT="Drukuj Auto-Test Drukarki" CLASS="button"></A>:}
+{printer_state=5?
+<A HREF="{admin_uri}?op=start-printer&printer_name={printer_name}">
+<IMG SRC="/images/button-start-printer.gif" ALT="Start Drukarki" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=stop-printer&printer_name={printer_name}">
+<IMG SRC="/images/button-stop-printer.gif" ALT="Zatrzymaj Drukarkę" CLASS="button"></A>
+}
+{printer_is_accepting_jobs=0?
+<A HREF="{admin_uri}?op=accept-jobs&printer_name={printer_name}">
+<IMG SRC="/images/button-accept-jobs.gif" ALT="Akceptuj Wydruki" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=reject-jobs&printer_name={printer_name}">
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Odrzucaj Wydruki" CLASS="button"></A>
+}
+<A HREF="{printer_uri_supported}?op=move-jobs&printer_name={printer_name}">
+<IMG SRC="/images/button-move-jobs.gif" ALT="Przenieś Wszystkie Wydruki" CLASS="button"></A>
+<A HREF="{admin_uri}?op=purge-jobs&printer_name={printer_name}">
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Skasuj Wszystkie Wydruki" CLASS="button"></A>
+{printer_is_shared=0?
+<A HREF="{admin_uri}?op=set-sharing&printer_name={printer_name}&shared=1">
+<IMG SRC="/images/button-publish-printer.gif" ALT="Upublicznij Drukarkę" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=set-sharing&printer_name={printer_name}&shared=0">
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="Nie Upubliczniaj Drukarki" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=modify-printer&printer_name={printer_name}">
+<IMG SRC="/images/button-modify-printer.gif" ALT="Modyfikuj Drukarkę" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-printer-options&printer_name={printer_name}">
+<IMG SRC="/images/button-set-printer-options.gif" ALT="Ustaw Opcje Drukarki" CLASS="button"></A>
+<A HREF="{admin_uri}?op=delete-printer&printer_name={printer_name}">
+<IMG SRC="/images/button-delete-printer.gif" ALT="Usuń Drukarkę" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-as-default&printer_name={printer_name}">
+<IMG SRC="/images/button-set-as-default.gif" ALT="Ustaw jako Domyślną" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-allowed-users&printer_name={printer_name}">
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Ustaw Uprawnienia Użytkowników" CLASS="button"></A>
+</P>
+</TD>
+</TR>
+</TABLE>
+}}
--- /dev/null
+<p>Proszę czekać - ponowne uruchomienie serwera wydruków...</p>
--- /dev/null
+<SCRIPT TYPE="text/javascript"><!--
+function select_printers() {
+ var list = document.export_samba.EXPORT_NAME;
+ var sel = document.export_samba.EXPORT_ALL.checked;
+
+ for (i = 0; i < list.length; i ++) {
+ list.options[i].selected = sel;
+ }
+}
+--></SCRIPT>
+
+<FORM METHOD="POST" ACTION="/admin/" NAME="export_samba">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
+
+<H2 CLASS="title">Eksportuj do Samby</H2>
+
+{error?<P>Nie można wyeksportować do Samby\:</P>
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
+<P>Przeanalizuj <A HREF="/admin/log/error_log"
+TARGET="_blank">dziennik błędów</A> aby uzyskać więcej informacji.</P>:
+<P>Ta strona umożliwia eksport twoich drukarek do Samby aby klienci Windows mieli do nich dostęp poprzez ikony <VAR>Otoczenia Sieciowego</VAR> lub <VAR>Moje Miejsca Sieciowe</VAR> na swoich komputerach. Musisz uprzednio zainstalować sterownik PostScript dla Windows zgodnie z opisem w pliku pomocy polecenia <A HREF="/help/man-cupsaddsmb.html" TARGET="_blank">cupsaddsmb(8)</A>.</P>}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Printers:</TH>
+<TD>
+<SELECT NAME="EXPORT_NAME" SIZE="10" MULTIPLE>
+{[printer_name]<OPTION VALUE="{printer_name}"{export_all? SELECTED:{printer_export? SELECTED:}}>{printer_name}}
+</SELECT><BR>
+<INPUT TYPE="CHECKBOX" NAME="EXPORT_ALL"{export_all? CHECKED:}
+onChange="select_printers()"> Export All Printers
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Samba Username:</TH>
+<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (required)</TD>
+</TR>
+<TR>
+<TH CLASS="label">Samba Password:</TH>
+<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (required)</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-export-samba.gif"
+ALT="Export Printers to Samba"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<P>Eksport do Samby zakończył się powodzeniem.</P>
--- /dev/null
+<FORM ACTION="/{SECTION}/{?SEARCH_DEST}" METHOD="GET">
+{WHICH_JOBS?<INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{WHICH_JOBS}">:}
+{ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
+
+<P ALIGN="CENTER"><B>Przeszukaj
+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Grupy:{SECTION=jobs?Wydruki:Drukarki}}}:</B>
+<INPUT TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Szukaj">
+<A
+HREF="/{SECTION}/{?SEARCH_DEST}{WHICH_JOBS??WHICH_JOBS={WHICH_JOBS}{ORDER?&ORDER={ORDER}:}:{ORDER??ORDER={ORDER}:}}"><IMG
+SRC="/images/button-clear.gif" ALT="Wyczyść" CLASS="button"></A></P>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
--- /dev/null
+<P>Strona testowa wysłana na drukarkę; ID wydruku to <A HREF="/{SECTION}/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
--- /dev/null
+</TD>
+<TD WIDTH="15"> </TD>
+</TR>
+<TR CLASS="trailer">
+<TD VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-left.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="padding: 5;">
+
+<P><SMALL>The Common UNIX Printing System, CUPS, and the CUPS logo are the
+trademark property of <A HREF="http://www.easysw.com">Easy Software
+Products</A>. CUPS is copyright 1997-2006 by Easy Software Products,
+All Rights Reserved.</SMALL></P>
+
+</TD>
+
+<TD ALIGN="RIGHT" VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-right.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+</TABLE>
+</BODY>
+</HTML>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+{IS_CLASS?<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="{IS_CLASS}">:}
+
+<H2 CLASS="title">Użytkownicy Uprawnieni do {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Użytkownicy:</TH>
+<TD>
+<INPUT TYPE='TEXT' NAME='users' SIZE='60' VALUE='{?requesting_user_name_allowed}{?requesting_user_name_denied}'>
+<BR>
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-allowed' {requesting_user_name_allowed?checked:}>Zezwalaj tym użytkownikom na drukowanie
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Zabraniaj tym użytkownikom na drukowania
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>
+<INPUT TYPE="IMAGE" SRC="/images/button-set-allowed-users.gif" ALT="Ustaw Uprawnienia Użytkowników">
+</TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Lägg till klass</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Namn:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Plats:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Beskrivning:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Medlemmar:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-add-class.gif" ALT="Lägg till klass"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Lägg till ny skrivare</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Namn:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_NAME" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Får innehålla utskrivbara tecken förutom "/", "#", och blanksteg)</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Plats:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Läsbar plats såsom "Lab 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Beskrivning:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Läsbar beskrivning såsom "HP LaserJet")</SMALL></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<TABLE CELLPADDING="0" CELLSPACING="0" WIDTH="100%" SUMMARY="Administration Tasks">
+<TR><TD VALIGN="TOP" NOWRAP>
+
+<H2 CLASS="title">Skrivare</H2>
+
+<P>
+<A HREF="/admin?op=add-printer"><IMG
+SRC="/images/button-add-printer.gif" ALT="Lägg till skrivare" CLASS="button"></A>
+<A HREF="/printers/"><IMG SRC="/images/button-manage-printers.gif"
+ALT="Hantera skrivare" CLASS="button"></A>
+{have_samba?<A HREF="/admin/?op=export-samba"><IMG
+SRC="/images/button-export-samba.gif" ALT="Exportera skrivare till Samba"
+CLASS="button"></A>:}
+</P>
+
+{#device_uri=0?:<P><B>Nya skrivare hittade:</B></P><UL>{[device_uri]
+<LI><A HREF="/admin?op=add-printer&{device_options}"><IMG
+SRC="/images/button-add-this-printer.gif" ALT="Lägg till denna skrivare"
+CLASS="button" ALIGN="MIDDLE"></A>
+{device_make_and_model} ({device_info})</LI>
+}</UL>}
+
+<H2 CLASS="title">Klasser</H2>
+
+<P>
+<A HREF="/admin?op=add-class"><IMG SRC="/images/button-add-class.gif"
+ALT="Lägg till klass" CLASS="button"></A>
+<A HREF="/classes/"><IMG SRC="/images/button-manage-classes.gif"
+ALT="Hantera klasser" CLASS="button"></A>
+</P>
+
+<H2 CLASS="title">Jobb</H2>
+
+<P>
+<A HREF="/jobs/"><IMG SRC="/images/button-manage-jobs.gif" ALT="Hantera jobb"
+ CLASS="button"></A>
+</P>
+
+</TD><TD> </TD><TD VALIGN="TOP">
+
+<H2 CLASS="title">Server</H2>
+
+<P>
+<A HREF="/admin?op=config-server"><IMG
+SRC="/images/button-edit-configuration-file.gif" ALT="Redigera konfigurationsfil"
+ CLASS="button"></A>
+<A HREF="/admin/log/access_log" TARGET="_blank"><IMG
+SRC="/images/button-view-access-log.gif" ALT="Visa åtkomstlogg"
+CLASS="button"></A>
+<A HREF="/admin/log/error_log" TARGET="_blank"><IMG
+SRC="/images/button-view-error-log.gif" ALT="Visa fellogg"
+CLASS="button"></A>
+<A HREF="/admin/log/page_log" TARGET="_blank"><IMG
+SRC="/images/button-view-page-log.gif" ALT="Visa sidlogg"
+CLASS="button"></A>
+</P>
+
+{SETTINGS_ERROR?<P>{SETTINGS_MESSAGE}</P>
+<BLOCKQUOTE>{SETTINGS_ERROR}</BLOCKQUOTE>:
+
+<FORM METHOD="POST" ACTION="/admin">
+
+<P><B>Grundläggande serverinställningar:</B></P>
+
+<P><INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_PRINTERS" {?remote_printers}> Visa skrivare utdelade av andra system<BR>
+<INPUT TYPE="CHECKBOX" NAME="SHARE_PRINTERS" {?share_printers}> Dela ut publicerade skrivare anslutna till detta system<BR>
+<INPUT TYPE="CHECKBOX" NAME="REMOTE_ADMIN" {?remote_admin}> Tillåt fjärradministration<BR>
+<INPUT TYPE="CHECKBOX" NAME="USER_CANCEL_ANY" {?user_cancel_any}> Tillåt användare att avbryta alla jobb (inte bara sina egna)<BR>
+<INPUT TYPE="CHECKBOX" NAME="DEBUG_LOGGING" {?debug_logging}> Spara felsökningsinformation för problemlösning</P>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-change-settings.gif" ALT="Ändra inställningar"></P>
+
+</FORM>}
+
+</TD></TR>
+</TABLE>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
+
+<H2 CLASS="title">Enhet för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Enhet:</TH>
+<TD>
+<SELECT NAME="DEVICE_URI">
+{[device_uri]<OPTION VALUE="{device_uri}{?device_make_and_model!Unknown?|{device_make_and_model}:}" {?current_device_uri={device_uri}?SELECTED:{current_device_scheme={device_uri}?SELECTED:}}>
+{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}</OPTION>
+}</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+
+<H2 CLASS="title">Märke/Tillverkare för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Tillverkare:</TH>
+<TD>
+<SELECT NAME="PPD_MAKE" SIZE="10">
+{[ppd_make]<OPTION VALUE="{ppd_make}" {?current_make={ppd_make}?SELECTED:}>{ppd_make}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD> </TD>
+</TR>
+<TR>
+<TH CLASS="label">Eller tillhandahåll en PPD-fil:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Lägg till skrivare:Modifiera skrivare}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin" ENCTYPE="multipart/form-data">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+<INPUT TYPE="HIDDEN" NAME="BAUDRATE" VALUE="{?baudrate}">
+<INPUT TYPE="HIDDEN" NAME="BITS" VALUE="{?bits}">
+<INPUT TYPE="HIDDEN" NAME="PARITY" VALUE="{?parity}">
+<INPUT TYPE="HIDDEN" NAME="FLOW" VALUE="{?flow}">
+
+<H2 CLASS="title">Modell/Drivrutin för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Modell:</TH>
+<TD>
+<SELECT NAME="PPD_NAME" SIZE="10">
+{[ppd_name]<OPTION VALUE="{ppd_name}" {?current_make_and_model={ppd_make_and_model}?SELECTED:}>{ppd_make_and_model} ({ppd_natural_language})
+}</SELECT>
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Eller tillhandahåll en PPD-fil:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="262144"><INPUT
+TYPE="FILE" NAME="PPD_FILE"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-{op}.gif" ALT="{op=add-printer?Lägg till skrivare:Modifiera skrivare}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="DEVICE_URI" VALUE="{device_uri}">
+
+<H2 CLASS="title">Serieportsinställningar för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Baudhastighet:</TH>
+<TD><SELECT NAME="BAUDRATE">
+{[baudrates]<OPTION {?baudrate={baudrates}?SELECTED:}>{baudrates}}
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Paritet:</TH>
+<TD><SELECT NAME="PARITY">
+<OPTION VALUE="none" {?parity=none?SELECTED:}>Ingen
+<OPTION VALUE="even" {?parity=even?SELECTED:}>Jämn
+<OPTION VALUE="odd" {?parity=odd?SELECTED:}>Udda
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Databitar:</TH>
+<TD><SELECT NAME="BITS">
+<OPTION {?bits=8?SELECTED:}>8
+<OPTION {?bits=7?SELECTED:}>7
+</SELECT></TD>
+</TR>
+<TR>
+<TH CLASS="label">Flödeskontroll:</TH>
+<TD><SELECT NAME="FLOW">
+<OPTION VALUE="none" {?flow=none?SELECTED:}>Ingen
+<OPTION VALUE="soft" {?flow=soft?SELECTED:}>XON/XOFF (Programvara)
+<OPTION VALUE="hard" {?flow=hard?SELECTED:}>RTS/CTS (Maskinvara)
+<OPTION VALUE="dtrdsr" {?flow=dtrdsr?SELECTED:}>DTR/DSR (Maskinvara)
+</SELECT></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_LOCATION" VALUE="{?printer_location}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_INFO" VALUE="{?printer_info}">
+<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{?current_make_and_model}">
+
+<H2 CLASS="title">Enhets-URI för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Enhets-URI:</TH>
+<TD><INPUT TYPE="TEXT" SIZE="60" MAXLENGTH="1024" NAME="DEVICE_URI" VALUE="{device_uri}"></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>Exempel:
+<PRE>
+ http://värdnamn:631/ipp/
+ http://värdnamn:631/ipp/port1
+
+ ipp://värdnamn/ipp/
+ ipp://värdnamn/ipp/port1
+
+ lpd://värdnamn/kö
+
+ socket://värdnamn
+ socket://värdnamn:9100
+</PRE>
+
+<P>Se <A HREF="/help/network.html" TARGET="_blank">"Nätverksskrivare"
+</A> för den korrekta URI:n att använda för din skrivare.</P>
+
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<P>Klassen <A HREF="/classes/{printer_name}">{printer_name}</A> har lagts till.
--- /dev/null
+<P><B>Varning:</B> Är du säker på att du vill ta bort klassen
+{printer_name}?</P>
+
+<P ALIGN="CENTER"><A
+HREF="/admin?op=delete-class&printer_name={printer_name}&confirm=yes"><IMG
+SRC="/images/button-delete-class.gif" ALT="Ta bort klass"
+CLASS="button"></A></P>
--- /dev/null
+<P>Klassen {printer_name} har tagits bort.
--- /dev/null
+<H3 CLASS="title">Jobb</H3>
--- /dev/null
+<P>Klassen <A HREF="/classes/{printer_name}">{printer_name}</A> har
+modifierats.
--- /dev/null
+<P ALIGN="CENTER">{total=0?Inga klasser:Visar {#printer_name} av {total} klass{total=1?:er}}.</P>
--- /dev/null
+{#printer_name=0?:
+{[printer_name]
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>{default_name={printer_name}? (Standardskrivare):}
+{?printer_state_message=?:<SPAN CLASS="message">"{printer_state_message}"</SPAN>}</H2>
+
+<TABLE WIDTH="100%" CLASS="button" CELLSPACING="0" CELLPADDING="0" SUMMARY="{printer_name}">
+<TR>
+<TD VALIGN=TOP><A HREF="{printer_uri_supported}">
+<IMG SRC="/images/classes.gif" CLASS="button" ALT=""></A></TD>
+<TD VALIGN=TOP><B>Beskrivning:</B> {printer_info}<BR>
+<B>Plats:</B> {printer_location}<BR>
+<B>Klasstillstånd:</B> {printer_state=3?overksam:{printer_state=4?behandlar:stoppad}},
+{printer_is_accepting_jobs=0?vägrar jobb:accepterar jobb}, {printer_is_shared=0?inte:} publicerad.
+{?member_uris=?:<BR>Medlemmar: {member_uris}}
+
+<P>
+<A HREF="{printer_uri_supported}?op=print-test-page">
+<IMG SRC="/images/button-print-test-page.gif" ALT="Skriv ut testsida" CLASS="button"></A>
+{printer_state=5?
+<A HREF="{admin_uri}?op=start-class&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-start-class.gif" ALT="Starta klass" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=stop-class&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-stop-class.gif" ALT="Stoppa klass" CLASS="button"></A>
+}
+{printer_is_accepting_jobs=0?
+<A HREF="{admin_uri}?op=accept-jobs&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-accept-jobs.gif" ALT="Acceptera jobb" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=reject-jobs&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Vägra jobb" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=purge-jobs&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Avbryt alla jobb" CLASS="button"></A>
+{printer_is_shared=0?
+<A HREF="{admin_uri}?op=set-sharing&printer_name={printer_name}&shared=1&is_class=Y">
+<IMG SRC="/images/button-publish-printer.gif" ALT="Publicera skrivare" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=set-sharing&printer_name={printer_name}&shared=0&is_class=Y">
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="Avpublicera skrivare" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=modify-class&printer_name={printer_name}">
+<IMG SRC="/images/button-modify-class.gif" ALT="Modifiera klass" CLASS="button"></A>
+<A HREF="{admin_uri}?op=delete-class&printer_name={printer_name}">
+<IMG SRC="/images/button-delete-class.gif" ALT="Ta bort klass" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-as-default&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-set-as-default.gif" ALT="Ställ in som standard" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-allowed-users&printer_name={printer_name}&is_class=Y">
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Ställ in tillåtna användare" CLASS="button"></A>
+</P>
+</TD>
+</TR>
+</TABLE>
+}}
--- /dev/null
+<SCRIPT TYPE="text/javascript">
+function reset_config()
+{
+ document.cups.CUPSDCONF.value =
+"# Log general information in error_log - change \\"info\\" to \\"debug\\" for\\n" +
+"# troubleshooting...\\n" +
+"LogLevel info\\n" +
+"\\n" +
+"\\n" +
+"# Administrator user group...\\n" +
+"SystemGroup @CUPS_SYSTEM_GROUPS@\\n" +
+"\\n" +
+"\\n" +
+"# Only listen for connections from the local machine.\\n" +
+"Listen 127.0.0.1:@DEFAULT_IPP_PORT@\\n" +
+"@CUPS_LISTEN_DOMAINSOCKET@\\n" +
+"\\n" +
+"\\n" +
+"# Show shared printers on the local network.\\n" +
+"Browsing On\\n" +
+"BrowseOrder allow,deny\\n" +
+"BrowseAllow @LOCAL\\n" +
+"\\n" +
+"\\n" +
+"# Authenticate against system accounts by default...\\n" +
+"DefaultAuthType Basic\\n" +
+"\\n" +
+"# Restrict access to the server...\\n" +
+"<Location />\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to the admin pages...\\n" +
+"<Location /admin>\\n" +
+"@ENCRYPTION_REQUIRED\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Restrict access to configuration files...\\n" +
+"<Location /admin/conf>\\n" +
+" AuthType Basic\\n" +
+" Require user @SYSTEM\\n" +
+" Order allow,deny\\n" +
+" Allow localhost\\n" +
+"</Location>\\n" +
+"\\n" +
+"# Set the default printer/job policies...\\n" +
+"<Policy default>\\n" +
+" # Job-related operations must be done by the owner or an adminstrator...\\n" +
+" <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>\\n" +
+" Require user @OWNER @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" # All administration operations require an adminstrator to authenticate...\\n" +
+" <Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>\\n" +
+" AuthType Basic\\n" +
+" Require user @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" # Only the owner or an administrator can cancel or authenticate a job...\\n" +
+" <Limit Cancel-Job CUPS-Authenticate-Job>\\n" +
+" Require user @OWNER @SYSTEM\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"\\n" +
+" <Limit All>\\n" +
+" Order deny,allow\\n" +
+" </Limit>\\n" +
+"</Policy>\\n";
+}
+</SCRIPT>
+
+<H2 CLASS="title">Serverkonfigurationsfil</H2>
+
+<FORM NAME="cups" METHOD="POST" ACTION="/admin/">
+
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="config-server">
+
+<TEXTAREA NAME="CUPSDCONF" COLS="80" ROWS="25">{CUPSDCONF}</TEXTAREA>
+
+<P><INPUT TYPE="IMAGE" SRC="/images/button-save-changes.gif"
+ALT="Spara ändringar"> <A
+HREF="javascript:reset_config();"><IMG
+SRC="/images/button-use-default-config.gif" CLASS="button"
+ALT="Använd standardkonfigurationsfil"></A></P>
+
+</FORM>
--- /dev/null
+<P>Fel:</P>
+
+<BLOCKQUOTE>Okänd åtgärd "{op}"!</BLOCKQUOTE>
--- /dev/null
+<P>{?message?{message}:Fel:}</P>
+
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+ <TITLE>{title} - CUPS 1.2rc2</TITLE>
+ <!-- Prevent caching of CGI content -->
+ <META HTTP-EQUIV="Expires" CONTENT="now">
+ <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
+ {refresh_page?<META HTTP-EQUIV="Refresh" CONTENT="{refresh_page}">:}
+ <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups.css">
+ <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+<TABLE WIDTH="100%" STYLE="height: 100%;" BORDER="0" CELLSPACING="0" CELLPADDING="0" SUMMARY="{title}">
+<TR CLASS="HEADER">
+<TD VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG SRC="/images/top-left.gif" WIDTH="15" HEIGHT="80" ALT=""></TD>
+<TD VALIGN="TOP" WIDTH="55" ROWSPAN="2"><IMG SRC="/images/top-middle.gif" WIDTH="55" HEIGHT="80" ALT=""></TD>
+<TD WIDTH="100%" HEIGHT="60"><H1>{title}</H1></TD>
+<TD ALIGN="RIGHT" VALIGN="TOP" WIDTH="15" ROWSPAN="2"><IMG
+SRC="/images/top-right.gif" WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+<TR CLASS="HEADER"><TD WIDTH="100%" VALIGN="BOTTOM" NOWRAP>
+
+<A CLASS="unsel" HREF="/"><IMG SRC="/images/tab-left.gif"
+WIDTH="4" HEIGHT="4" ALIGN="TOP" BORDER="0"
+ALT=""> Hem <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="{SECTION=admin?:un}sel" HREF="/admin"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""> Administration <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="{SECTION=classes?:un}sel" HREF="/classes/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""> Klasser <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="{SECTION=help?:un}sel" HREF="/help/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""> Dokumentation/Hjälp <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="{SECTION=jobs?:un}sel" HREF="/jobs/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""> Jobb <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+ <A CLASS="{SECTION=printers?:un}sel" HREF="/printers/"><IMG
+SRC="/images/tab-left.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""> Skrivare <IMG
+SRC="/images/tab-right.gif" WIDTH="4" HEIGHT="4" ALIGN="TOP"
+BORDER="0" ALT=""></A>
+
+</TD></TR>
+<TR CLASS="page">
+<TD WIDTH="15"> </TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="height: 100%;" VALIGN="TOP" CLASS="page">
--- /dev/null
+<FORM ACTION="/help/{?HELPFILE}" METHOD="GET">
+{TOPIC?<INPUT TYPE="HIDDEN" NAME="TOPIC" VALUE="{TOPIC}">:}
+
+<P ALIGN="CENTER"><B>Sök i
+{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Alla dokument}}:</B> <INPUT
+TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Sök">
+<A HREF="/help/{?HELPFILE}{QUERY?{TOPIC??TOPIC={TOPIC}:}:}"><IMG
+SRC="/images/button-clear.gif" ALT="Töm" CLASS="button"></A></P>
+
+</FORM>
+
+<!-- Bookmarks -->
+<DIV CLASS="sidebar">
+<H3 CLASS="title">Hjälpdokument</H3>
+
+<P CLASS="l0"><A HREF="/help{QUERY??QUERY={QUERY}:}">Alla dokument</A></P>
+<HR>
+
+{[BMTEXT]<P CLASS="l{BMINDENT}"><A HREF="{BMLINK}">{BMTEXT}</A></P>
+}
+</DIV>
+
+{QUERY?<P>Sök resultat i {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Alla dokument}}\:</P>
+{QTEXT?<UL>
+{[QTEXT]<LI><A HREF="{QLINK}">{QTEXT}</A>{QPTEXT? (in <I><A HREF="{QPLINK}">{QPTEXT}</A></I>):}</LI>}
+{QTEXT?</UL>:}
+:<P>Inga träffar.</P>}
+<HR NOSHADE>:}
+{HELPTITLE?<H1>{HELPTITLE}
+<A HREF="/help/{HELPFILE}?PRINTABLE=YES" TARGET="_blank"><IMG
+SRC="/images/button-view-printable-version.gif" ALT="Visa utskrivbar version"
+CLASS="button"></A></H1>:<H1>CUPS Hjälpsidor</H1>
+
+<P>Detta är CUPS hjälpgränssnitt. Ange sökord
+ovan eller klicka på någon av dokumentationslänkarna för att visa
+hjälpinformation.</P>
+
+<P>Om du är nybörjare i CUPS, läs sidan "<a
+href="overview.html">Översikt av CUPS</a>". Veterananvändare
+bör läsa sidan "<a href="whatsnew.html">Vad är nytt i CUPS
+1.2</a>".</P>
+
+<P><A HREF="http://www.cups.org/">CUPS hemsida</A> tillhandahåll även
+många resurser inklusive diskussionsforum för användarna, svar
+på ofta ställda frågor, och ett formulär för att skicka in felrapporter
+och förslag.</P>}
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
+ <TITLE>{HELPTITLE}</TITLE>
+ <LINK REL="STYLESHEET" TYPE="text/css" HREF="/cups-printable.css">
+ <LINK REL="SHORTCUT ICON" HREF="/favicon.ico" TYPE="image/x-icon">
+</HEAD>
+<BODY>
+
+<H1>{HELPTITLE}</H1>
--- /dev/null
+<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har avbrutits.
--- /dev/null
+<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har undanhållits från utskrift.
--- /dev/null
+<FORM METHOD="POST" ACTION="/{SECTION}/{job_id?:{printer_name}}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{job_id?<INPUT TYPE="HIDDEN" NAME="JOB_ID" VALUE="{job_id}">:}
+
+<H2 CLASS="title">{job_id?Flytta jobb {job_id}:Flytta alla jobb}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Nytt mål:</TH>
+<TD>
+<SELECT NAME="JOB_PRINTER_URI" SIZE="10">
+{[job_printer_uri]<OPTION VALUE="{job_printer_uri}">{job_printer_name}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-move-job{job_id?:s}.gif" ALT="Flytta jobb{job_id?:s}"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<P>{job_id?<A HREF="/jobs/{job_id}">Jobbet {job_id}</A>:Alla jobb} har flyttats till
+<A HREF="{job_printer_uri}">{job_printer_name}</A>.</P>
--- /dev/null
+<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har släppts för utskrift.
--- /dev/null
+<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har startats om.
--- /dev/null
+<P>{?which_jobs=?<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Visa färdiga jobb"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Visa alla jobb">:{which_jobs=all?<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=completed"><IMG
+SRC="/images/button-show-completed.gif" CLASS="button" ALT="Visa färdiga jobb"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Visa aktiva jobb">:<A
+HREF="{?printer_name=?/jobs:{printer_uri_supported}}"><IMG
+SRC="/images/button-show-active.gif" CLASS="button" ALT="Visa aktiva jobb"></A>
+<A HREF="{?printer_name=?/jobs:{printer_uri_supported}}?which_jobs=all"><IMG
+SRC="/images/button-show-all.gif" CLASS="button" ALT="Visa alla jobb">}}</A></P>
+
+<P ALIGN="CENTER">{total=0?Inga jobb:Visar {#job_id} av {total} {?which_jobs=?aktiva:{which_jobs=all?:färdiga}} jobb{total=1?:s}}.</P>
--- /dev/null
+{#job_id=0?:
+<TABLE CELLPADDING="0" CELLSPACING="0" CLASS="button" WIDTH="100%" SUMMARY="Job List">
+<TR CLASS="data">
+<TH>ID </TH>
+<TH>Namn </TH>
+<TH>Användare </TH>
+<TH>Storlek </TH>
+<TH>Sidor </TH>
+<TH>Tillstånd </TH>
+<TH>Kontroll </TH>
+</TR>
+
+{[job_id]
+<TR CLASS="data" VALIGN="TOP">
+<TD><A HREF="{job_printer_uri}">{job_printer_name}</A>-{job_id} </TD>
+<TD>{?job_name=?Okänt:{job_name}} </TD>
+<TD>{job_originating_user_name} </TD>
+<TD>{job_k_octets}k </TD>
+<TD>{job_media_sheets_completed=0?Okänt:{?job_media_sheets_completed}}</TD>
+<TD>{job_state=3?väntar sedan<BR>{time_at_creation}:{job_state=4?hålls kvar sedan<BR>{time_at_creation}:
+{job_state=5?behandlas sedan<BR>{time_at_processing}:{job_state=6?stoppad kl<BR>{time_at_completed}:
+{job_state=7?cancelled at<BR>{time_at_completed}:{job_state=8?aborted:färdig kl<BR>{time_at_completed}}}}}}} </TD>
+<TD>
+{job_preserved>0?
+<A HREF="/jobs/?op=restart-job&job_id={job_id}&job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-restart-job.gif" ALT="Skriv ut jobb igen" CLASS="button"></A>:}
+{job_state=4?
+<A HREF="/jobs/?op=release-job&job_id={job_id}&job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-release-job.gif" ALT="Släpp jobb" CLASS="button"></A>:}
+{job_state=3?
+<A HREF="/jobs/?op=hold-job&job_id={job_id}&job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-hold-job.gif" ALT="Håll kvar jobb" CLASS="button"></A>:}
+{job_state<7?
+<A HREF="/jobs/?op=cancel-job&job_id={job_id}&job_printer_uri={job_printer_uri}">
+<IMG SRC="/images/button-cancel-job.gif" ALT="Avbryt jobb" CLASS="button"></A>
+<A HREF="/jobs/?op=move-job&job_id={job_id}"><IMG
+SRC="/images/button-move-job.gif" ALT="Flytta jobb" CLASS="button"></A>:}
+ </TD>
+</TR>
+}
+</TABLE>
+}
--- /dev/null
+<P>Underhållskommandon skickade; jobb-id är <A HREF="/printers/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+
+<H2 CLASS="title">Modifiera klass {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Namn:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+{printer_name}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Plats:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Beskrivning:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"></TD>
+</TR>
+<TR>
+<TH CLASS="label">Medlemmar:</TH>
+<TD>
+<SELECT NAME="MEMBER_URIS" SIZE="10" MULTIPLE>
+{[member_uris]<OPTION VALUE="{member_uris}" {?member_selected}>{member_names}}
+</SELECT>
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-modify-class.gif" ALT="Modifiera klass"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
+{?device_uri=?:<INPUT TYPE="HIDDEN" NAME="CURRENT_DEVICE_URI" VALUE="{device_uri}">}
+{?printer_make_and_model=?:<INPUT TYPE="HIDDEN" NAME="CURRENT_MAKE_AND_MODEL" VALUE="{printer_make_and_model}">}
+
+<H2 CLASS="title">Modifiera skrivare {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Namn:</TH>
+<TD><INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">{printer_name}</TD>
+</TR>
+<TR>
+<TH CLASS="label">Plats:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_LOCATION" VALUE="{?printer_location}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Läsbar plats såsom "Lab 1")</SMALL></TD>
+</TR>
+<TR>
+<TH CLASS="label">Beskrivning:</TH>
+<TD><INPUT TYPE="TEXT" NAME="PRINTER_INFO" VALUE="{?printer_info}" SIZE="40" MAXLENGTH="127"><BR>
+<SMALL>(Läsbar beskrivning såsom "HP LaserJet")</SMALL></TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-continue.gif" ALT="Fortsätt"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD>
+{[choices]<INPUT TYPE="RADIO" NAME="{keyword}" {choices={defchoice}?CHECKED:} VALUE="{choices}">{text}}
+</TD>
+</TR>
--- /dev/null
+<P><B>Fel:</B> Följande alternativ är i konflikt:</P>
+
+<UL>
+{[ckeyword]<LI><A HREF="#{ckeyword}">{ckeytext}</A></LI>
+}</UL>
+
+<P>Ändra ett eller flera av alternativen för att läsa konflikterna.</P>
--- /dev/null
+<H2 CLASS="title">{printer_name}: {group}</H2>
+
+<TABLE>
--- /dev/null
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}" MULTIPLE SIZE="10">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT></TD>
+</TR>
--- /dev/null
+<TR>
+<TH CLASS="label"{conflicted=1? CLASS="conflict":}><A NAME="{keyword}">{keytext}</A>:</TH>
+<TD><SELECT NAME="{keyword}">
+{[choices]<OPTION {choices={defchoice}?SELECTED:} VALUE="{choices}">{text}}
+</SELECT></TD>
+</TR>
--- /dev/null
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-set-printer-options.gif" ALT="Ställ in skrivaralternativ"></TD>
+</TR>
+</TABLE>
--- /dev/null
+<TABLE WIDTH="100%" CLASS="pager" SUMMARY="Paging Bar">
+<TR>
+ <TD WIDTH="33%">{PREVURL?<A HREF="{PREVURL}"><IMG SRC="/images/button-show-previous.gif" ALT="Visa föregående" CLASS="button"></A>: }</TD>
+ <TD WIDTH="34%" ALIGN="CENTER">{ORDER=dec?<A HREF="{THISURL}&ORDER=asc"><IMG SRC="/images/button-sort-ascending.gif" ALT="Sortera stigande" CLASS="button"></A>:<A HREF="{THISURL}&ORDER=dec"><IMG SRC="/images/button-sort-descending.gif" ALT="Sortera fallande" CLASS="button"></A>}</TD>
+ <TD WIDTH="33%" ALIGN="RIGHT">{NEXTURL?<A HREF="{NEXTURL}"><IMG SRC="/images/button-show-next.gif" ALT="Visa nästa" CLASS="button"></A>: }</TD>
+</TR>
+</TABLE>
--- /dev/null
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+accepterar nu jobb.</P>
--- /dev/null
+<P>Skrivaren <A HREF="/printers/{printer_name}">{printer_name}</A> har lagts till.
--- /dev/null
+<P>Skrivaren <A HREF="/printers/{printer_name}">{printer_name}</A> har nu konfigurerats.
--- /dev/null
+<P><B>Varning:</B> Är du säker på att du vill ta bort skrivaren
+{printer_name}?</P>
+
+<P ALIGN="CENTER"><A
+HREF="/admin?op=delete-printer&printer_name={printer_name}&confirm=yes"><IMG
+SRC="/images/button-delete-printer.gif" ALT="Ta bort skrivare"
+CLASS="button"></A></P>
--- /dev/null
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+har gjorts till standardskrivaren på servern.</P>
+
+<BLOCKQUOTE><B>Notera:</B> Alla användarinställningar som har ställts in via
+kommandot <TT>lpoptions</TT> kommer att åsidosätta denna standardinställning.
+</BLOCKQUOTE>
--- /dev/null
+<P>Skrivaren {printer_name} har tagits bort.
--- /dev/null
+<H3 CLASS="title">Jobb</H3>
--- /dev/null
+<P>Skrivaren <A HREF="/printers/{printer_name}">{printer_name}</A> har modifierats.
--- /dev/null
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+har fått alla sina jobb rensade.</P>
--- /dev/null
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+accepterar inte längre jobb.</P>
--- /dev/null
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+har startats.</P>
--- /dev/null
+<P>{is_class?Class:Printer} <A
+HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A>
+har stoppats.</P>
--- /dev/null
+<P ALIGN="CENTER">{total=0?Inga skrivare:Visar {#printer_name} av {total} skrivare}.</P>
--- /dev/null
+{printer_type?:}{#printer_name=0?:
+{[printer_name]
+<H2 CLASS="title"><A HREF="{printer_uri_supported}">{printer_name}</A>{default_name={printer_name}? (Standardskrivare):}
+{?printer_state_message=?:<SPAN CLASS="message">"{printer_state_message}"</SPAN>}</H2>
+
+<TABLE WIDTH="100%" CLASS="button" CELLSPACING="0" CELLPADDING="0" SUMMARY="{printer_name}">
+<TR>
+<TD VALIGN="TOP"><A HREF="{printer_uri_supported}">
+<IMG SRC="/images/printer-{printer_state=3?idle:{printer_state=4?processing:stopped}}.gif" CLASS="button" ALT=""></A>
+</TD>
+<TD VALIGN="TOP"><B>Beskrivning:</B> {printer_info}<BR>
+<B>Plats:</B> {printer_location}<BR>
+<B>Tillverkare och modell:</B> {printer_make_and_model}<BR>
+<B>Tillstånd:</B> {printer_state=3?overksam:{printer_state=4?behandlar:stoppad}},
+{printer_is_accepting_jobs=0?vägrar jobb:accepterar jobb}, {printer_is_shared=0?inte:} publicerad.
+{?device_uri=?:<BR><B>Enhets-URI:</B> {device_uri}}
+
+<P>
+<A HREF="{printer_uri_supported}?op=print-test-page">
+<IMG SRC="/images/button-print-test-page.gif" ALT="Skriv ut testsida" CLASS="button"></A>
+{?cupscommand=1?<A HREF="{printer_uri_supported}?op=clean-print-heads">
+<IMG SRC="/images/button-clean-print-heads.gif" ALT="Rengör skrivarhuvuden" CLASS="button"></A>
+<A HREF="{printer_uri_supported}?op=print-self-test-page">
+<IMG SRC="/images/button-print-self-test-page.gif" ALT="Skriv ut självtestsida" CLASS="button"></A>:}
+{printer_state=5?
+<A HREF="{admin_uri}?op=start-printer&printer_name={printer_name}">
+<IMG SRC="/images/button-start-printer.gif" ALT="Starta skrivare" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=stop-printer&printer_name={printer_name}">
+<IMG SRC="/images/button-stop-printer.gif" ALT="Stoppa skrivare" CLASS="button"></A>
+}
+{printer_is_accepting_jobs=0?
+<A HREF="{admin_uri}?op=accept-jobs&printer_name={printer_name}">
+<IMG SRC="/images/button-accept-jobs.gif" ALT="Acceptera jobb" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=reject-jobs&printer_name={printer_name}">
+<IMG SRC="/images/button-reject-jobs.gif" ALT="Vägra jobb" CLASS="button"></A>
+}
+<A HREF="{printer_uri_supported}?op=move-jobs&printer_name={printer_name}">
+<IMG SRC="/images/button-move-jobs.gif" ALT="Flytta alla jobb" CLASS="button"></A>
+<A HREF="{admin_uri}?op=purge-jobs&printer_name={printer_name}">
+<IMG SRC="/images/button-cancel-all-jobs.gif" ALT="Avbryt alla jobb" CLASS="button"></A>
+{printer_is_shared=0?
+<A HREF="{admin_uri}?op=set-sharing&printer_name={printer_name}&shared=1">
+<IMG SRC="/images/button-publish-printer.gif" ALT="Publicera skrivare" CLASS="button"></A>
+:
+<A HREF="{admin_uri}?op=set-sharing&printer_name={printer_name}&shared=0">
+<IMG SRC="/images/button-unpublish-printer.gif" ALT="Avpublicera skrivare" CLASS="button"></A>
+}
+<A HREF="{admin_uri}?op=modify-printer&printer_name={printer_name}">
+<IMG SRC="/images/button-modify-printer.gif" ALT="Modifiera skrivare" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-printer-options&printer_name={printer_name}">
+<IMG SRC="/images/button-set-printer-options.gif" ALT="Ställ in skrivaralternativ" CLASS="button"></A>
+<A HREF="{admin_uri}?op=delete-printer&printer_name={printer_name}">
+<IMG SRC="/images/button-delete-printer.gif" ALT="Ta bort skrivare" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-as-default&printer_name={printer_name}">
+<IMG SRC="/images/button-set-as-default.gif" ALT="Ställ in som standard" CLASS="button"></A>
+<A HREF="{admin_uri}?op=set-allowed-users&printer_name={printer_name}">
+<IMG SRC="/images/button-set-allowed-users.gif" ALT="Ställ in tillåtna användare" CLASS="button"></A>
+</P>
+</TD>
+</TR>
+</TABLE>
+}}
--- /dev/null
+<p>Var god vänta under tiden servern startar om...</p>
--- /dev/null
+<SCRIPT TYPE="text/javascript"><!--
+function select_printers() {
+ var list = document.export_samba.EXPORT_NAME;
+ var sel = document.export_samba.EXPORT_ALL.checked;
+
+ for (i = 0; i < list.length; i ++) {
+ list.options[i].selected = sel;
+ }
+}
+--></SCRIPT>
+
+<FORM METHOD="POST" ACTION="/admin/" NAME="export_samba">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="export-samba">
+
+<H2 CLASS="title">Exportera skrivare till Samba</H2>
+
+{error?<P>Kunde inte exportera skrivare till Samba\:</P>
+<BLOCKQUOTE>{error}</BLOCKQUOTE>
+<P>Konsultera filen <A HREF="/admin/log/error_log"
+TARGET="_blank">error_log</A> för mer information.</P>:
+<P>Denna sida låter dig exportera skrivare till Samba så att
+Windows-klienter kan komma åt dem genom ikonerna <VAR>Network
+Neighborhood</VAR> eller <VAR>Network Places</VAR> på deras
+skrivbord. Du måste tidigare ha installerat skrivardrivrutinerna för Windows PostScript
+som beskrivs på manualsidan <A
+HREF="/help/man-cupsaddsmb.html"
+TARGET="_blank">cupsaddsmb(8)</A>.</P>}
+
+<TABLE>
+<TR>
+<TH CLASS="label">Skrivare:</TH>
+<TD>
+<SELECT NAME="EXPORT_NAME" SIZE="10" MULTIPLE>
+{[printer_name]<OPTION VALUE="{printer_name}"{export_all? SELECTED:{printer_export? SELECTED:}}>{printer_name}}
+</SELECT><BR>
+<INPUT TYPE="CHECKBOX" NAME="EXPORT_ALL"{export_all? CHECKED:}
+onChange="select_printers()"> Exportera alla skrivare
+</TD>
+</TR>
+<TR>
+<TH CLASS="label">Användarnamn för Samba:</TH>
+<TD><INPUT TYPE="TEXT" NAME="USERNAME" VALUE="{?USERNAME}"> (krävs)</TD>
+</TR>
+<TR>
+<TH CLASS="label">Lösenord för Samba:</TH>
+<TD><INPUT TYPE="PASSWORD" NAME="PASSWORD" VALUE=""> (krävs)</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD><INPUT TYPE="IMAGE" SRC="/images/button-export-samba.gif"
+ALT="Exportera skrivare till Samba"></TD>
+</TR>
+</TABLE>
+
+</FORM>
--- /dev/null
+<P>Skrivare exporterade till Samba.</P>
--- /dev/null
+<FORM ACTION="/{SECTION}/{?SEARCH_DEST}" METHOD="GET">
+{WHICH_JOBS?<INPUT TYPE="HIDDEN" NAME="WHICH_JOBS" VALUE="{WHICH_JOBS}">:}
+{ORDER?<INPUT TYPE="HIDDEN" NAME="ORDER" VALUE="{ORDER}">:}
+
+<P ALIGN="CENTER"><B>Sök i
+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Klasser:{SECTION=jobs?Jobb:Skrivare}}}:</B>
+<INPUT TYPE="TEXT" NAME="QUERY" VALUE="{?QUERY}" SIZE="60"> <INPUT
+TYPE="IMAGE" SRC="/images/button-search.gif" ALT="Sök">
+<A
+HREF="/{SECTION}/{?SEARCH_DEST}{WHICH_JOBS??WHICH_JOBS={WHICH_JOBS}{ORDER?&ORDER={ORDER}:}:{ORDER??ORDER={ORDER}:}}"><IMG
+SRC="/images/button-clear.gif" ALT="Töm" CLASS="button"></A></P>
+
+</FORM>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}">
--- /dev/null
+<P>Testsida skickad; jobb-id är <A HREF="/{SECTION}/{printer_name}">
+{printer_name}-{job_id}</A>.</P>
--- /dev/null
+</TD>
+<TD WIDTH="15"> </TD>
+</TR>
+<TR CLASS="trailer">
+<TD VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-left.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+<TD COLSPAN="2" WIDTH="100%" STYLE="padding: 5;">
+
+<P><SMALL>The Common UNIX Printing System, CUPS, och CUPS-logotypen är
+varumärken tillhörande <A HREF="http://www.easysw.com">Easy Software
+Products</A>. CUPS är copyright 1997-2006 Easy Software Products,
+Alla rättigheter reserverade.</SMALL></P>
+
+</TD>
+
+<TD ALIGN="RIGHT" VALIGN="BOTTOM" WIDTH="15"><IMG SRC="/images/bottom-right.gif"
+WIDTH="15" HEIGHT="15" ALT=""></TD>
+</TR>
+</TABLE>
+</BODY>
+</HTML>
--- /dev/null
+<FORM METHOD="POST" ACTION="/admin">
+<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{OP}">
+<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}">
+{IS_CLASS?<INPUT TYPE="HIDDEN" NAME="IS_CLASS" VALUE="{IS_CLASS}">:}
+
+<H2 CLASS="title">Tillåtna användare för {printer_name}</H2>
+
+<TABLE>
+<TR>
+<TH CLASS="label">Användare:</TH>
+<TD>
+<INPUT TYPE='TEXT' NAME='users' SIZE='60' VALUE='{?requesting_user_name_allowed}{?requesting_user_name_denied}'>
+<BR>
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-allowed' {requesting_user_name_allowed?checked:}>Tillåt dessa användare att skriva ut
+<INPUT TYPE='RADIO' NAME='type' VALUE='requesting-user-name-denied' {requesting_user_name_denied?checked:}>Förhindra dessa användare från att skriva ut
+</TD>
+</TR>
+<TR>
+<TD></TD>
+<TD>
+<INPUT TYPE="IMAGE" SRC="/images/button-set-allowed-users.gif" ALT="Ställ in tillåtna användare">
+</TD>
+</TR>
+</TABLE>
+
+</FORM>
/*
- * "$Id: ipptest.c 5090 2006-02-08 17:08:01Z mike $"
+ * "$Id: ipptest.c 5414 2006-04-17 20:07:24Z mike $"
*
* IPP test command for the Common UNIX Printing System (CUPS).
*
* Globals...
*/
-int Verbosity = 0; /* Show all attributes? */
+int Verbosity = 0; /* Show all attributes? */
+const char * const TagNames[] =
+ { /* Value/group tag names */
+ "zero", /* 0x00 */
+ "operation", /* 0x01 */
+ "job", /* 0x02 */
+ "end", /* 0x03 */
+ "printer", /* 0x04 */
+ "unsupported-group", /* 0x05 */
+ "subscription", /* 0x06 */
+ "event-notification", /* 0x07 */
+ "", "", "", "", "", "", "", "",
+ "unsupported-value", /* 0x10 */
+ "default", /* 0x11 */
+ "unknown", /* 0x12 */
+ "novalue", /* 0x13 */
+ "",
+ "notsettable", /* 0x15 */
+ "deleteattr", /* 0x16 */
+ "anyvalue", /* 0x17 */
+ "", "", "", "", "", "", "", "", "",
+ "integer", /* 0x21 */
+ "boolean", /* 0x22 */
+ "enum", /* 0x23 */
+ "", "", "", "", "", "", "", "", "", "", "", "",
+ "string", /* 0x30 */
+ "date", /* 0x31 */
+ "resolution", /* 0x32 */
+ "range", /* 0x33 */
+ "collection", /* 0x34 */
+ "textlang", /* 0x35 */
+ "namelang", /* 0x36 */
+ "", "", "", "", "", "", "", "", "", "",
+ "text", /* 0x41 */
+ "name", /* 0x42 */
+ "",
+ "keyword", /* 0x44 */
+ "uri", /* 0x45 */
+ "urischeme", /* 0x46 */
+ "charset", /* 0x47 */
+ "language", /* 0x48 */
+ "mimetype" /* 0x49 */
+ };
+
+
/*
ipp_op_t ippOpValue(const char *);
ipp_status_t ippErrorValue(const char *);
ipp_tag_t get_tag(const char *);
+const char *get_tag_string(ipp_tag_t tag);
char *get_token(FILE *, char *, int, int *linenum);
void print_attr(ipp_attribute_t *);
void usage(const char *option);
get_tag(const char *name) /* I - Name of value/group tag */
{
int i; /* Looping var */
- static const char * const names[] =
- { /* Value/group tag names */
- "zero", /* 0x00 */
- "operation", /* 0x01 */
- "job", /* 0x02 */
- "end", /* 0x03 */
- "printer", /* 0x04 */
- "unsupported-group", /* 0x05 */
- "subscription", /* 0x06 */
- "event-notification", /* 0x07 */
- "", "", "", "", "", "", "", "",
- "unsupported-value", /* 0x10 */
- "default", /* 0x11 */
- "unknown", /* 0x12 */
- "novalue", /* 0x13 */
- "",
- "notsettable", /* 0x15 */
- "deleteattr", /* 0x16 */
- "anyvalue", /* 0x17 */
- "", "", "", "", "", "", "", "", "",
- "integer", /* 0x21 */
- "boolean", /* 0x22 */
- "enum", /* 0x23 */
- "", "", "", "", "", "", "", "", "", "", "", "",
- "string", /* 0x30 */
- "date", /* 0x31 */
- "resolution", /* 0x32 */
- "range", /* 0x33 */
- "collection", /* 0x34 */
- "textlang", /* 0x35 */
- "namelang", /* 0x36 */
- "", "", "", "", "", "", "", "", "", "",
- "text", /* 0x41 */
- "name", /* 0x42 */
- "",
- "keyword", /* 0x44 */
- "uri", /* 0x45 */
- "urischeme", /* 0x46 */
- "charset", /* 0x47 */
- "language", /* 0x48 */
- "mimetype" /* 0x49 */
- };
- for (i = 0; i < (sizeof(names) / sizeof(names[0])); i ++)
- if (!strcasecmp(name, names[i]))
+ for (i = 0; i < (sizeof(TagNames) / sizeof(TagNames[0])); i ++)
+ if (!strcasecmp(name, TagNames[i]))
return ((ipp_tag_t)i);
return (IPP_TAG_ZERO);
}
+/*
+ * 'get_tag_string()' - Get the string associated with a tag.
+ */
+
+const char * /* O - Tag name string */
+get_tag_string(ipp_tag_t tag) /* I - IPP tag */
+{
+ if (tag < (ipp_tag_t)(sizeof(TagNames) / sizeof(TagNames[0])))
+ return (TagNames[tag]);
+ else
+ return ("UNKNOWN");
+}
+
+
/*
* 'get_token()' - Get a token from a file.
*/
return;
}
- printf(" %s = ", attr->name);
+ printf(" %s (%s) = ", attr->name, get_tag_string(attr->value_tag));
switch (attr->value_tag)
{
/*
- * End of "$Id: ipptest.c 5090 2006-02-08 17:08:01Z mike $".
+ * End of "$Id: ipptest.c 5414 2006-04-17 20:07:24Z mike $".
*/