diff options
author | jlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2006-04-24 18:03:36 +0000 |
---|---|---|
committer | jlovell <jlovell@a1ca3aef-8c08-0410-bb20-df032aa958be> | 2006-04-24 18:03:36 +0000 |
commit | 89d46774ee527faaaf27d1b696554f4508bf105b (patch) | |
tree | 27ae92ec2e5df36836fc505515ab45f9a06cebc1 | |
parent | e53920b9224e07b7d5f3e5a3ffea1f64ded479d2 (diff) |
Load cups into easysw/current.
git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@136 a1ca3aef-8c08-0410-bb20-df032aa958be
303 files changed, 15797 insertions, 1101 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 604557f50..64fc2de68 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,7 +1,70 @@ -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. @@ -99,7 +162,7 @@ CHANGES IN CUPS V1.2rc1 #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) diff --git a/CREDITS.txt b/CREDITS.txt index fec1c0214..27722e232 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1,4 +1,4 @@ -CREDITS.txt - 2006-02-23 +CREDITS.txt - 2006-04-17 ------------------------ Few projects are completed by one person, and CUPS is no exception. We'd @@ -24,10 +24,10 @@ like to thank the following individuals for their contributions: 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 Gonzlez Riopedre - Spanish localization Stuart Stevens - HP JetDirect IPP information. diff --git a/backend/Dependencies b/backend/Dependencies index 42ce66029..aed436425 100644 --- a/backend/Dependencies +++ b/backend/Dependencies @@ -19,6 +19,11 @@ scsi.o: ../cups/language.h ../cups/string.h ../config.h 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 diff --git a/backend/Makefile b/backend/Makefile index 4267f21e5..807a78efd 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -1,5 +1,5 @@ # -# "$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). # @@ -27,10 +27,10 @@ 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 # @@ -166,6 +166,15 @@ serial: serial.o ../cups/$(LIBCUPS) # +# snmp +# + +snmp: snmp.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o snmp snmp.o $(LIBS) + + +# # socket # @@ -192,5 +201,5 @@ include Dependencies # -# End of "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $". +# End of "$Id: Makefile 5429 2006-04-18 21:18:51Z mike $". # diff --git a/backend/ieee1284.c b/backend/ieee1284.c index 52f27db18..a6f8b2649 100644 --- a/backend/ieee1284.c +++ b/backend/ieee1284.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -25,8 +25,9 @@ * * 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. */ /* @@ -34,21 +35,14 @@ */ #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); /* @@ -56,6 +50,24 @@ * 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 */ @@ -70,9 +82,9 @@ get_device_id( 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 */ @@ -80,6 +92,7 @@ get_device_id( 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, @@ -175,6 +188,157 @@ get_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... */ @@ -224,69 +388,84 @@ get_device_id( 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 @@ -298,76 +477,34 @@ get_device_id( 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 $". */ diff --git a/backend/parallel.c b/backend/parallel.c index 6acb8134f..d846c82a3 100644 --- a/backend/parallel.c +++ b/backend/parallel.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -466,8 +466,6 @@ list_devices(void) 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"); @@ -737,5 +735,5 @@ list_devices(void) /* - * 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 $". */ diff --git a/backend/serial.c b/backend/serial.c index 17de8d8d3..86093682c 100644 --- a/backend/serial.c +++ b/backend/serial.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -87,6 +87,11 @@ # include <IOKit/IOBSD.h> #endif /* __APPLE__ */ +#if defined(__linux) && defined(TIOCGSERIAL) +# include <linux/serial.h> +# include <linux/ioctl.h> +#endif /* __linux && TIOCGSERIAL */ + /* * Local functions... @@ -663,21 +668,48 @@ list_devices(void) { #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); @@ -824,13 +856,13 @@ list_devices(void) { 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 */ } /* @@ -1063,7 +1095,6 @@ list_devices(void) CFMutableDictionaryRef classesToMatch; io_object_t serialService; - printf("serial serial \"Unknown\" \"Serial Printer (serial)\"\n"); kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort); if (KERN_SUCCESS != kernResult) @@ -1117,8 +1148,8 @@ list_devices(void) 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); } } } @@ -1126,7 +1157,11 @@ list_devices(void) IOObjectRelease(serialService); } - IOObjectRelease(serialPortIterator); /* Release the iterator. */ + /* + * Release the iterator. + */ + + IOObjectRelease(serialPortIterator); } } #endif @@ -1134,5 +1169,5 @@ list_devices(void) /* - * 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 $". */ diff --git a/backend/snmp.c b/backend/snmp.c new file mode 100644 index 000000000..d571bf105 --- /dev/null +++ b/backend/snmp.c @@ -0,0 +1,2206 @@ +/* + * "$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 $". + */ diff --git a/backend/snmp.txt b/backend/snmp.txt new file mode 100644 index 000000000..77a38c498 --- /dev/null +++ b/backend/snmp.txt @@ -0,0 +1,172 @@ +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 + diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c index a3d4d7f3b..aac69d973 100644 --- a/cgi-bin/admin.c +++ b/cgi-bin/admin.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -506,9 +506,7 @@ do_am_printer(http_t *http, /* I - HTTP connection */ 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 */ @@ -855,27 +853,31 @@ do_am_printer(http_t *http, /* I - HTTP connection */ * 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(); @@ -931,7 +933,6 @@ do_am_printer(http_t *http, /* I - HTTP connection */ cgiEndHTML(); } - ippDelete(response); } else @@ -1182,7 +1183,7 @@ do_config_printer(http_t *http) /* I - HTTP connection */ ppdLocalize(ppd); - cgiStartHTML("Set Printer Options"); + cgiStartHTML(cgiText(_("Set Printer Options"))); cgiCopyTemplateLang("set-printer-options-header.tmpl"); if (ppdConflicts(ppd)) @@ -1451,7 +1452,7 @@ do_config_printer(http_t *http) /* I - HTTP connection */ if (!in || !out) { cgiSetVariable("ERROR", strerror(errno)); - cgiStartHTML("Set Printer Options"); + cgiStartHTML(cgiText(_("Set Printer Options"))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); @@ -1814,7 +1815,7 @@ do_config_server(http_t *http) /* I - HTTP connection */ * Show the current config file... */ - cgiStartHTML("Edit Configuration File"); + cgiStartHTML(cgiText(_("Edit Configuration File"))); printf("<!-- \"%s\" -->\n", filename); @@ -1837,10 +1838,13 @@ do_delete_class(http_t *http) /* I - HTTP connection */ 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; @@ -1851,6 +1855,7 @@ do_delete_class(http_t *http) /* I - HTTP connection */ "localhost", 0, "/classes/%s", pclass); else { + cgiStartHTML(cgiText(_("Delete Class"))); cgiSetVariable("ERROR", cgiText(_("Missing form variable!"))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); @@ -1877,6 +1882,12 @@ do_delete_class(http_t *http) /* I - HTTP connection */ ippDelete(cupsDoRequest(http, request, "/admin/")); + /* + * Show the results... + */ + + cgiStartHTML(cgiText(_("Delete Class"))); + if (cupsLastError() > IPP_OK_CONFLICT) cgiShowIPPError(_("Unable to delete class:")); else @@ -1898,10 +1909,13 @@ do_delete_printer(http_t *http) /* I - HTTP connection */ 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; @@ -1912,6 +1926,7 @@ do_delete_printer(http_t *http) /* I - HTTP connection */ "localhost", 0, "/printers/%s", printer); else { + cgiStartHTML(cgiText(_("Delete Printer"))); cgiSetVariable("ERROR", cgiText(_("Missing form variable!"))); cgiCopyTemplateLang("error.tmpl"); cgiEndHTML(); @@ -1938,6 +1953,12 @@ do_delete_printer(http_t *http) /* I - HTTP connection */ ippDelete(cupsDoRequest(http, request, "/admin/")); + /* + * Show the results... + */ + + cgiStartHTML(cgiText(_("Delete Printer"))); + if (cupsLastError() > IPP_OK_CONFLICT) cgiShowIPPError(_("Unable to delete printer:")); else @@ -2867,5 +2888,5 @@ match_string(const char *a, /* I - First string */ /* - * 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 $". */ diff --git a/cgi-bin/ipp-var.c b/cgi-bin/ipp-var.c index 274c8e9b8..583a9f745 100644 --- a/cgi-bin/ipp-var.c +++ b/cgi-bin/ipp-var.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -1035,9 +1035,9 @@ cgiSetIPPVars(ipp_t *response, /* I - Response data to be copied... */ 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); } @@ -1277,5 +1277,5 @@ cgiText(const char *message) /* I - Message */ /* - * 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 $". */ diff --git a/conf/Makefile b/conf/Makefile index e806900af..968e66004 100644 --- a/conf/Makefile +++ b/conf/Makefile @@ -1,5 +1,5 @@ # -# "$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). # @@ -74,8 +74,7 @@ install: all 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); \ @@ -103,5 +102,5 @@ uninstall: # -# End of "$Id: Makefile 5229 2006-03-05 16:48:12Z mike $". +# End of "$Id: Makefile 5412 2006-04-17 14:30:53Z mike $". # diff --git a/conf/cupsd.conf.in b/conf/cupsd.conf.in index 426077b1b..21f43b2cc 100644 --- a/conf/cupsd.conf.in +++ b/conf/cupsd.conf.in @@ -1,5 +1,5 @@ # -# "$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 @@ -33,6 +33,7 @@ DefaultAuthType Basic # Restrict access to the admin pages... <Location /admin> +@ENCRYPTION_REQUIRED@ Order allow,deny Allow localhost </Location> @@ -72,5 +73,5 @@ DefaultAuthType Basic </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 $". # diff --git a/conf/mime.convs b/conf/mime.convs index b6c7004ba..f07342df8 100644 --- a/conf/mime.convs +++ b/conf/mime.convs @@ -1,5 +1,5 @@ # -# "$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). # @@ -107,13 +107,12 @@ image/x-sun-raster application/vnd.cups-raster 100 imagetoraster # # 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 $". # diff --git a/conf/mime.types b/conf/mime.types index c063fa6ce..6f3d0467a 100644 --- a/conf/mime.types +++ b/conf/mime.types @@ -1,5 +1,5 @@ # -# "$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). # @@ -147,7 +147,9 @@ text/css css 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>@) \ @@ -159,13 +161,11 @@ application/vnd.cups-raw (string(0,<1B>E) + !string(2,<1B>%0B)) \ # # 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 $". # diff --git a/config-scripts/cups-defaults.m4 b/config-scripts/cups-defaults.m4 index 50394fa31..e327fe28c 100644 --- a/config-scripts/cups-defaults.m4 +++ b/config-scripts/cups-defaults.m4 @@ -26,7 +26,7 @@ dnl 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 diff --git a/config-scripts/cups-image.m4 b/config-scripts/cups-image.m4 index 2d5607fcd..e6f9644bb 100644 --- a/config-scripts/cups-image.m4 +++ b/config-scripts/cups-image.m4 @@ -1,5 +1,5 @@ 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 @@ -78,7 +78,7 @@ AC_CHECK_LIB(m, pow) 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 @@ -110,5 +110,5 @@ AC_SUBST(EXPORT_LIBZ) 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 diff --git a/config-scripts/cups-ssl.m4 b/config-scripts/cups-ssl.m4 index ebffe0ef6..22ab754d5 100644 --- a/config-scripts/cups-ssl.m4 +++ b/config-scripts/cups-ssl.m4 @@ -1,9 +1,9 @@ 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 @@ -36,6 +36,7 @@ AC_ARG_WITH(openssl-includes, [ --with-openssl-includes set directory for OpenS SSLFLAGS="" SSLLIBS="" +ENCRYPTION_REQUIRED="" if test x$enable_ssl != xno; then dnl Look for CDSA... @@ -43,6 +44,10 @@ if test x$enable_ssl != xno; then 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 @@ -57,6 +62,7 @@ if test x$enable_ssl != xno; then 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)]) @@ -84,6 +90,7 @@ if test x$enable_ssl != xno; then 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) @@ -99,11 +106,12 @@ fi 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 diff --git a/configure.in b/configure.in index 299ca6a44..eb1137f24 100644 --- a/configure.in +++ b/configure.in @@ -1,5 +1,5 @@ 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 @@ -46,18 +46,26 @@ sinclude(config-scripts/cups-defaults.m4) 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 diff --git a/cups/Dependencies b/cups/Dependencies index 74abad080..4cb7cb37f 100644 --- a/cups/Dependencies +++ b/cups/Dependencies @@ -20,11 +20,12 @@ encode.o: ipp-private.h string.h ../config.h debug.h 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 @@ -60,8 +61,7 @@ ppd.o: file.h language.h i18n.h transcode.h 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 @@ -102,11 +102,12 @@ encode.32.o: encode.c ipp-private.h string.h ../config.h debug.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 @@ -142,8 +143,7 @@ ppd.32.o: ppd.c file.h language.h i18n.h transcode.h 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 @@ -184,11 +184,12 @@ encode.64.o: encode.c ipp-private.h string.h ../config.h debug.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 @@ -224,8 +225,7 @@ ppd.64.o: ppd.c file.h language.h i18n.h transcode.h 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 diff --git a/cups/Makefile b/cups/Makefile index 5951bb125..1570e1861 100644 --- a/cups/Makefile +++ b/cups/Makefile @@ -1,5 +1,5 @@ # -# "$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). # @@ -43,6 +43,7 @@ LIBOBJS = \ emit.o \ encode.o \ file.o \ + getifaddrs.o \ getputfile.o \ globals.o \ http.o \ @@ -421,7 +422,7 @@ apihelp: 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 \ @@ -441,5 +442,5 @@ include Dependencies # -# End of "$Id: Makefile 5354 2006-03-29 20:55:15Z mike $". +# End of "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $". # diff --git a/cups/custom.c b/cups/custom.c index 1d4482665..23008e93c 100644 --- a/cups/custom.c +++ b/cups/custom.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -34,6 +34,10 @@ * * 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. */ /* @@ -46,6 +50,8 @@ /* * 'ppdFindCustomOption()' - Find a custom option. + * + * @since CUPS 1.2@ */ ppd_coption_t * /* O - Custom option or NULL */ @@ -65,6 +71,8 @@ ppdFindCustomOption(ppd_file_t *ppd, /* I - PPD file */ /* * 'ppdFindCustomParam()' - Find a parameter for a custom option. + * + * @since CUPS 1.2@ */ ppd_cparam_t * /* O - Custom parameter or NULL */ @@ -84,6 +92,8 @@ ppdFindCustomParam(ppd_coption_t *opt, /* I - Custom option */ /* * 'ppdFirstCustomParam()' - Return the first parameter for a custom option. + * + * @since CUPS 1.2@ */ ppd_cparam_t * /* O - Custom parameter or NULL */ @@ -98,6 +108,8 @@ ppdFirstCustomParam(ppd_coption_t *opt) /* I - Custom option */ /* * 'ppdNextCustomParam()' - Return the next parameter for a custom option. + * + * @since CUPS 1.2@ */ ppd_cparam_t * /* O - Custom parameter or NULL */ @@ -111,5 +123,5 @@ ppdNextCustomParam(ppd_coption_t *opt) /* I - Custom option */ /* - * 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 $". */ diff --git a/cups/getifaddrs.c b/cups/getifaddrs.c new file mode 100644 index 000000000..6cb448d61 --- /dev/null +++ b/cups/getifaddrs.c @@ -0,0 +1,275 @@ +/* + * "$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 $". + */ diff --git a/cups/http-addr.c b/cups/http-addr.c index d3c100fbd..f0d5fb37e 100644 --- a/cups/http-addr.c +++ b/cups/http-addr.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -52,6 +52,9 @@ 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))) @@ -76,6 +79,12 @@ int /* O - 1 if equal, 0 if not */ 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); @@ -102,6 +111,9 @@ httpAddrEqual(const http_addr_t *addr1, /* I - First address */ 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)); @@ -131,6 +143,9 @@ int /* O - 1 if local host, 0 otherwise */ 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))) @@ -508,6 +523,9 @@ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */ struct hostent *host; /* Host entry to get FQDN */ + if (!s || slen <= 1) + return (NULL); + if (http) { if (http->hostname[0] == '/') @@ -521,7 +539,8 @@ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */ * Get the hostname... */ - gethostname(s, slen); + if (gethostname(s, slen) < 0) + strlcpy(s, "localhost", slen); if (!strchr(s, '.')) { @@ -529,7 +548,7 @@ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */ * 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); } } @@ -543,5 +562,5 @@ httpGetHostname(http_t *http, /* I - HTTP connection or NULL */ /* - * 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 $". */ diff --git a/cups/http-private.h b/cups/http-private.h index 0a2927f6a..d74f2beea 100644 --- a/cups/http-private.h +++ b/cups/http-private.h @@ -1,5 +1,5 @@ /* - * "$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). * @@ -98,7 +98,11 @@ typedef struct # 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 @@ -129,8 +133,46 @@ extern const char *_cups_hstrerror(int error); 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 $". */ diff --git a/cups/http.c b/cups/http.c index a8ec36a02..2e96795f0 100644 --- a/cups/http.c +++ b/cups/http.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -867,7 +867,11 @@ httpGets(char *line, /* I - Line to read into */ */ if (!http->blocking && !http_wait(http, 1000)) + { + DEBUG_puts("httpGets: Timed out!"); + http->error = ETIMEDOUT; return (NULL); + } #ifdef HAVE_SSL if (http->tls) @@ -2041,7 +2045,7 @@ http_read_ssl(http_t *http, /* I - HTTP connection */ 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) { @@ -2217,15 +2221,16 @@ static int /* O - Status of connection */ 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 */ @@ -2262,9 +2267,7 @@ http_setup_ssl(http_t *http) /* I - HTTP connection */ } # 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; @@ -2303,45 +2306,51 @@ http_setup_ssl(http_t *http) /* I - HTTP connection */ 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); } @@ -2359,11 +2368,11 @@ http_setup_ssl(http_t *http) /* I - HTTP connection */ */ 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); @@ -2374,9 +2383,9 @@ http_shutdown_ssl(http_t *http) /* I - HTTP connection */ 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); @@ -2389,10 +2398,20 @@ http_shutdown_ssl(http_t *http) /* I - HTTP connection */ 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; @@ -2405,11 +2424,11 @@ http_shutdown_ssl(http_t *http) /* I - HTTP connection */ * '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)); @@ -2529,7 +2548,7 @@ http_wait(http_t *http, /* I - HTTP connection */ # 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 */ } @@ -2572,6 +2591,8 @@ http_wait(http_t *http, /* I - HTTP connection */ { 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; @@ -2581,6 +2602,8 @@ http_wait(http_t *http, /* I - HTTP connection */ } 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); @@ -2590,6 +2613,8 @@ http_wait(http_t *http, /* I - HTTP connection */ FD_CLR(http->fd, http->input_set); + DEBUG_printf(("http_wait: returning with nfds=%d...\n", nfds)); + return (nfds > 0); } @@ -2745,7 +2770,7 @@ http_write_ssl(http_t *http, /* I - HTTP connection */ 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) { @@ -2777,5 +2802,5 @@ http_write_ssl(http_t *http, /* I - HTTP connection */ /* - * 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 $". */ diff --git a/cups/ipp.c b/cups/ipp.c index cc109b7cc..53da93e9b 100644 --- a/cups/ipp.c +++ b/cups/ipp.c @@ -1,5 +1,5 @@ /* - * "$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). @@ -1034,6 +1034,7 @@ ippReadIO(void *src, /* I - Data source */ 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); @@ -1527,6 +1528,8 @@ ippReadIO(void *src, /* I - Data source */ break; /* anti-compiler-warning-code */ } + DEBUG_printf(("ippReadIO: returning ipp->state=%d!\n", ipp->state)); + return (ipp->state); } @@ -1672,7 +1675,7 @@ ippWriteIO(void *dst, /* I - Destination */ 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); } } @@ -1686,9 +1689,9 @@ ippWriteIO(void *dst, /* I - Destination */ 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... @@ -1720,7 +1723,7 @@ ippWriteIO(void *dst, /* I - Destination */ 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) @@ -1751,8 +1754,8 @@ ippWriteIO(void *dst, /* I - Destination */ * 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; @@ -1775,11 +1778,11 @@ ippWriteIO(void *dst, /* I - Destination */ * 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; @@ -1810,7 +1813,7 @@ ippWriteIO(void *dst, /* I - Destination */ { 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); } @@ -1854,7 +1857,7 @@ ippWriteIO(void *dst, /* I - Destination */ { 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); } @@ -1905,15 +1908,15 @@ ippWriteIO(void *dst, /* I - Destination */ * 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); } @@ -1933,14 +1936,14 @@ ippWriteIO(void *dst, /* I - Destination */ 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); } @@ -1977,7 +1980,7 @@ ippWriteIO(void *dst, /* I - Destination */ { 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); } @@ -2020,7 +2023,7 @@ ippWriteIO(void *dst, /* I - Destination */ { 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); } @@ -2071,7 +2074,7 @@ ippWriteIO(void *dst, /* I - Destination */ { 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); } @@ -2128,7 +2131,7 @@ ippWriteIO(void *dst, /* I - Destination */ { 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); } @@ -2165,7 +2168,7 @@ ippWriteIO(void *dst, /* I - Destination */ { 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); } @@ -2226,7 +2229,7 @@ ippWriteIO(void *dst, /* I - Destination */ { 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); } @@ -2254,7 +2257,7 @@ ippWriteIO(void *dst, /* I - Destination */ 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); } @@ -2287,7 +2290,7 @@ ippWriteIO(void *dst, /* I - Destination */ { 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); } @@ -2315,7 +2318,7 @@ ippWriteIO(void *dst, /* I - Destination */ { 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); } @@ -2342,11 +2345,11 @@ ippWriteIO(void *dst, /* I - Destination */ 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... @@ -2380,7 +2383,7 @@ ippWriteIO(void *dst, /* I - Destination */ 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); } @@ -2806,14 +2809,14 @@ ipp_write_file(int *fd, /* I - File descriptor */ */ 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); } @@ -2821,5 +2824,5 @@ _ipp_free(ipp_attribute_t *attr) /* I - Attribute to free */ /* - * 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 $". */ diff --git a/cups/localize.c b/cups/localize.c index 97662b7be..b07609bbb 100644 --- a/cups/localize.c +++ b/cups/localize.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -56,6 +56,8 @@ static const char *ppd_text(ppd_file_t *ppd, const char *keyword, /* * 'ppdLocalize()' - Localize the PPD file to the current locale. + * + * @since CUPS 1.2@ */ int /* O - 0 on success, -1 on error */ @@ -183,5 +185,5 @@ ppd_text(ppd_file_t *ppd, /* I - PPD file */ /* - * 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 $". */ diff --git a/cups/request.c b/cups/request.c index 4839bd3f1..9a9161d3d 100644 --- a/cups/request.c +++ b/cups/request.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -118,7 +118,7 @@ cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */ ippDelete(request); - _cupsSetError(IPP_NOT_POSSIBLE, NULL); + _cupsSetError(IPP_NOT_POSSIBLE, strerror(EISDIR)); return (NULL); } @@ -278,10 +278,15 @@ cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */ } 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 @@ -328,20 +333,21 @@ cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */ 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; + } } } @@ -463,5 +469,5 @@ _cupsSetError(ipp_status_t status, /* I - IPP status code */ /* - * 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 $". */ diff --git a/cups/testi18n.c b/cups/testi18n.c index 8392a65fe..0fc439793 100644 --- a/cups/testi18n.c +++ b/cups/testi18n.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -23,9 +23,8 @@ * * 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. */ /* @@ -36,6 +35,7 @@ #include <stdlib.h> #include <errno.h> #include <time.h> +#include <unistd.h> #include "i18n.h" #include "string.h" @@ -46,7 +46,6 @@ */ static void print_utf8(const char *msg, const cups_utf8_t *src); -static void print_utf32(const char *msg, const cups_utf32_t *src); /* @@ -81,19 +80,22 @@ main(int argc, /* I - Argument Count */ 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. */ @@ -238,7 +240,7 @@ main(int argc, /* I - Argument Count */ 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 ++; @@ -289,7 +291,7 @@ main(int argc, /* I - Argument Count */ 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 ++; @@ -335,7 +337,7 @@ main(int argc, /* I - Argument Count */ 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 ++; @@ -381,7 +383,7 @@ main(int argc, /* I - Argument Count */ 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 ++; @@ -427,7 +429,7 @@ main(int argc, /* I - Argument Count */ 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 ++; @@ -473,7 +475,7 @@ main(int argc, /* I - Argument Count */ 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 ++; @@ -554,23 +556,5 @@ print_utf8(const char *msg, /* I - Message String */ /* - * '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 $" */ diff --git a/doc/Makefile b/doc/Makefile index 5562d2a8b..e5d8b8571 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,5 +1,5 @@ # -# "$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). # @@ -160,6 +160,7 @@ HELPFILES = \ 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 \ diff --git a/doc/help/api-ppd.html b/doc/help/api-ppd.html index 139169bd7..a3949abea 100644 --- a/doc/help/api-ppd.html +++ b/doc/help/api-ppd.html @@ -189,14 +189,19 @@ library:</p> <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> @@ -515,6 +520,50 @@ ppdFindChoice( <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> @@ -579,6 +628,26 @@ ppdFindOption( <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. @@ -643,6 +712,26 @@ ppdLastError( <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> @@ -688,6 +777,26 @@ ppdMarkOption( <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. diff --git a/doc/help/ref-client-conf.html b/doc/help/ref-client-conf.html index 762edf265..20eac9629 100644 --- a/doc/help/ref-client-conf.html +++ b/doc/help/ref-client-conf.html @@ -5,58 +5,49 @@ </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> diff --git a/doc/help/ref-snmp-conf.html b/doc/help/ref-snmp-conf.html new file mode 100644 index 000000000..92d8f375a --- /dev/null +++ b/doc/help/ref-snmp-conf.html @@ -0,0 +1,100 @@ +<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> diff --git a/doc/pl/images/button-accept-jobs.gif b/doc/pl/images/button-accept-jobs.gif Binary files differnew file mode 100644 index 000000000..5b8cd5b21 --- /dev/null +++ b/doc/pl/images/button-accept-jobs.gif diff --git a/doc/pl/images/button-add-class.gif b/doc/pl/images/button-add-class.gif Binary files differnew file mode 100644 index 000000000..ce7ea6ccf --- /dev/null +++ b/doc/pl/images/button-add-class.gif diff --git a/doc/pl/images/button-add-printer.gif b/doc/pl/images/button-add-printer.gif Binary files differnew file mode 100644 index 000000000..0f284487f --- /dev/null +++ b/doc/pl/images/button-add-printer.gif diff --git a/doc/pl/images/button-add-this-printer.gif b/doc/pl/images/button-add-this-printer.gif Binary files differnew file mode 100644 index 000000000..dc00856bd --- /dev/null +++ b/doc/pl/images/button-add-this-printer.gif diff --git a/doc/pl/images/button-cancel-all-jobs.gif b/doc/pl/images/button-cancel-all-jobs.gif Binary files differnew file mode 100644 index 000000000..84e724b25 --- /dev/null +++ b/doc/pl/images/button-cancel-all-jobs.gif diff --git a/doc/pl/images/button-cancel-job.gif b/doc/pl/images/button-cancel-job.gif Binary files differnew file mode 100644 index 000000000..2d122bac5 --- /dev/null +++ b/doc/pl/images/button-cancel-job.gif diff --git a/doc/pl/images/button-change-settings.gif b/doc/pl/images/button-change-settings.gif Binary files differnew file mode 100644 index 000000000..73de99527 --- /dev/null +++ b/doc/pl/images/button-change-settings.gif diff --git a/doc/pl/images/button-clean-print-heads.gif b/doc/pl/images/button-clean-print-heads.gif Binary files differnew file mode 100644 index 000000000..2f45608d8 --- /dev/null +++ b/doc/pl/images/button-clean-print-heads.gif diff --git a/doc/pl/images/button-clear.gif b/doc/pl/images/button-clear.gif Binary files differnew file mode 100644 index 000000000..e15a4bb3d --- /dev/null +++ b/doc/pl/images/button-clear.gif diff --git a/doc/pl/images/button-continue.gif b/doc/pl/images/button-continue.gif Binary files differnew file mode 100644 index 000000000..93f849041 --- /dev/null +++ b/doc/pl/images/button-continue.gif diff --git a/doc/pl/images/button-delete-class.gif b/doc/pl/images/button-delete-class.gif Binary files differnew file mode 100644 index 000000000..934b8d66b --- /dev/null +++ b/doc/pl/images/button-delete-class.gif diff --git a/doc/pl/images/button-delete-printer.gif b/doc/pl/images/button-delete-printer.gif Binary files differnew file mode 100644 index 000000000..f7c698418 --- /dev/null +++ b/doc/pl/images/button-delete-printer.gif diff --git a/doc/pl/images/button-edit-configuration-file.gif b/doc/pl/images/button-edit-configuration-file.gif Binary files differnew file mode 100644 index 000000000..89fd8a7d6 --- /dev/null +++ b/doc/pl/images/button-edit-configuration-file.gif diff --git a/doc/pl/images/button-export-samba.gif b/doc/pl/images/button-export-samba.gif Binary files differnew file mode 100644 index 000000000..c6c333619 --- /dev/null +++ b/doc/pl/images/button-export-samba.gif diff --git a/doc/pl/images/button-help.gif b/doc/pl/images/button-help.gif Binary files differnew file mode 100644 index 000000000..d2d4f8530 --- /dev/null +++ b/doc/pl/images/button-help.gif diff --git a/doc/pl/images/button-hold-job.gif b/doc/pl/images/button-hold-job.gif Binary files differnew file mode 100644 index 000000000..2ab556492 --- /dev/null +++ b/doc/pl/images/button-hold-job.gif diff --git a/doc/pl/images/button-manage-classes.gif b/doc/pl/images/button-manage-classes.gif Binary files differnew file mode 100644 index 000000000..c758f9802 --- /dev/null +++ b/doc/pl/images/button-manage-classes.gif diff --git a/doc/pl/images/button-manage-jobs.gif b/doc/pl/images/button-manage-jobs.gif Binary files differnew file mode 100644 index 000000000..7aefeddaf --- /dev/null +++ b/doc/pl/images/button-manage-jobs.gif diff --git a/doc/pl/images/button-manage-printers.gif b/doc/pl/images/button-manage-printers.gif Binary files differnew file mode 100644 index 000000000..f884f7f60 --- /dev/null +++ b/doc/pl/images/button-manage-printers.gif diff --git a/doc/pl/images/button-manage-server.gif b/doc/pl/images/button-manage-server.gif Binary files differnew file mode 100644 index 000000000..ba6e31cdc --- /dev/null +++ b/doc/pl/images/button-manage-server.gif diff --git a/doc/pl/images/button-modify-class.gif b/doc/pl/images/button-modify-class.gif Binary files differnew file mode 100644 index 000000000..fcf5f6d3e --- /dev/null +++ b/doc/pl/images/button-modify-class.gif diff --git a/doc/pl/images/button-modify-printer.gif b/doc/pl/images/button-modify-printer.gif Binary files differnew file mode 100644 index 000000000..e3d534663 --- /dev/null +++ b/doc/pl/images/button-modify-printer.gif diff --git a/doc/pl/images/button-move-job.gif b/doc/pl/images/button-move-job.gif Binary files differnew file mode 100644 index 000000000..02ce3300d --- /dev/null +++ b/doc/pl/images/button-move-job.gif diff --git a/doc/pl/images/button-move-jobs.gif b/doc/pl/images/button-move-jobs.gif Binary files differnew file mode 100644 index 000000000..36029ac30 --- /dev/null +++ b/doc/pl/images/button-move-jobs.gif diff --git a/doc/pl/images/button-print-self-test-page.gif b/doc/pl/images/button-print-self-test-page.gif Binary files differnew file mode 100644 index 000000000..bcea1ba01 --- /dev/null +++ b/doc/pl/images/button-print-self-test-page.gif diff --git a/doc/pl/images/button-print-test-page.gif b/doc/pl/images/button-print-test-page.gif Binary files differnew file mode 100644 index 000000000..57ac13be7 --- /dev/null +++ b/doc/pl/images/button-print-test-page.gif diff --git a/doc/pl/images/button-publish-printer.gif b/doc/pl/images/button-publish-printer.gif Binary files differnew file mode 100644 index 000000000..5c026a873 --- /dev/null +++ b/doc/pl/images/button-publish-printer.gif diff --git a/doc/pl/images/button-reject-jobs.gif b/doc/pl/images/button-reject-jobs.gif Binary files differnew file mode 100644 index 000000000..a81848bde --- /dev/null +++ b/doc/pl/images/button-reject-jobs.gif diff --git a/doc/pl/images/button-release-job.gif b/doc/pl/images/button-release-job.gif Binary files differnew file mode 100644 index 000000000..d8a82f092 --- /dev/null +++ b/doc/pl/images/button-release-job.gif diff --git a/doc/pl/images/button-restart-job.gif b/doc/pl/images/button-restart-job.gif Binary files differnew file mode 100644 index 000000000..42b7568ec --- /dev/null +++ b/doc/pl/images/button-restart-job.gif diff --git a/doc/pl/images/button-save-changes.gif b/doc/pl/images/button-save-changes.gif Binary files differnew file mode 100644 index 000000000..2f1fee170 --- /dev/null +++ b/doc/pl/images/button-save-changes.gif diff --git a/doc/pl/images/button-search.gif b/doc/pl/images/button-search.gif Binary files differnew file mode 100644 index 000000000..1bc194527 --- /dev/null +++ b/doc/pl/images/button-search.gif diff --git a/doc/pl/images/button-set-allowed-users.gif b/doc/pl/images/button-set-allowed-users.gif Binary files differnew file mode 100644 index 000000000..cd7709ef5 --- /dev/null +++ b/doc/pl/images/button-set-allowed-users.gif diff --git a/doc/pl/images/button-set-as-default.gif b/doc/pl/images/button-set-as-default.gif Binary files differnew file mode 100644 index 000000000..203d09734 --- /dev/null +++ b/doc/pl/images/button-set-as-default.gif diff --git a/doc/pl/images/button-set-printer-options.gif b/doc/pl/images/button-set-printer-options.gif Binary files differnew file mode 100644 index 000000000..6610735e4 --- /dev/null +++ b/doc/pl/images/button-set-printer-options.gif diff --git a/doc/pl/images/button-show-active.gif b/doc/pl/images/button-show-active.gif Binary files differnew file mode 100644 index 000000000..82751977d --- /dev/null +++ b/doc/pl/images/button-show-active.gif diff --git a/doc/pl/images/button-show-all.gif b/doc/pl/images/button-show-all.gif Binary files differnew file mode 100644 index 000000000..0473ee626 --- /dev/null +++ b/doc/pl/images/button-show-all.gif diff --git a/doc/pl/images/button-show-completed.gif b/doc/pl/images/button-show-completed.gif Binary files differnew file mode 100644 index 000000000..5481f4d9a --- /dev/null +++ b/doc/pl/images/button-show-completed.gif diff --git a/doc/pl/images/button-show-next.gif b/doc/pl/images/button-show-next.gif Binary files differnew file mode 100644 index 000000000..3fdf85798 --- /dev/null +++ b/doc/pl/images/button-show-next.gif diff --git a/doc/pl/images/button-show-previous.gif b/doc/pl/images/button-show-previous.gif Binary files differnew file mode 100644 index 000000000..8a6f8c4cf --- /dev/null +++ b/doc/pl/images/button-show-previous.gif diff --git a/doc/pl/images/button-sort-ascending.gif b/doc/pl/images/button-sort-ascending.gif Binary files differnew file mode 100644 index 000000000..5a88283f3 --- /dev/null +++ b/doc/pl/images/button-sort-ascending.gif diff --git a/doc/pl/images/button-sort-descending.gif b/doc/pl/images/button-sort-descending.gif Binary files differnew file mode 100644 index 000000000..61c85de29 --- /dev/null +++ b/doc/pl/images/button-sort-descending.gif diff --git a/doc/pl/images/button-start-class.gif b/doc/pl/images/button-start-class.gif Binary files differnew file mode 100644 index 000000000..bdcc28aae --- /dev/null +++ b/doc/pl/images/button-start-class.gif diff --git a/doc/pl/images/button-start-printer.gif b/doc/pl/images/button-start-printer.gif Binary files differnew file mode 100644 index 000000000..b39d67e96 --- /dev/null +++ b/doc/pl/images/button-start-printer.gif diff --git a/doc/pl/images/button-stop-class.gif b/doc/pl/images/button-stop-class.gif Binary files differnew file mode 100644 index 000000000..8031731a4 --- /dev/null +++ b/doc/pl/images/button-stop-class.gif diff --git a/doc/pl/images/button-stop-printer.gif b/doc/pl/images/button-stop-printer.gif Binary files differnew file mode 100644 index 000000000..ce485f3a1 --- /dev/null +++ b/doc/pl/images/button-stop-printer.gif diff --git a/doc/pl/images/button-unpublish-printer.gif b/doc/pl/images/button-unpublish-printer.gif Binary files differnew file mode 100644 index 000000000..60a5b14eb --- /dev/null +++ b/doc/pl/images/button-unpublish-printer.gif diff --git a/doc/pl/images/button-use-default-config.gif b/doc/pl/images/button-use-default-config.gif Binary files differnew file mode 100644 index 000000000..47697cde8 --- /dev/null +++ b/doc/pl/images/button-use-default-config.gif diff --git a/doc/pl/images/button-view-access-log.gif b/doc/pl/images/button-view-access-log.gif Binary files differnew file mode 100644 index 000000000..5d89af521 --- /dev/null +++ b/doc/pl/images/button-view-access-log.gif diff --git a/doc/pl/images/button-view-error-log.gif b/doc/pl/images/button-view-error-log.gif Binary files differnew file mode 100644 index 000000000..c99078ad8 --- /dev/null +++ b/doc/pl/images/button-view-error-log.gif diff --git a/doc/pl/images/button-view-page-log.gif b/doc/pl/images/button-view-page-log.gif Binary files differnew file mode 100644 index 000000000..ad49a2f4f --- /dev/null +++ b/doc/pl/images/button-view-page-log.gif diff --git a/doc/pl/images/button-view-printable-version.gif b/doc/pl/images/button-view-printable-version.gif Binary files differnew file mode 100644 index 000000000..27ae97c76 --- /dev/null +++ b/doc/pl/images/button-view-printable-version.gif diff --git a/doc/pl/index.html.in b/doc/pl/index.html.in new file mode 100644 index 000000000..012bb6e2c --- /dev/null +++ b/doc/pl/index.html.in @@ -0,0 +1,131 @@ +<!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> diff --git a/doc/sv/images/button-accept-jobs.gif b/doc/sv/images/button-accept-jobs.gif Binary files differnew file mode 100644 index 000000000..06f7e5aa5 --- /dev/null +++ b/doc/sv/images/button-accept-jobs.gif diff --git a/doc/sv/images/button-add-class.gif b/doc/sv/images/button-add-class.gif Binary files differnew file mode 100644 index 000000000..f398d69f9 --- /dev/null +++ b/doc/sv/images/button-add-class.gif diff --git a/doc/sv/images/button-add-printer.gif b/doc/sv/images/button-add-printer.gif Binary files differnew file mode 100644 index 000000000..6a6cc15b7 --- /dev/null +++ b/doc/sv/images/button-add-printer.gif diff --git a/doc/sv/images/button-add-this-printer.gif b/doc/sv/images/button-add-this-printer.gif Binary files differnew file mode 100644 index 000000000..5e261530e --- /dev/null +++ b/doc/sv/images/button-add-this-printer.gif diff --git a/doc/sv/images/button-cancel-all-jobs.gif b/doc/sv/images/button-cancel-all-jobs.gif Binary files differnew file mode 100644 index 000000000..d09a578c3 --- /dev/null +++ b/doc/sv/images/button-cancel-all-jobs.gif diff --git a/doc/sv/images/button-cancel-job.gif b/doc/sv/images/button-cancel-job.gif Binary files differnew file mode 100644 index 000000000..4a24ac66d --- /dev/null +++ b/doc/sv/images/button-cancel-job.gif diff --git a/doc/sv/images/button-change-settings.gif b/doc/sv/images/button-change-settings.gif Binary files differnew file mode 100644 index 000000000..93ba0abcd --- /dev/null +++ b/doc/sv/images/button-change-settings.gif diff --git a/doc/sv/images/button-clean-print-heads.gif b/doc/sv/images/button-clean-print-heads.gif Binary files differnew file mode 100644 index 000000000..188c1c06a --- /dev/null +++ b/doc/sv/images/button-clean-print-heads.gif diff --git a/doc/sv/images/button-clear.gif b/doc/sv/images/button-clear.gif Binary files differnew file mode 100644 index 000000000..98baad846 --- /dev/null +++ b/doc/sv/images/button-clear.gif diff --git a/doc/sv/images/button-continue.gif b/doc/sv/images/button-continue.gif Binary files differnew file mode 100644 index 000000000..0910b3d00 --- /dev/null +++ b/doc/sv/images/button-continue.gif diff --git a/doc/sv/images/button-delete-class.gif b/doc/sv/images/button-delete-class.gif Binary files differnew file mode 100644 index 000000000..7290222c3 --- /dev/null +++ b/doc/sv/images/button-delete-class.gif diff --git a/doc/sv/images/button-delete-printer.gif b/doc/sv/images/button-delete-printer.gif Binary files differnew file mode 100644 index 000000000..bbf516324 --- /dev/null +++ b/doc/sv/images/button-delete-printer.gif diff --git a/doc/sv/images/button-edit-configuration-file.gif b/doc/sv/images/button-edit-configuration-file.gif Binary files differnew file mode 100644 index 000000000..5f6e50b1a --- /dev/null +++ b/doc/sv/images/button-edit-configuration-file.gif diff --git a/doc/sv/images/button-export-samba.gif b/doc/sv/images/button-export-samba.gif Binary files differnew file mode 100644 index 000000000..ab7e0d6ae --- /dev/null +++ b/doc/sv/images/button-export-samba.gif diff --git a/doc/sv/images/button-help.gif b/doc/sv/images/button-help.gif Binary files differnew file mode 100644 index 000000000..d41880087 --- /dev/null +++ b/doc/sv/images/button-help.gif diff --git a/doc/sv/images/button-hold-job.gif b/doc/sv/images/button-hold-job.gif Binary files differnew file mode 100644 index 000000000..ed2f5e0b1 --- /dev/null +++ b/doc/sv/images/button-hold-job.gif diff --git a/doc/sv/images/button-manage-classes.gif b/doc/sv/images/button-manage-classes.gif Binary files differnew file mode 100644 index 000000000..20062fe55 --- /dev/null +++ b/doc/sv/images/button-manage-classes.gif diff --git a/doc/sv/images/button-manage-jobs.gif b/doc/sv/images/button-manage-jobs.gif Binary files differnew file mode 100644 index 000000000..50b5f65a5 --- /dev/null +++ b/doc/sv/images/button-manage-jobs.gif diff --git a/doc/sv/images/button-manage-printers.gif b/doc/sv/images/button-manage-printers.gif Binary files differnew file mode 100644 index 000000000..e0e2a60df --- /dev/null +++ b/doc/sv/images/button-manage-printers.gif diff --git a/doc/sv/images/button-manage-server.gif b/doc/sv/images/button-manage-server.gif Binary files differnew file mode 100644 index 000000000..f564983b8 --- /dev/null +++ b/doc/sv/images/button-manage-server.gif diff --git a/doc/sv/images/button-modify-class.gif b/doc/sv/images/button-modify-class.gif Binary files differnew file mode 100644 index 000000000..5494dddd7 --- /dev/null +++ b/doc/sv/images/button-modify-class.gif diff --git a/doc/sv/images/button-modify-printer.gif b/doc/sv/images/button-modify-printer.gif Binary files differnew file mode 100644 index 000000000..c4d455645 --- /dev/null +++ b/doc/sv/images/button-modify-printer.gif diff --git a/doc/sv/images/button-move-job.gif b/doc/sv/images/button-move-job.gif Binary files differnew file mode 100644 index 000000000..047a02a5f --- /dev/null +++ b/doc/sv/images/button-move-job.gif diff --git a/doc/sv/images/button-move-jobs.gif b/doc/sv/images/button-move-jobs.gif Binary files differnew file mode 100644 index 000000000..836fdb6c9 --- /dev/null +++ b/doc/sv/images/button-move-jobs.gif diff --git a/doc/sv/images/button-print-self-test-page.gif b/doc/sv/images/button-print-self-test-page.gif Binary files differnew file mode 100644 index 000000000..e3c11e61f --- /dev/null +++ b/doc/sv/images/button-print-self-test-page.gif diff --git a/doc/sv/images/button-print-test-page.gif b/doc/sv/images/button-print-test-page.gif Binary files differnew file mode 100644 index 000000000..4e7cd7089 --- /dev/null +++ b/doc/sv/images/button-print-test-page.gif diff --git a/doc/sv/images/button-publish-printer.gif b/doc/sv/images/button-publish-printer.gif Binary files differnew file mode 100644 index 000000000..ad0d1629b --- /dev/null +++ b/doc/sv/images/button-publish-printer.gif diff --git a/doc/sv/images/button-reject-jobs.gif b/doc/sv/images/button-reject-jobs.gif Binary files differnew file mode 100644 index 000000000..54025f450 --- /dev/null +++ b/doc/sv/images/button-reject-jobs.gif diff --git a/doc/sv/images/button-release-job.gif b/doc/sv/images/button-release-job.gif Binary files differnew file mode 100644 index 000000000..029cc8cd0 --- /dev/null +++ b/doc/sv/images/button-release-job.gif diff --git a/doc/sv/images/button-restart-job.gif b/doc/sv/images/button-restart-job.gif Binary files differnew file mode 100644 index 000000000..d4fa713ad --- /dev/null +++ b/doc/sv/images/button-restart-job.gif diff --git a/doc/sv/images/button-save-changes.gif b/doc/sv/images/button-save-changes.gif Binary files differnew file mode 100644 index 000000000..b33ab6e3a --- /dev/null +++ b/doc/sv/images/button-save-changes.gif diff --git a/doc/sv/images/button-search.gif b/doc/sv/images/button-search.gif Binary files differnew file mode 100644 index 000000000..e248dcec2 --- /dev/null +++ b/doc/sv/images/button-search.gif diff --git a/doc/sv/images/button-set-allowed-users.gif b/doc/sv/images/button-set-allowed-users.gif Binary files differnew file mode 100644 index 000000000..c547b06ef --- /dev/null +++ b/doc/sv/images/button-set-allowed-users.gif diff --git a/doc/sv/images/button-set-as-default.gif b/doc/sv/images/button-set-as-default.gif Binary files differnew file mode 100644 index 000000000..85f162ede --- /dev/null +++ b/doc/sv/images/button-set-as-default.gif diff --git a/doc/sv/images/button-set-printer-options.gif b/doc/sv/images/button-set-printer-options.gif Binary files differnew file mode 100644 index 000000000..85d7021a5 --- /dev/null +++ b/doc/sv/images/button-set-printer-options.gif diff --git a/doc/sv/images/button-show-active.gif b/doc/sv/images/button-show-active.gif Binary files differnew file mode 100644 index 000000000..08db0e150 --- /dev/null +++ b/doc/sv/images/button-show-active.gif diff --git a/doc/sv/images/button-show-all.gif b/doc/sv/images/button-show-all.gif Binary files differnew file mode 100644 index 000000000..981ad03df --- /dev/null +++ b/doc/sv/images/button-show-all.gif diff --git a/doc/sv/images/button-show-completed.gif b/doc/sv/images/button-show-completed.gif Binary files differnew file mode 100644 index 000000000..c24869233 --- /dev/null +++ b/doc/sv/images/button-show-completed.gif diff --git a/doc/sv/images/button-show-next.gif b/doc/sv/images/button-show-next.gif Binary files differnew file mode 100644 index 000000000..47ea52c6d --- /dev/null +++ b/doc/sv/images/button-show-next.gif diff --git a/doc/sv/images/button-show-previous.gif b/doc/sv/images/button-show-previous.gif Binary files differnew file mode 100644 index 000000000..92f5a9b3d --- /dev/null +++ b/doc/sv/images/button-show-previous.gif diff --git a/doc/sv/images/button-sort-ascending.gif b/doc/sv/images/button-sort-ascending.gif Binary files differnew file mode 100644 index 000000000..161b358f3 --- /dev/null +++ b/doc/sv/images/button-sort-ascending.gif diff --git a/doc/sv/images/button-sort-descending.gif b/doc/sv/images/button-sort-descending.gif Binary files differnew file mode 100644 index 000000000..789bd32ef --- /dev/null +++ b/doc/sv/images/button-sort-descending.gif diff --git a/doc/sv/images/button-start-class.gif b/doc/sv/images/button-start-class.gif Binary files differnew file mode 100644 index 000000000..7aa12e82f --- /dev/null +++ b/doc/sv/images/button-start-class.gif diff --git a/doc/sv/images/button-start-printer.gif b/doc/sv/images/button-start-printer.gif Binary files differnew file mode 100644 index 000000000..ace2849c0 --- /dev/null +++ b/doc/sv/images/button-start-printer.gif diff --git a/doc/sv/images/button-stop-class.gif b/doc/sv/images/button-stop-class.gif Binary files differnew file mode 100644 index 000000000..151320f15 --- /dev/null +++ b/doc/sv/images/button-stop-class.gif diff --git a/doc/sv/images/button-stop-printer.gif b/doc/sv/images/button-stop-printer.gif Binary files differnew file mode 100644 index 000000000..3ace12685 --- /dev/null +++ b/doc/sv/images/button-stop-printer.gif diff --git a/doc/sv/images/button-unpublish-printer.gif b/doc/sv/images/button-unpublish-printer.gif Binary files differnew file mode 100644 index 000000000..4511829e8 --- /dev/null +++ b/doc/sv/images/button-unpublish-printer.gif diff --git a/doc/sv/images/button-use-default-config.gif b/doc/sv/images/button-use-default-config.gif Binary files differnew file mode 100644 index 000000000..8d5f684da --- /dev/null +++ b/doc/sv/images/button-use-default-config.gif diff --git a/doc/sv/images/button-view-access-log.gif b/doc/sv/images/button-view-access-log.gif Binary files differnew file mode 100644 index 000000000..4fa9a55b1 --- /dev/null +++ b/doc/sv/images/button-view-access-log.gif diff --git a/doc/sv/images/button-view-error-log.gif b/doc/sv/images/button-view-error-log.gif Binary files differnew file mode 100644 index 000000000..966edf26b --- /dev/null +++ b/doc/sv/images/button-view-error-log.gif diff --git a/doc/sv/images/button-view-page-log.gif b/doc/sv/images/button-view-page-log.gif Binary files differnew file mode 100644 index 000000000..29d5465dd --- /dev/null +++ b/doc/sv/images/button-view-page-log.gif diff --git a/doc/sv/images/button-view-printable-version.gif b/doc/sv/images/button-view-printable-version.gif Binary files differnew file mode 100644 index 000000000..343cbeaed --- /dev/null +++ b/doc/sv/images/button-view-printable-version.gif diff --git a/doc/sv/index.html.in b/doc/sv/index.html.in new file mode 100644 index 000000000..4f6244118 --- /dev/null +++ b/doc/sv/index.html.in @@ -0,0 +1,137 @@ +<!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> diff --git a/driver/testdriver.c b/driver/testdriver.c new file mode 100644 index 000000000..eab00dffc --- /dev/null +++ b/driver/testdriver.c @@ -0,0 +1,179 @@ +/* + * "$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 $". + */ diff --git a/filter/image-png.c b/filter/image-png.c index d240faca2..45faeb5f9 100644 --- a/filter/image-png.c +++ b/filter/image-png.c @@ -1,9 +1,9 @@ /* - * "$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 @@ -55,6 +55,15 @@ _cupsImageReadPNG( 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 */ @@ -83,44 +92,48 @@ _cupsImageReadPNG( 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) { @@ -154,8 +167,8 @@ _cupsImageReadPNG( * 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); @@ -166,8 +179,8 @@ _cupsImageReadPNG( * 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); @@ -191,7 +204,7 @@ _cupsImageReadPNG( * 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); @@ -247,7 +260,7 @@ _cupsImageReadPNG( 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; @@ -255,7 +268,7 @@ _cupsImageReadPNG( } png_read_end(pp, info); - png_read_destroy(pp, info, NULL); + png_destroy_read_struct(&pp, &info, NULL); fclose(fp); free(in); @@ -267,5 +280,5 @@ _cupsImageReadPNG( /* - * 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 $". */ diff --git a/locale/Makefile b/locale/Makefile index c8de26b4a..815645428 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -1,5 +1,5 @@ # -# "$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). # @@ -54,8 +54,10 @@ depend: 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 @@ -108,5 +110,5 @@ translate.o: ../cups/http.h ../cups/i18n.h ../cups/language.h ../cups/string.h # -# End of "$Id: Makefile 5335 2006-03-24 02:56:20Z mike $". +# End of "$Id: Makefile 5449 2006-04-22 04:05:45Z mike $". # diff --git a/locale/cups.pot b/locale/cups.pot index 9f062970e..6b9ac5ba0 100644 --- a/locale/cups.pot +++ b/locale/cups.pot @@ -29,7 +29,7 @@ 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" +"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" diff --git a/locale/cups_es.po b/locale/cups_es.po index fb94d4d55..bbcb8a2be 100644 --- a/locale/cups_es.po +++ b/locale/cups_es.po @@ -22,13 +22,13 @@ 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" +"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" @@ -2863,8 +2863,8 @@ msgid "" "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'!" @@ -2988,6 +2988,5 @@ msgstr "" "\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" diff --git a/locale/cups_ja.po b/locale/cups_ja.po index 6f151ba28..3b68a7d15 100644 --- a/locale/cups_ja.po +++ b/locale/cups_ja.po @@ -25,7 +25,7 @@ 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" +"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" @@ -2798,7 +2798,9 @@ msgstr "ジョブ #%d はすでに完了しています - キャンセルでき 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'!" @@ -2922,4 +2924,5 @@ msgstr "" "\n" " -h プログラムの使い方を表示する\n" "\n" -" 注意: このプログラムは DSC コメントを検証するだけで、PostScript 自身を検証するものではありません。\n" +" 注意: このプログラムは DSC コメントを検証するだけで、PostScript 自身を検" +"証するものではありません。\n" diff --git a/locale/cups_sv.po b/locale/cups_sv.po new file mode 100644 index 000000000..27d0ed065 --- /dev/null +++ b/locale/cups_sv.po @@ -0,0 +1,2813 @@ +# 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" + diff --git a/man/Makefile b/man/Makefile index 7976f952c..d41bb0efd 100644 --- a/man/Makefile +++ b/man/Makefile @@ -1,5 +1,5 @@ # -# "$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). # @@ -42,6 +42,7 @@ MAN1 = cancel.$(MAN1EXT) \ lpstat.$(MAN1EXT) MAN5 = classes.conf.$(MAN5EXT) \ client.conf.$(MAN5EXT) \ + cups-snmp.conf.$(MAN5EXT) \ cupsd.conf.$(MAN5EXT) \ mime.convs.$(MAN5EXT) \ mime.types.$(MAN5EXT) \ @@ -181,5 +182,5 @@ mantohtml: mantohtml.o # -# End of "$Id: Makefile 5317 2006-03-21 02:35:37Z mike $". +# End of "$Id: Makefile 5428 2006-04-18 20:45:30Z mike $". # diff --git a/man/cups-lpd.man.in b/man/cups-lpd.man.in index 7529f2d9b..14cd8258d 100644 --- a/man/cups-lpd.man.in +++ b/man/cups-lpd.man.in @@ -1,5 +1,5 @@ .\" -.\" "$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). .\" @@ -21,12 +21,12 @@ .\" 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 @@ -68,6 +68,12 @@ named \fI/etc/xinetd.d/cups\fR containing the following lines: .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 @@ -117,5 +123,5 @@ http://localhost:631/help .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 $". .\" diff --git a/man/cups-snmp.conf.man b/man/cups-snmp.conf.man new file mode 100644 index 000000000..a0ad520e5 --- /dev/null +++ b/man/cups-snmp.conf.man @@ -0,0 +1,77 @@ +.\" +.\" "$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$". +.\" diff --git a/man/cupsaddsmb.man.in b/man/cupsaddsmb.man.in index 6ae23fa6d..054ee9798 100644 --- a/man/cupsaddsmb.man.in +++ b/man/cupsaddsmb.man.in @@ -1,5 +1,5 @@ .\" -.\" "$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). .\" @@ -21,9 +21,10 @@ .\" 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 @@ -42,12 +43,14 @@ cupsaddsmb \- export printers to samba for windows clients ] [ -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 @@ -75,6 +78,7 @@ Specifies a different CUPS server to use. .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 @@ -136,6 +140,10 @@ Once you have extracted the driver files, copy them to the 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 @@ -162,6 +170,10 @@ Once you have extracted the driver files, copy them to the 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 @@ -171,8 +183,9 @@ Adobe web site (http://www.adobe.com). 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] @@ -182,13 +195,19 @@ Once you have extracted the driver files, copy them to the 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 $". .\" diff --git a/packaging/cups.list.in b/packaging/cups.list.in index 4218ed239..9591021d7 100644 --- a/packaging/cups.list.in +++ b/packaging/cups.list.in @@ -1,5 +1,5 @@ # -# "$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). @@ -103,6 +103,12 @@ %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 @@ -190,12 +196,13 @@ f 0755 root sys $SBINDIR/cupsd scheduler/cupsd 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 - @@ -334,6 +341,10 @@ d 0511 root $CUPS_PRIMARY_SYSTEM_GROUP $STATEDIR/certs - 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 - @@ -395,6 +406,12 @@ f 0644 root sys $DATADIR/templates/es templates/es/*.tmpl %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 @@ -403,8 +420,8 @@ d 0755 root $CUPS_GROUP $SERVERROOT/interfaces - 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 - @@ -468,6 +485,16 @@ d 0755 root sys $DOCDIR/ja 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 @@ -523,5 +550,5 @@ f 0644 root sys $AMANDIR/man$MAN8DIR/cups-lpd.$MAN8EXT man/cups-lpd.$MAN8EXT 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 $". # diff --git a/packaging/cups.spec.in b/packaging/cups.spec.in index 11eac813a..bc799e7c0 100644 --- a/packaging/cups.spec.in +++ b/packaging/cups.spec.in @@ -1,5 +1,5 @@ # -# "$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). # @@ -86,6 +86,16 @@ Summary: Common UNIX Printing System - Japanese support 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 @@ -120,6 +130,14 @@ UNIX operating systems. This package provides Spanish 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 @@ -230,6 +248,7 @@ rm -rf $RPM_BUILD_ROOT /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 @@ -372,6 +391,26 @@ rm -rf $RPM_BUILD_ROOT /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 @@ -380,5 +419,5 @@ rm -rf $RPM_BUILD_ROOT # -# 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 $". # diff --git a/scheduler/auth.c b/scheduler/auth.c index 6ece0cd51..e87f201e0 100644 --- a/scheduler/auth.c +++ b/scheduler/auth.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -27,17 +27,19 @@ * 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. @@ -2164,5 +2166,5 @@ to64(char *s, /* O - Output string */ /* - * 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 $". */ diff --git a/scheduler/client.c b/scheduler/client.c index 06ee39340..ffd3e8f61 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -1,5 +1,5 @@ /* - * "$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. * @@ -458,10 +458,12 @@ cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */ 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 */ @@ -530,10 +532,17 @@ cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */ 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; @@ -892,8 +901,8 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ 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; @@ -958,6 +967,10 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ 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 @@ -2564,7 +2577,7 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ * 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); @@ -2618,23 +2631,19 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ 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 " @@ -2643,10 +2652,13 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ } 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) { @@ -2656,30 +2668,17 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ 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) { @@ -2687,7 +2686,7 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ * Perform SSL/TLS handshake */ - while ((error = SSLHandshake(conn)) == errSSLWouldBlock) + while ((error = SSLHandshake(conn->session)) == errSSLWouldBlock) usleep(1000); } @@ -2703,8 +2702,13 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ 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); } @@ -3820,5 +3824,5 @@ send_file(cupsd_client_t *con, /* I - Client connection */ /* - * 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 $". */ diff --git a/scheduler/cups-driverd.c b/scheduler/cups-driverd.c index fd662551d..1e0b1e45b 100644 --- a/scheduler/cups-driverd.c +++ b/scheduler/cups-driverd.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -142,7 +142,7 @@ add_ppd(const char *name, /* I - PPD name */ 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 */ { @@ -656,7 +656,7 @@ load_ppds(const char *d, /* I - Actual directory */ 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? */ @@ -799,7 +799,7 @@ load_ppds(const char *d, /* I - Actual directory */ 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)) { @@ -1113,5 +1113,5 @@ load_drivers(void) /* - * 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 $". */ diff --git a/scheduler/cups-lpd.c b/scheduler/cups-lpd.c index e5b546050..60b68090f 100644 --- a/scheduler/cups-lpd.c +++ b/scheduler/cups-lpd.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -128,6 +128,7 @@ main(int argc, /* I - Number of command-line arguments */ char hostname[256], /* Name of client */ hostip[256], /* IP address */ *hostfamily; /* Address family */ + int hostlookups; /* Do hostname lookups? */ /* @@ -143,39 +144,12 @@ main(int argc, /* I - Number of command-line arguments */ 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); @@ -198,6 +172,11 @@ main(int argc, /* I - Number of command-line arguments */ 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; @@ -208,6 +187,37 @@ main(int argc, /* I - Number of command-line arguments */ 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. */ @@ -1706,5 +1716,5 @@ smart_gets(char *s, /* I - Pointer to line buffer */ /* - * 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 $". */ diff --git a/scheduler/dirsvc.c b/scheduler/dirsvc.c index 72fef6351..e1fd525c0 100644 --- a/scheduler/dirsvc.c +++ b/scheduler/dirsvc.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -799,7 +799,7 @@ cupsdSendBrowseList(void) (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); @@ -1907,7 +1907,7 @@ process_browse_data( 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, @@ -1967,7 +1967,7 @@ process_browse_data( 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); @@ -2010,7 +2010,7 @@ process_browse_data( 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, @@ -2073,7 +2073,7 @@ process_browse_data( 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... @@ -2334,7 +2334,7 @@ process_implicit_classes(void) 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.", @@ -3128,5 +3128,5 @@ slp_url_callback( /* - * 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 $". */ diff --git a/scheduler/ipp.c b/scheduler/ipp.c index e94c7310a..b3a5f58eb 100644 --- a/scheduler/ipp.c +++ b/scheduler/ipp.c @@ -1,5 +1,5 @@ /* - * "$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. * @@ -88,6 +88,7 @@ * 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 @@ -202,6 +203,8 @@ static void set_printer_defaults(cupsd_client_t *con, 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); @@ -5091,14 +5094,12 @@ static void 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); @@ -5122,48 +5123,16 @@ get_devices(cupsd_client_t *con) /* I - Client connection */ 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)) { @@ -5631,15 +5600,14 @@ static void 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); @@ -5664,50 +5632,20 @@ get_ppds(cupsd_client_t *con) /* I - Client connection */ 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)) { @@ -8933,6 +8871,70 @@ stop_printer(cupsd_client_t *con, /* I - Client connection */ /* + * '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. */ @@ -9156,5 +9158,5 @@ validate_user(cupsd_job_t *job, /* I - Job */ /* - * 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 $". */ diff --git a/scheduler/job.c b/scheduler/job.c index d2b1f13af..2f3f5bc54 100644 --- a/scheduler/job.c +++ b/scheduler/job.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -121,12 +121,14 @@ cupsdAddJob(int priority, /* I - Job priority */ 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); @@ -448,9 +450,10 @@ cupsdFinishJob(cupsd_job_t *job) /* I - Job */ 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; @@ -1314,7 +1317,7 @@ cupsdSetJobHoldUntil(cupsd_job_t *job, /* I - Job */ ((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. @@ -1545,9 +1548,10 @@ cupsdStopJob(cupsd_job_t *job, /* I - Job */ 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; @@ -1974,11 +1978,13 @@ load_job_cache(const char *filename) /* I - job.cache filename */ 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); } @@ -2137,6 +2143,7 @@ load_next_job_id(const char *filename) /* I - job.cache filename */ char line[1024], /* Line buffer */ *value; /* Value on line */ int linenum; /* Line number in file */ + int next_job_id; /* NextJobId value from line */ /* @@ -2164,8 +2171,12 @@ load_next_job_id(const char *filename) /* I - job.cache filename */ if (!strcasecmp(line, "NextJobId")) { if (value) - NextJobId = atoi(value); + { + next_job_id = atoi(value); + if (next_job_id > NextJobId) + NextJobId = next_job_id; + } break; } } @@ -2222,11 +2233,13 @@ load_request_root(void) * 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; @@ -2344,8 +2357,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ 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 */ @@ -2393,6 +2405,20 @@ start_job(cupsd_job_t *job, /* I - Job ID */ 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... @@ -2992,33 +3018,32 @@ start_job(cupsd_job_t *job, /* I - Job ID */ 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); @@ -3144,7 +3169,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ 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, @@ -3232,7 +3257,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ 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)); @@ -3271,6 +3296,13 @@ start_job(cupsd_job_t *job, /* I - Job ID */ 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 @@ -3278,13 +3310,6 @@ start_job(cupsd_job_t *job, /* I - Job ID */ 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, @@ -3292,17 +3317,21 @@ start_job(cupsd_job_t *job, /* I - Job ID */ 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) { @@ -3313,12 +3342,6 @@ start_job(cupsd_job_t *job, /* I - Job ID */ 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); @@ -3348,8 +3371,9 @@ start_job(cupsd_job_t *job, /* I - Job ID */ 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); @@ -3387,5 +3411,5 @@ unload_job(cupsd_job_t *job) /* I - Job */ /* - * 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 $". */ diff --git a/scheduler/job.h b/scheduler/job.h index 31dba60d3..93bb774b2 100644 --- a/scheduler/job.h +++ b/scheduler/job.h @@ -1,5 +1,5 @@ /* - * "$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. * @@ -44,9 +44,10 @@ typedef struct cupsd_job_s 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 */ @@ -120,5 +121,5 @@ extern void cupsdUpdateJob(cupsd_job_t *job); /* - * 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 $". */ diff --git a/scheduler/main.c b/scheduler/main.c index 97aa1a121..e9e1a1c23 100644 --- a/scheduler/main.c +++ b/scheduler/main.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -993,11 +993,12 @@ main(int argc, /* I - Number of command-line args */ } /* - * 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... @@ -2246,5 +2247,5 @@ usage(int status) /* O - Exit status */ /* - * 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 $". */ diff --git a/scheduler/mime.c b/scheduler/mime.c index 1de12fe34..9c298e6fc 100644 --- a/scheduler/mime.c +++ b/scheduler/mime.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -97,15 +97,6 @@ mimeDelete(mime_t *mime) /* I - MIME database */ 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... */ @@ -115,6 +106,15 @@ mimeDelete(mime_t *mime) /* I - MIME database */ 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. */ @@ -711,5 +711,5 @@ load_types(mime_t *mime, /* I - MIME database */ /* - * 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 $". */ diff --git a/scheduler/network.c b/scheduler/network.c index 46f3f2655..eb89b1217 100644 --- a/scheduler/network.c +++ b/scheduler/network.c @@ -1,5 +1,5 @@ /* - * "$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. @@ -28,18 +28,15 @@ * 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... @@ -49,44 +46,6 @@ static void cupsdNetIFFree(void); 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. */ @@ -354,241 +313,6 @@ compare_netif(cupsd_netif_t *a, /* I - First 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 $". */ diff --git a/scheduler/statbuf.c b/scheduler/statbuf.c index 120c08914..eb257d787 100644 --- a/scheduler/statbuf.c +++ b/scheduler/statbuf.c @@ -1,5 +1,5 @@ /* - * "$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. @@ -277,7 +277,7 @@ cupsdStatBufUpdate(cupsd_statbuf_t *sb, /* I - Status buffer */ } else { - *loglevel = CUPSD_LOG_ERROR; + *loglevel = CUPSD_LOG_DEBUG; message = sb->buffer; } @@ -330,5 +330,5 @@ cupsdStatBufUpdate(cupsd_statbuf_t *sb, /* I - Status 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 $". */ diff --git a/standards/Makefile b/standards/Makefile index c93db938b..c7bd373fc 100644 --- a/standards/Makefile +++ b/standards/Makefile @@ -1,5 +1,5 @@ # -# "$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). # @@ -113,9 +113,9 @@ uninstall: 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 $". # diff --git a/standards/X.690-0207.pdf b/standards/X.690-0207.pdf Binary files differnew file mode 100644 index 000000000..8f88864a3 --- /dev/null +++ b/standards/X.690-0207.pdf diff --git a/standards/rfc1155.txt b/standards/rfc1155.txt new file mode 100644 index 000000000..0e0f1b540 --- /dev/null +++ b/standards/rfc1155.txt @@ -0,0 +1,1235 @@ + + + + + + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] +
\ No newline at end of file diff --git a/standards/rfc1157.txt b/standards/rfc1157.txt new file mode 100644 index 000000000..262e7eb5b --- /dev/null +++ b/standards/rfc1157.txt @@ -0,0 +1,2019 @@ + + + + + + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] +
\ No newline at end of file diff --git a/standards/rfc2790.txt b/standards/rfc2790.txt new file mode 100644 index 000000000..3b0ddd81b --- /dev/null +++ b/standards/rfc2790.txt @@ -0,0 +1,2803 @@ + + + + + + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + +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] + diff --git a/systemv/cupstestdsc.c b/systemv/cupstestdsc.c index 9e38aa42c..b9d5ac2d3 100644 --- a/systemv/cupstestdsc.c +++ b/systemv/cupstestdsc.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -27,6 +27,9 @@ * * Contents: * + * main() - Main entry for test program. + * check() - Check a file for conformance. + * usage() - Show program usage. */ /* @@ -97,7 +100,7 @@ main(int argc, /* I - Number of command-line args */ /* - * 'check()' - Main entry for test program. + * 'check()' - Check a file for conformance. */ static int /* O - 0 on success, 1 on failure */ @@ -115,6 +118,7 @@ check_file(const char *filename) /* I - File to read from */ 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? */ @@ -149,6 +153,7 @@ check_file(const char *filename) /* I - File to read from */ */ binary = 0; + last_page_number = 0; level = 0; linenum = 0; saw_begin_prolog = 0; @@ -304,7 +309,8 @@ check_file(const char *filename) /* I - File to read from */ { 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")); @@ -315,7 +321,10 @@ check_file(const char *filename) /* I - File to read from */ linenum); } else - saw_page = 1; + { + last_page_number = page_number; + saw_page = 1; + } } else if (!strncmp(line, "%%BeginProlog", 13)) saw_begin_prolog = 1; @@ -443,5 +452,5 @@ usage(void) /* - * 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 $". */ diff --git a/systemv/cupstestppd.c b/systemv/cupstestppd.c index 96ad93d92..f5885d82b 100644 --- a/systemv/cupstestppd.c +++ b/systemv/cupstestppd.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -320,12 +320,8 @@ main(int argc, /* I - Number of command-line arguments */ 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... @@ -1180,6 +1176,21 @@ main(int argc, /* I - Number of command-line arguments */ } } + 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) @@ -1189,9 +1200,40 @@ main(int argc, /* I - Number of command-line arguments */ { 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 " @@ -1687,5 +1729,5 @@ usage(void) /* - * 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 $". */ diff --git a/templates/admin.tmpl b/templates/admin.tmpl index bee5f377c..470faaa77 100644 --- a/templates/admin.tmpl +++ b/templates/admin.tmpl @@ -14,10 +14,10 @@ CLASS="button"></A>:} </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> diff --git a/templates/edit-config.tmpl.in b/templates/edit-config.tmpl.in index d6019d3bd..68c9e0dd0 100644 --- a/templates/edit-config.tmpl.in +++ b/templates/edit-config.tmpl.in @@ -33,6 +33,7 @@ function reset_config() "\\n" + "# Restrict access to the admin pages...\\n" + "<Location /admin>\\n" + +"@ENCRYPTION_REQUIRED\\n" + " Order allow,deny\\n" + " Allow localhost\\n" + "</Location>\\n" + diff --git a/templates/es/admin.tmpl b/templates/es/admin.tmpl index 29816e71d..b80f46f88 100644 --- a/templates/es/admin.tmpl +++ b/templates/es/admin.tmpl @@ -14,10 +14,10 @@ CLASS="button"></A>:} </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> diff --git a/templates/es/edit-config.tmpl.in b/templates/es/edit-config.tmpl.in index 71579b5ef..891d2e562 100644 --- a/templates/es/edit-config.tmpl.in +++ b/templates/es/edit-config.tmpl.in @@ -2,42 +2,43 @@ 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" + @@ -45,22 +46,22 @@ function reset_config() " 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" + diff --git a/templates/ja/admin.tmpl b/templates/ja/admin.tmpl index 7e8b5099b..064028af8 100644 --- a/templates/ja/admin.tmpl +++ b/templates/ja/admin.tmpl @@ -14,10 +14,10 @@ CLASS="button"></A>:} </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> diff --git a/templates/ja/edit-config.tmpl.in b/templates/ja/edit-config.tmpl.in new file mode 100644 index 000000000..0f6b1fadf --- /dev/null +++ b/templates/ja/edit-config.tmpl.in @@ -0,0 +1,91 @@ +<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> diff --git a/templates/pl/add-class.tmpl b/templates/pl/add-class.tmpl new file mode 100644 index 000000000..340068396 --- /dev/null +++ b/templates/pl/add-class.tmpl @@ -0,0 +1,33 @@ +<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> diff --git a/templates/pl/add-printer.tmpl b/templates/pl/add-printer.tmpl new file mode 100644 index 000000000..4dee7d5bc --- /dev/null +++ b/templates/pl/add-printer.tmpl @@ -0,0 +1,28 @@ +<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> diff --git a/templates/pl/admin.tmpl b/templates/pl/admin.tmpl new file mode 100644 index 000000000..4e7c28ee8 --- /dev/null +++ b/templates/pl/admin.tmpl @@ -0,0 +1,75 @@ +<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> diff --git a/templates/pl/choose-device.tmpl b/templates/pl/choose-device.tmpl new file mode 100644 index 000000000..80fdd0208 --- /dev/null +++ b/templates/pl/choose-device.tmpl @@ -0,0 +1,26 @@ +<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> diff --git a/templates/pl/choose-make.tmpl b/templates/pl/choose-make.tmpl new file mode 100644 index 000000000..3f242742c --- /dev/null +++ b/templates/pl/choose-make.tmpl @@ -0,0 +1,42 @@ +<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> diff --git a/templates/pl/choose-model.tmpl b/templates/pl/choose-model.tmpl new file mode 100644 index 000000000..20ace5fa9 --- /dev/null +++ b/templates/pl/choose-model.tmpl @@ -0,0 +1,34 @@ +<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> diff --git a/templates/pl/choose-serial.tmpl b/templates/pl/choose-serial.tmpl new file mode 100644 index 000000000..b70995506 --- /dev/null +++ b/templates/pl/choose-serial.tmpl @@ -0,0 +1,47 @@ +<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> diff --git a/templates/pl/choose-uri.tmpl b/templates/pl/choose-uri.tmpl new file mode 100644 index 000000000..bdef0078c --- /dev/null +++ b/templates/pl/choose-uri.tmpl @@ -0,0 +1,41 @@ +<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> diff --git a/templates/pl/class-added.tmpl b/templates/pl/class-added.tmpl new file mode 100644 index 000000000..a0903d584 --- /dev/null +++ b/templates/pl/class-added.tmpl @@ -0,0 +1 @@ +<P>Grupa <A HREF="/classes/{printer_name}">{printer_name}</A> została pomyślnie dodana. diff --git a/templates/pl/class-confirm.tmpl b/templates/pl/class-confirm.tmpl new file mode 100644 index 000000000..392a8ed4b --- /dev/null +++ b/templates/pl/class-confirm.tmpl @@ -0,0 +1,7 @@ +<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> diff --git a/templates/pl/class-deleted.tmpl b/templates/pl/class-deleted.tmpl new file mode 100644 index 000000000..21e7360b5 --- /dev/null +++ b/templates/pl/class-deleted.tmpl @@ -0,0 +1 @@ +<P>Grupa {printer_name} została pomyślnie usunięta. diff --git a/templates/pl/class-jobs-header.tmpl b/templates/pl/class-jobs-header.tmpl new file mode 100644 index 000000000..7654c73df --- /dev/null +++ b/templates/pl/class-jobs-header.tmpl @@ -0,0 +1 @@ +<H3 CLASS="title">Wydruki</H3> diff --git a/templates/pl/class-modified.tmpl b/templates/pl/class-modified.tmpl new file mode 100644 index 000000000..083882ab9 --- /dev/null +++ b/templates/pl/class-modified.tmpl @@ -0,0 +1 @@ +<P>Grupa <A HREF="/classes/{printer_name}">{printer_name}</A> została pomyślnie zmodyfikowana. diff --git a/templates/pl/classes-header.tmpl b/templates/pl/classes-header.tmpl new file mode 100644 index 000000000..f76eb5b20 --- /dev/null +++ b/templates/pl/classes-header.tmpl @@ -0,0 +1 @@ +<P ALIGN="CENTER">{total=0?Brak grup:Wyświetlam {#printer_name} z {total} grup{total=1?y:}}.</P> diff --git a/templates/pl/classes.tmpl b/templates/pl/classes.tmpl new file mode 100644 index 000000000..a39a17d89 --- /dev/null +++ b/templates/pl/classes.tmpl @@ -0,0 +1,54 @@ +{#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> +}} diff --git a/templates/pl/edit-config.tmpl.in b/templates/pl/edit-config.tmpl.in new file mode 100644 index 000000000..6047e016e --- /dev/null +++ b/templates/pl/edit-config.tmpl.in @@ -0,0 +1,91 @@ +<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> diff --git a/templates/pl/error-op.tmpl b/templates/pl/error-op.tmpl new file mode 100644 index 000000000..a1d6aae2e --- /dev/null +++ b/templates/pl/error-op.tmpl @@ -0,0 +1,3 @@ +<P>Błąd:</P> + +<BLOCKQUOTE>Nieznana operacja "{op}"!</BLOCKQUOTE> diff --git a/templates/pl/error.tmpl b/templates/pl/error.tmpl new file mode 100644 index 000000000..b27540757 --- /dev/null +++ b/templates/pl/error.tmpl @@ -0,0 +1,3 @@ +<P>{?message?{message}:Błąd:}</P> + +<BLOCKQUOTE>{error}</BLOCKQUOTE> diff --git a/templates/pl/header.tmpl.in b/templates/pl/header.tmpl.in new file mode 100644 index 000000000..7eb232b97 --- /dev/null +++ b/templates/pl/header.tmpl.in @@ -0,0 +1,63 @@ +<!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"> diff --git a/templates/pl/help-header.tmpl b/templates/pl/help-header.tmpl new file mode 100644 index 000000000..d07c53cd6 --- /dev/null +++ b/templates/pl/help-header.tmpl @@ -0,0 +1,40 @@ +<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>} diff --git a/templates/pl/help-printable.tmpl b/templates/pl/help-printable.tmpl new file mode 100644 index 000000000..305112a33 --- /dev/null +++ b/templates/pl/help-printable.tmpl @@ -0,0 +1,11 @@ +<!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> diff --git a/templates/pl/job-cancel.tmpl b/templates/pl/job-cancel.tmpl new file mode 100644 index 000000000..9ef4c1653 --- /dev/null +++ b/templates/pl/job-cancel.tmpl @@ -0,0 +1 @@ +<P><A HREF="{job_printer_uri}">Wydruk {job_id}</A> został anulowany. diff --git a/templates/pl/job-hold.tmpl b/templates/pl/job-hold.tmpl new file mode 100644 index 000000000..526afbb9b --- /dev/null +++ b/templates/pl/job-hold.tmpl @@ -0,0 +1 @@ +<P><A HREF="{job_printer_uri}">Wydruk {job_id}</A> został wstrzymany. diff --git a/templates/pl/job-move.tmpl b/templates/pl/job-move.tmpl new file mode 100644 index 000000000..f5766842b --- /dev/null +++ b/templates/pl/job-move.tmpl @@ -0,0 +1,22 @@ +<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> diff --git a/templates/pl/job-moved.tmpl b/templates/pl/job-moved.tmpl new file mode 100644 index 000000000..99ac76124 --- /dev/null +++ b/templates/pl/job-moved.tmpl @@ -0,0 +1,2 @@ +<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> diff --git a/templates/pl/job-release.tmpl b/templates/pl/job-release.tmpl new file mode 100644 index 000000000..0ed6d5766 --- /dev/null +++ b/templates/pl/job-release.tmpl @@ -0,0 +1 @@ +<P>Wydruk <A HREF="{job_printer_uri}">{job_id}</A> został wznowiony. diff --git a/templates/pl/job-restart.tmpl b/templates/pl/job-restart.tmpl new file mode 100644 index 000000000..e9c1d213e --- /dev/null +++ b/templates/pl/job-restart.tmpl @@ -0,0 +1 @@ +<P><A HREF="{job_printer_uri}">Wydruk {job_id}</A> został powtórzony. diff --git a/templates/pl/jobs-header.tmpl b/templates/pl/jobs-header.tmpl new file mode 100644 index 000000000..7a24eb6eb --- /dev/null +++ b/templates/pl/jobs-header.tmpl @@ -0,0 +1,15 @@ +<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> diff --git a/templates/pl/jobs.tmpl b/templates/pl/jobs.tmpl new file mode 100644 index 000000000..4cb95ab10 --- /dev/null +++ b/templates/pl/jobs.tmpl @@ -0,0 +1,42 @@ +{#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> +} diff --git a/templates/pl/maintenance.tmpl b/templates/pl/maintenance.tmpl new file mode 100644 index 000000000..e29936b02 --- /dev/null +++ b/templates/pl/maintenance.tmpl @@ -0,0 +1,2 @@ +<P>Komendy administracyjne wysłane; ID wydruku to <A HREF="/printers/{printer_name}"> +{printer_name}-{job_id}</A>.</P> diff --git a/templates/pl/modify-class.tmpl b/templates/pl/modify-class.tmpl new file mode 100644 index 000000000..a48fc19bc --- /dev/null +++ b/templates/pl/modify-class.tmpl @@ -0,0 +1,34 @@ +<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> diff --git a/templates/pl/modify-printer.tmpl b/templates/pl/modify-printer.tmpl new file mode 100644 index 000000000..220ac7f8e --- /dev/null +++ b/templates/pl/modify-printer.tmpl @@ -0,0 +1,29 @@ +<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> diff --git a/templates/pl/option-boolean.tmpl b/templates/pl/option-boolean.tmpl new file mode 100644 index 000000000..72c85189a --- /dev/null +++ b/templates/pl/option-boolean.tmpl @@ -0,0 +1,6 @@ +<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> diff --git a/templates/pl/option-conflict.tmpl b/templates/pl/option-conflict.tmpl new file mode 100644 index 000000000..cacdafdef --- /dev/null +++ b/templates/pl/option-conflict.tmpl @@ -0,0 +1,7 @@ +<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> diff --git a/templates/pl/option-header.tmpl b/templates/pl/option-header.tmpl new file mode 100644 index 000000000..cafc9f9fe --- /dev/null +++ b/templates/pl/option-header.tmpl @@ -0,0 +1,3 @@ +<H2 CLASS="title">{printer_name}: {group}</H2> + +<TABLE> diff --git a/templates/pl/option-pickmany.tmpl b/templates/pl/option-pickmany.tmpl new file mode 100644 index 000000000..d2534af75 --- /dev/null +++ b/templates/pl/option-pickmany.tmpl @@ -0,0 +1,6 @@ +<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> diff --git a/templates/pl/option-pickone.tmpl b/templates/pl/option-pickone.tmpl new file mode 100644 index 000000000..08342d06e --- /dev/null +++ b/templates/pl/option-pickone.tmpl @@ -0,0 +1,6 @@ +<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> diff --git a/templates/pl/option-trailer.tmpl b/templates/pl/option-trailer.tmpl new file mode 100644 index 000000000..6a9fd800c --- /dev/null +++ b/templates/pl/option-trailer.tmpl @@ -0,0 +1,5 @@ +<TR> +<TD></TD> +<TD><INPUT TYPE="IMAGE" SRC="/images/button-set-printer-options.gif" ALT="Ustaw Opcje Drukarki"></TD> +</TR> +</TABLE> diff --git a/templates/pl/pager.tmpl b/templates/pl/pager.tmpl new file mode 100644 index 000000000..be2b79da8 --- /dev/null +++ b/templates/pl/pager.tmpl @@ -0,0 +1,7 @@ +<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> diff --git a/templates/pl/printer-accept.tmpl b/templates/pl/printer-accept.tmpl new file mode 100644 index 000000000..7ecfb94bf --- /dev/null +++ b/templates/pl/printer-accept.tmpl @@ -0,0 +1,3 @@ +<P>{is_class?Grupa:Drukarka} <A +HREF="/{is_class?Grupa:Drukarka}/{printer_name}">{printer_name}</A> +przyjmuje wydruki.</P> diff --git a/templates/pl/printer-added.tmpl b/templates/pl/printer-added.tmpl new file mode 100644 index 000000000..b16e4ccde --- /dev/null +++ b/templates/pl/printer-added.tmpl @@ -0,0 +1 @@ +<P>Drukarka <A HREF="/printers/{printer_name}">{printer_name}</A> została pomyślnie dodana. diff --git a/templates/pl/printer-configured.tmpl b/templates/pl/printer-configured.tmpl new file mode 100644 index 000000000..caaf703c8 --- /dev/null +++ b/templates/pl/printer-configured.tmpl @@ -0,0 +1 @@ +<P>Drukarka <A HREF="/printers/{printer_name}">{printer_name}</A> została pomyślnie skonfigurowana. diff --git a/templates/pl/printer-confirm.tmpl b/templates/pl/printer-confirm.tmpl new file mode 100644 index 000000000..2a35101da --- /dev/null +++ b/templates/pl/printer-confirm.tmpl @@ -0,0 +1,7 @@ +<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> diff --git a/templates/pl/printer-default.tmpl b/templates/pl/printer-default.tmpl new file mode 100644 index 000000000..9d0922002 --- /dev/null +++ b/templates/pl/printer-default.tmpl @@ -0,0 +1,5 @@ +<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> diff --git a/templates/pl/printer-deleted.tmpl b/templates/pl/printer-deleted.tmpl new file mode 100644 index 000000000..8406069e4 --- /dev/null +++ b/templates/pl/printer-deleted.tmpl @@ -0,0 +1 @@ +<P>Drukarka {printer_name} została pomyślnie usunięta. diff --git a/templates/pl/printer-jobs-header.tmpl b/templates/pl/printer-jobs-header.tmpl new file mode 100644 index 000000000..7654c73df --- /dev/null +++ b/templates/pl/printer-jobs-header.tmpl @@ -0,0 +1 @@ +<H3 CLASS="title">Wydruki</H3> diff --git a/templates/pl/printer-modified.tmpl b/templates/pl/printer-modified.tmpl new file mode 100644 index 000000000..7c9653a5d --- /dev/null +++ b/templates/pl/printer-modified.tmpl @@ -0,0 +1 @@ +<P>Drukarka <A HREF="/printers/{printer_name}">{printer_name}</A> została pomyślnie zmodyfikowana. diff --git a/templates/pl/printer-purge.tmpl b/templates/pl/printer-purge.tmpl new file mode 100644 index 000000000..a9f941328 --- /dev/null +++ b/templates/pl/printer-purge.tmpl @@ -0,0 +1,3 @@ +<P>Wszystkie wydruki z {is_class?Grupy:Drukarki} <A +HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A> +zostały skasowane.</P> diff --git a/templates/pl/printer-reject.tmpl b/templates/pl/printer-reject.tmpl new file mode 100644 index 000000000..7037fb5b4 --- /dev/null +++ b/templates/pl/printer-reject.tmpl @@ -0,0 +1,3 @@ +<P>{is_class?Grupa:Drukarka} <A +HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A> +odrzuca wydruki.</P> diff --git a/templates/pl/printer-start.tmpl b/templates/pl/printer-start.tmpl new file mode 100644 index 000000000..a85d54e06 --- /dev/null +++ b/templates/pl/printer-start.tmpl @@ -0,0 +1,3 @@ +<P>{is_class?Grupa:Drukarka} <A +HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A> +została uruchomiona.</P> diff --git a/templates/pl/printer-stop.tmpl b/templates/pl/printer-stop.tmpl new file mode 100644 index 000000000..86c2d6de1 --- /dev/null +++ b/templates/pl/printer-stop.tmpl @@ -0,0 +1,3 @@ +<P>{is_class?Grupa:Drukarka} <A +HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A> +została zatrzymana.</P> diff --git a/templates/pl/printers-header.tmpl b/templates/pl/printers-header.tmpl new file mode 100644 index 000000000..4d31f2b1a --- /dev/null +++ b/templates/pl/printers-header.tmpl @@ -0,0 +1 @@ +<P ALIGN="CENTER">{total=0?Brak drukarek:Wyświetlam {#printer_name} z {total}{total=1?drukarkę:drukarek}}.</P> diff --git a/templates/pl/printers.tmpl b/templates/pl/printers.tmpl new file mode 100644 index 000000000..f35dfdec4 --- /dev/null +++ b/templates/pl/printers.tmpl @@ -0,0 +1,64 @@ +{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> +}} diff --git a/templates/pl/restart.tmpl b/templates/pl/restart.tmpl new file mode 100644 index 000000000..0f2935a12 --- /dev/null +++ b/templates/pl/restart.tmpl @@ -0,0 +1 @@ +<p>Proszę czekać - ponowne uruchomienie serwera wydruków...</p> diff --git a/templates/pl/samba-export.tmpl b/templates/pl/samba-export.tmpl new file mode 100644 index 000000000..6fbd67dbe --- /dev/null +++ b/templates/pl/samba-export.tmpl @@ -0,0 +1,49 @@ +<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> diff --git a/templates/pl/samba-exported.tmpl b/templates/pl/samba-exported.tmpl new file mode 100644 index 000000000..1b7356a37 --- /dev/null +++ b/templates/pl/samba-exported.tmpl @@ -0,0 +1 @@ +<P>Eksport do Samby zakończył się powodzeniem.</P> diff --git a/templates/pl/search.tmpl b/templates/pl/search.tmpl new file mode 100644 index 000000000..5bb4bd5d4 --- /dev/null +++ b/templates/pl/search.tmpl @@ -0,0 +1,13 @@ +<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> diff --git a/templates/pl/set-printer-options-header.tmpl b/templates/pl/set-printer-options-header.tmpl new file mode 100644 index 000000000..864f9f0ce --- /dev/null +++ b/templates/pl/set-printer-options-header.tmpl @@ -0,0 +1,3 @@ +<FORM METHOD="POST" ACTION="/admin"> +<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}"> +<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}"> diff --git a/templates/pl/set-printer-options-trailer.tmpl b/templates/pl/set-printer-options-trailer.tmpl new file mode 100644 index 000000000..a3d1e1ffa --- /dev/null +++ b/templates/pl/set-printer-options-trailer.tmpl @@ -0,0 +1 @@ +</FORM> diff --git a/templates/pl/test-page.tmpl b/templates/pl/test-page.tmpl new file mode 100644 index 000000000..447ffbc53 --- /dev/null +++ b/templates/pl/test-page.tmpl @@ -0,0 +1,2 @@ +<P>Strona testowa wysłana na drukarkę; ID wydruku to <A HREF="/{SECTION}/{printer_name}"> +{printer_name}-{job_id}</A>.</P> diff --git a/templates/pl/trailer.tmpl b/templates/pl/trailer.tmpl new file mode 100644 index 000000000..9fe5f6788 --- /dev/null +++ b/templates/pl/trailer.tmpl @@ -0,0 +1,21 @@ +</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> diff --git a/templates/pl/users.tmpl b/templates/pl/users.tmpl new file mode 100644 index 000000000..a17107a14 --- /dev/null +++ b/templates/pl/users.tmpl @@ -0,0 +1,26 @@ +<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> diff --git a/templates/sv/add-class.tmpl b/templates/sv/add-class.tmpl new file mode 100644 index 000000000..33a1acf7a --- /dev/null +++ b/templates/sv/add-class.tmpl @@ -0,0 +1,33 @@ +<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> diff --git a/templates/sv/add-printer.tmpl b/templates/sv/add-printer.tmpl new file mode 100644 index 000000000..e80dec9b3 --- /dev/null +++ b/templates/sv/add-printer.tmpl @@ -0,0 +1,28 @@ +<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> diff --git a/templates/sv/admin.tmpl b/templates/sv/admin.tmpl new file mode 100644 index 000000000..0a0c0cb1f --- /dev/null +++ b/templates/sv/admin.tmpl @@ -0,0 +1,77 @@ +<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> diff --git a/templates/sv/choose-device.tmpl b/templates/sv/choose-device.tmpl new file mode 100644 index 000000000..dd2e8a471 --- /dev/null +++ b/templates/sv/choose-device.tmpl @@ -0,0 +1,26 @@ +<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> diff --git a/templates/sv/choose-make.tmpl b/templates/sv/choose-make.tmpl new file mode 100644 index 000000000..f47ed8197 --- /dev/null +++ b/templates/sv/choose-make.tmpl @@ -0,0 +1,42 @@ +<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> diff --git a/templates/sv/choose-model.tmpl b/templates/sv/choose-model.tmpl new file mode 100644 index 000000000..0645eec20 --- /dev/null +++ b/templates/sv/choose-model.tmpl @@ -0,0 +1,34 @@ +<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> diff --git a/templates/sv/choose-serial.tmpl b/templates/sv/choose-serial.tmpl new file mode 100644 index 000000000..877015e7a --- /dev/null +++ b/templates/sv/choose-serial.tmpl @@ -0,0 +1,47 @@ +<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> diff --git a/templates/sv/choose-uri.tmpl b/templates/sv/choose-uri.tmpl new file mode 100644 index 000000000..b65dffc35 --- /dev/null +++ b/templates/sv/choose-uri.tmpl @@ -0,0 +1,42 @@ +<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> diff --git a/templates/sv/class-added.tmpl b/templates/sv/class-added.tmpl new file mode 100644 index 000000000..512a2f2f8 --- /dev/null +++ b/templates/sv/class-added.tmpl @@ -0,0 +1 @@ +<P>Klassen <A HREF="/classes/{printer_name}">{printer_name}</A> har lagts till. diff --git a/templates/sv/class-confirm.tmpl b/templates/sv/class-confirm.tmpl new file mode 100644 index 000000000..40df8ea62 --- /dev/null +++ b/templates/sv/class-confirm.tmpl @@ -0,0 +1,7 @@ +<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> diff --git a/templates/sv/class-deleted.tmpl b/templates/sv/class-deleted.tmpl new file mode 100644 index 000000000..b14513fb8 --- /dev/null +++ b/templates/sv/class-deleted.tmpl @@ -0,0 +1 @@ +<P>Klassen {printer_name} har tagits bort. diff --git a/templates/sv/class-jobs-header.tmpl b/templates/sv/class-jobs-header.tmpl new file mode 100644 index 000000000..59f2054ea --- /dev/null +++ b/templates/sv/class-jobs-header.tmpl @@ -0,0 +1 @@ +<H3 CLASS="title">Jobb</H3> diff --git a/templates/sv/class-modified.tmpl b/templates/sv/class-modified.tmpl new file mode 100644 index 000000000..a5d5fb020 --- /dev/null +++ b/templates/sv/class-modified.tmpl @@ -0,0 +1,2 @@ +<P>Klassen <A HREF="/classes/{printer_name}">{printer_name}</A> har +modifierats. diff --git a/templates/sv/classes-header.tmpl b/templates/sv/classes-header.tmpl new file mode 100644 index 000000000..c87bc209a --- /dev/null +++ b/templates/sv/classes-header.tmpl @@ -0,0 +1 @@ +<P ALIGN="CENTER">{total=0?Inga klasser:Visar {#printer_name} av {total} klass{total=1?:er}}.</P> diff --git a/templates/sv/classes.tmpl b/templates/sv/classes.tmpl new file mode 100644 index 000000000..1dd52ebaa --- /dev/null +++ b/templates/sv/classes.tmpl @@ -0,0 +1,54 @@ +{#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> +}} diff --git a/templates/sv/edit-config.tmpl.in b/templates/sv/edit-config.tmpl.in new file mode 100644 index 000000000..ff7a01e05 --- /dev/null +++ b/templates/sv/edit-config.tmpl.in @@ -0,0 +1,91 @@ +<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> diff --git a/templates/sv/error-op.tmpl b/templates/sv/error-op.tmpl new file mode 100644 index 000000000..153b0a927 --- /dev/null +++ b/templates/sv/error-op.tmpl @@ -0,0 +1,3 @@ +<P>Fel:</P> + +<BLOCKQUOTE>Okänd åtgärd "{op}"!</BLOCKQUOTE> diff --git a/templates/sv/error.tmpl b/templates/sv/error.tmpl new file mode 100644 index 000000000..f4f82b1ce --- /dev/null +++ b/templates/sv/error.tmpl @@ -0,0 +1,3 @@ +<P>{?message?{message}:Fel:}</P> + +<BLOCKQUOTE>{error}</BLOCKQUOTE> diff --git a/templates/sv/header.tmpl.in b/templates/sv/header.tmpl.in new file mode 100644 index 000000000..3258ce05f --- /dev/null +++ b/templates/sv/header.tmpl.in @@ -0,0 +1,63 @@ +<!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"> diff --git a/templates/sv/help-header.tmpl b/templates/sv/help-header.tmpl new file mode 100644 index 000000000..262f47c13 --- /dev/null +++ b/templates/sv/help-header.tmpl @@ -0,0 +1,47 @@ +<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>} diff --git a/templates/sv/help-printable.tmpl b/templates/sv/help-printable.tmpl new file mode 100644 index 000000000..305112a33 --- /dev/null +++ b/templates/sv/help-printable.tmpl @@ -0,0 +1,11 @@ +<!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> diff --git a/templates/sv/job-cancel.tmpl b/templates/sv/job-cancel.tmpl new file mode 100644 index 000000000..7f922e5c9 --- /dev/null +++ b/templates/sv/job-cancel.tmpl @@ -0,0 +1 @@ +<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har avbrutits. diff --git a/templates/sv/job-hold.tmpl b/templates/sv/job-hold.tmpl new file mode 100644 index 000000000..1ff1fdd6f --- /dev/null +++ b/templates/sv/job-hold.tmpl @@ -0,0 +1 @@ +<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har undanhållits från utskrift. diff --git a/templates/sv/job-move.tmpl b/templates/sv/job-move.tmpl new file mode 100644 index 000000000..388f7ad96 --- /dev/null +++ b/templates/sv/job-move.tmpl @@ -0,0 +1,22 @@ +<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> diff --git a/templates/sv/job-moved.tmpl b/templates/sv/job-moved.tmpl new file mode 100644 index 000000000..5e31389d1 --- /dev/null +++ b/templates/sv/job-moved.tmpl @@ -0,0 +1,2 @@ +<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> diff --git a/templates/sv/job-release.tmpl b/templates/sv/job-release.tmpl new file mode 100644 index 000000000..86bad19c0 --- /dev/null +++ b/templates/sv/job-release.tmpl @@ -0,0 +1 @@ +<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har släppts för utskrift. diff --git a/templates/sv/job-restart.tmpl b/templates/sv/job-restart.tmpl new file mode 100644 index 000000000..082afecff --- /dev/null +++ b/templates/sv/job-restart.tmpl @@ -0,0 +1 @@ +<P><A HREF="{job_printer_uri}">Jobbet {job_id}</A> har startats om. diff --git a/templates/sv/jobs-header.tmpl b/templates/sv/jobs-header.tmpl new file mode 100644 index 000000000..e0d11015e --- /dev/null +++ b/templates/sv/jobs-header.tmpl @@ -0,0 +1,15 @@ +<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> diff --git a/templates/sv/jobs.tmpl b/templates/sv/jobs.tmpl new file mode 100644 index 000000000..cf0470d6e --- /dev/null +++ b/templates/sv/jobs.tmpl @@ -0,0 +1,42 @@ +{#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> +} diff --git a/templates/sv/maintenance.tmpl b/templates/sv/maintenance.tmpl new file mode 100644 index 000000000..7bb5fd8b6 --- /dev/null +++ b/templates/sv/maintenance.tmpl @@ -0,0 +1,2 @@ +<P>Underhållskommandon skickade; jobb-id är <A HREF="/printers/{printer_name}"> +{printer_name}-{job_id}</A>.</P> diff --git a/templates/sv/modify-class.tmpl b/templates/sv/modify-class.tmpl new file mode 100644 index 000000000..8105d85b1 --- /dev/null +++ b/templates/sv/modify-class.tmpl @@ -0,0 +1,34 @@ +<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> diff --git a/templates/sv/modify-printer.tmpl b/templates/sv/modify-printer.tmpl new file mode 100644 index 000000000..4090ab43e --- /dev/null +++ b/templates/sv/modify-printer.tmpl @@ -0,0 +1,29 @@ +<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> diff --git a/templates/sv/option-boolean.tmpl b/templates/sv/option-boolean.tmpl new file mode 100644 index 000000000..72c85189a --- /dev/null +++ b/templates/sv/option-boolean.tmpl @@ -0,0 +1,6 @@ +<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> diff --git a/templates/sv/option-conflict.tmpl b/templates/sv/option-conflict.tmpl new file mode 100644 index 000000000..10d600262 --- /dev/null +++ b/templates/sv/option-conflict.tmpl @@ -0,0 +1,7 @@ +<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> diff --git a/templates/sv/option-header.tmpl b/templates/sv/option-header.tmpl new file mode 100644 index 000000000..cafc9f9fe --- /dev/null +++ b/templates/sv/option-header.tmpl @@ -0,0 +1,3 @@ +<H2 CLASS="title">{printer_name}: {group}</H2> + +<TABLE> diff --git a/templates/sv/option-pickmany.tmpl b/templates/sv/option-pickmany.tmpl new file mode 100644 index 000000000..d2534af75 --- /dev/null +++ b/templates/sv/option-pickmany.tmpl @@ -0,0 +1,6 @@ +<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> diff --git a/templates/sv/option-pickone.tmpl b/templates/sv/option-pickone.tmpl new file mode 100644 index 000000000..08342d06e --- /dev/null +++ b/templates/sv/option-pickone.tmpl @@ -0,0 +1,6 @@ +<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> diff --git a/templates/sv/option-trailer.tmpl b/templates/sv/option-trailer.tmpl new file mode 100644 index 000000000..f81ffbdae --- /dev/null +++ b/templates/sv/option-trailer.tmpl @@ -0,0 +1,5 @@ +<TR> +<TD></TD> +<TD><INPUT TYPE="IMAGE" SRC="/images/button-set-printer-options.gif" ALT="Ställ in skrivaralternativ"></TD> +</TR> +</TABLE> diff --git a/templates/sv/pager.tmpl b/templates/sv/pager.tmpl new file mode 100644 index 000000000..536fdd188 --- /dev/null +++ b/templates/sv/pager.tmpl @@ -0,0 +1,7 @@ +<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> diff --git a/templates/sv/printer-accept.tmpl b/templates/sv/printer-accept.tmpl new file mode 100644 index 000000000..b8a032b68 --- /dev/null +++ b/templates/sv/printer-accept.tmpl @@ -0,0 +1,3 @@ +<P>{is_class?Class:Printer} <A +HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A> +accepterar nu jobb.</P> diff --git a/templates/sv/printer-added.tmpl b/templates/sv/printer-added.tmpl new file mode 100644 index 000000000..8fe0c1c86 --- /dev/null +++ b/templates/sv/printer-added.tmpl @@ -0,0 +1 @@ +<P>Skrivaren <A HREF="/printers/{printer_name}">{printer_name}</A> har lagts till. diff --git a/templates/sv/printer-configured.tmpl b/templates/sv/printer-configured.tmpl new file mode 100644 index 000000000..db94934d5 --- /dev/null +++ b/templates/sv/printer-configured.tmpl @@ -0,0 +1 @@ +<P>Skrivaren <A HREF="/printers/{printer_name}">{printer_name}</A> har nu konfigurerats. diff --git a/templates/sv/printer-confirm.tmpl b/templates/sv/printer-confirm.tmpl new file mode 100644 index 000000000..0f4d0818a --- /dev/null +++ b/templates/sv/printer-confirm.tmpl @@ -0,0 +1,7 @@ +<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> diff --git a/templates/sv/printer-default.tmpl b/templates/sv/printer-default.tmpl new file mode 100644 index 000000000..a564e342e --- /dev/null +++ b/templates/sv/printer-default.tmpl @@ -0,0 +1,7 @@ +<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> diff --git a/templates/sv/printer-deleted.tmpl b/templates/sv/printer-deleted.tmpl new file mode 100644 index 000000000..640fab00e --- /dev/null +++ b/templates/sv/printer-deleted.tmpl @@ -0,0 +1 @@ +<P>Skrivaren {printer_name} har tagits bort. diff --git a/templates/sv/printer-jobs-header.tmpl b/templates/sv/printer-jobs-header.tmpl new file mode 100644 index 000000000..59f2054ea --- /dev/null +++ b/templates/sv/printer-jobs-header.tmpl @@ -0,0 +1 @@ +<H3 CLASS="title">Jobb</H3> diff --git a/templates/sv/printer-modified.tmpl b/templates/sv/printer-modified.tmpl new file mode 100644 index 000000000..e209ea0fc --- /dev/null +++ b/templates/sv/printer-modified.tmpl @@ -0,0 +1 @@ +<P>Skrivaren <A HREF="/printers/{printer_name}">{printer_name}</A> har modifierats. diff --git a/templates/sv/printer-purge.tmpl b/templates/sv/printer-purge.tmpl new file mode 100644 index 000000000..a53c9aeb2 --- /dev/null +++ b/templates/sv/printer-purge.tmpl @@ -0,0 +1,3 @@ +<P>{is_class?Class:Printer} <A +HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A> +har fått alla sina jobb rensade.</P> diff --git a/templates/sv/printer-reject.tmpl b/templates/sv/printer-reject.tmpl new file mode 100644 index 000000000..a15567de4 --- /dev/null +++ b/templates/sv/printer-reject.tmpl @@ -0,0 +1,3 @@ +<P>{is_class?Class:Printer} <A +HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A> +accepterar inte längre jobb.</P> diff --git a/templates/sv/printer-start.tmpl b/templates/sv/printer-start.tmpl new file mode 100644 index 000000000..2a06b262f --- /dev/null +++ b/templates/sv/printer-start.tmpl @@ -0,0 +1,3 @@ +<P>{is_class?Class:Printer} <A +HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A> +har startats.</P> diff --git a/templates/sv/printer-stop.tmpl b/templates/sv/printer-stop.tmpl new file mode 100644 index 000000000..668de21b9 --- /dev/null +++ b/templates/sv/printer-stop.tmpl @@ -0,0 +1,3 @@ +<P>{is_class?Class:Printer} <A +HREF="/{is_class?classes:printers}/{printer_name}">{printer_name}</A> +har stoppats.</P> diff --git a/templates/sv/printers-header.tmpl b/templates/sv/printers-header.tmpl new file mode 100644 index 000000000..52fd615ad --- /dev/null +++ b/templates/sv/printers-header.tmpl @@ -0,0 +1 @@ +<P ALIGN="CENTER">{total=0?Inga skrivare:Visar {#printer_name} av {total} skrivare}.</P> diff --git a/templates/sv/printers.tmpl b/templates/sv/printers.tmpl new file mode 100644 index 000000000..ad21e5ca7 --- /dev/null +++ b/templates/sv/printers.tmpl @@ -0,0 +1,64 @@ +{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> +}} diff --git a/templates/sv/restart.tmpl b/templates/sv/restart.tmpl new file mode 100644 index 000000000..b8416a960 --- /dev/null +++ b/templates/sv/restart.tmpl @@ -0,0 +1 @@ +<p>Var god vänta under tiden servern startar om...</p> diff --git a/templates/sv/samba-export.tmpl b/templates/sv/samba-export.tmpl new file mode 100644 index 000000000..6d7eff8bf --- /dev/null +++ b/templates/sv/samba-export.tmpl @@ -0,0 +1,55 @@ +<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> diff --git a/templates/sv/samba-exported.tmpl b/templates/sv/samba-exported.tmpl new file mode 100644 index 000000000..7281bfb0a --- /dev/null +++ b/templates/sv/samba-exported.tmpl @@ -0,0 +1 @@ +<P>Skrivare exporterade till Samba.</P> diff --git a/templates/sv/search.tmpl b/templates/sv/search.tmpl new file mode 100644 index 000000000..fa835f260 --- /dev/null +++ b/templates/sv/search.tmpl @@ -0,0 +1,13 @@ +<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> diff --git a/templates/sv/set-printer-options-header.tmpl b/templates/sv/set-printer-options-header.tmpl new file mode 100644 index 000000000..864f9f0ce --- /dev/null +++ b/templates/sv/set-printer-options-header.tmpl @@ -0,0 +1,3 @@ +<FORM METHOD="POST" ACTION="/admin"> +<INPUT TYPE="HIDDEN" NAME="PRINTER_NAME" VALUE="{printer_name}"> +<INPUT TYPE="HIDDEN" NAME="OP" VALUE="{op}"> diff --git a/templates/sv/set-printer-options-trailer.tmpl b/templates/sv/set-printer-options-trailer.tmpl new file mode 100644 index 000000000..a3d1e1ffa --- /dev/null +++ b/templates/sv/set-printer-options-trailer.tmpl @@ -0,0 +1 @@ +</FORM> diff --git a/templates/sv/test-page.tmpl b/templates/sv/test-page.tmpl new file mode 100644 index 000000000..a712193e6 --- /dev/null +++ b/templates/sv/test-page.tmpl @@ -0,0 +1,2 @@ +<P>Testsida skickad; jobb-id är <A HREF="/{SECTION}/{printer_name}"> +{printer_name}-{job_id}</A>.</P> diff --git a/templates/sv/trailer.tmpl b/templates/sv/trailer.tmpl new file mode 100644 index 000000000..01698fe44 --- /dev/null +++ b/templates/sv/trailer.tmpl @@ -0,0 +1,21 @@ +</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> diff --git a/templates/sv/users.tmpl b/templates/sv/users.tmpl new file mode 100644 index 000000000..117d549c0 --- /dev/null +++ b/templates/sv/users.tmpl @@ -0,0 +1,26 @@ +<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> diff --git a/test/ipptest.c b/test/ipptest.c index c075cf412..98843ff6c 100644 --- a/test/ipptest.c +++ b/test/ipptest.c @@ -1,5 +1,5 @@ /* - * "$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). * @@ -49,7 +49,51 @@ * 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 */ + }; + + /* @@ -60,6 +104,7 @@ int do_tests(const char *, const char *); 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); @@ -637,52 +682,10 @@ ipp_tag_t /* O - Value/group tag */ 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); @@ -690,6 +693,20 @@ get_tag(const char *name) /* I - Name of value/group tag */ /* + * '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. */ @@ -797,7 +814,7 @@ print_attr(ipp_attribute_t *attr) /* I - Attribute to print */ return; } - printf(" %s = ", attr->name); + printf(" %s (%s) = ", attr->name, get_tag_string(attr->value_tag)); switch (attr->value_tag) { @@ -880,5 +897,5 @@ usage(const char *option) /* I - Option string or NULL */ /* - * 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 $". */ |