Submitted By: Armin K. Date: 2013-01-24 Initial Package Version: 1.6.1 Upstream Status: Fixed upstream Origin: Upstream Description: Remove obsolete cupsd.conf options, fix usb backend for some printers that don't print whole pages and several fixes for dnssd backend. --- a/backend/usb-libusb.c 2012-07-16 19:10:55.000000000 +0200 +++ b/backend/usb-libusb.c 2013-01-24 14:13:39.341801934 +0100 @@ -70,7 +70,7 @@ read_endp, /* Read endpoint */ protocol, /* Protocol: 1 = Uni-di, 2 = Bi-di. */ usblp_attached, /* "usblp" kernel module attached? */ - opened_for_job; /* Set to 1 by print_device() */ + reset_after_job; /* Set to 1 by print_device() */ unsigned int quirks; /* Quirks flags */ struct libusb_device_handle *handle; /* Open handle to device */ } usb_printer_t; @@ -122,6 +122,8 @@ #define USBLP_QUIRK_USB_INIT 0x2 /* needs vendor USB init string */ #define USBLP_QUIRK_BAD_CLASS 0x4 /* descriptor uses vendor-specific Class or SubClass */ +#define USBLP_QUIRK_RESET 0x4000 /* After printing do a reset + for clean-up */ #define USBLP_QUIRK_NO_REATTACH 0x8000 /* After printing we cannot re-attach the usblp kernel module */ @@ -147,9 +149,11 @@ { 0x04b8, 0x0202, USBLP_QUIRK_BAD_CLASS }, /* Seiko Epson Receipt Printer M129C */ { 0x067b, 0x2305, USBLP_QUIRK_BIDIR | - USBLP_QUIRK_NO_REATTACH }, + USBLP_QUIRK_NO_REATTACH | + USBLP_QUIRK_RESET }, /* Prolific Technology, Inc. PL2305 Parallel Port (USB -> Parallel adapter) */ + { 0x04e8, 0x0000, USBLP_QUIRK_RESET }, /* All Samsung devices */ { 0, 0 } }; @@ -256,7 +260,12 @@ } g.print_fd = print_fd; - g.printer->opened_for_job = 1; + + /* + * Some devices need a reset after finishing a job, these devices are + * marked with the USBLP_QUIRK_RESET quirk. + */ + g.printer->reset_after_job = (g.printer->quirks & USBLP_QUIRK_RESET ? 1 : 0); /* * If we are printing data from a print driver on stdin, ignore SIGTERM @@ -772,7 +781,7 @@ * Reset the device to clean up after the job */ - if (printer->opened_for_job == 1) + if (printer->reset_after_job == 1) { if ((errcode = libusb_reset_device(printer->handle)) < 0) fprintf(stderr, @@ -1288,7 +1297,7 @@ } printer->usblp_attached = 0; - printer->opened_for_job = 0; + printer->reset_after_job = 0; if (verbose) fputs("STATE: +connecting-to-device\n", stderr); @@ -1586,7 +1595,7 @@ for (i = 0; quirk_printers[i].vendorId; i++) { if (vendor == quirk_printers[i].vendorId && - product == quirk_printers[i].productId) + (product == 0x0000 || product == quirk_printers[i].productId)) return quirk_printers[i].quirks; } return 0; --- a/conf/cupsd.conf.in 2013-01-24 14:13:19.810473916 +0100 +++ b/conf/cupsd.conf.in 2013-01-24 14:13:39.342801950 +0100 @@ -15,8 +15,6 @@ # Show shared printers on the local network. Browsing On -BrowseOrder allow,deny -BrowseAllow all BrowseLocalProtocols @CUPS_BROWSE_LOCAL_PROTOCOLS@ # Default authentication type, when authentication is required... --- a/scheduler/client.c 2013-01-24 14:13:19.825474168 +0100 +++ b/scheduler/client.c 2013-01-24 14:13:39.345801998 +0100 @@ -4008,7 +4008,7 @@ !strncmp(host, "[::1]:", 6)); } -#ifdef HAVE_DNSSD +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) /* * Check if the hostname is something.local (Bonjour); if so, allow it. */ @@ -4027,7 +4027,7 @@ !_cups_strcasecmp(end, ".local.") || !_cups_strncasecmp(end, ".local.:", 8))) return (1); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_DNSSD || HAVE_AVAHI */ /* * Check if the hostname is an IP address... @@ -4088,7 +4088,7 @@ } } -#ifdef HAVE_DNSSD +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) for (a = (cupsd_alias_t *)cupsArrayFirst(DNSSDAlias); a; a = (cupsd_alias_t *)cupsArrayNext(DNSSDAlias)) @@ -4113,7 +4113,7 @@ return (1); } } -#endif /* HAVE_DNSSD */ +#endif /* HAVE_DNSSD || HAVE_AVAHI */ /* * Check for interface hostname matches... --- a/scheduler/conf.c 2013-01-24 14:13:19.826474185 +0100 +++ b/scheduler/conf.c 2013-01-24 14:13:39.348802046 +0100 @@ -88,9 +88,9 @@ static const cupsd_var_t cupsd_vars[] = { { "AutoPurgeJobs", &JobAutoPurge, CUPSD_VARTYPE_BOOLEAN }, -#ifdef HAVE_DNSSD +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) { "BrowseDNSSDSubTypes", &DNSSDSubTypes, CUPSD_VARTYPE_STRING }, -#endif /* HAVE_DNSSD */ +#endif /* HAVE_DNSSD || HAVE_AVAHI */ { "BrowseWebIF", &BrowseWebIF, CUPSD_VARTYPE_BOOLEAN }, { "Browsing", &Browsing, CUPSD_VARTYPE_BOOLEAN }, { "Classification", &Classification, CUPSD_VARTYPE_STRING }, @@ -743,9 +743,9 @@ Browsing = CUPS_DEFAULT_BROWSING; DefaultShared = CUPS_DEFAULT_DEFAULT_SHARED; -#ifdef HAVE_DNSSD +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) cupsdSetString(&DNSSDSubTypes, "_cups,_print"); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_DNSSD || HAVE_AVAHI */ cupsdSetString(&LPDConfigFile, CUPS_DEFAULT_LPD_CONFIG_FILE); cupsdSetString(&SMBConfigFile, CUPS_DEFAULT_SMB_CONFIG_FILE); --- a/scheduler/ipp.c 2013-01-24 14:13:19.828474218 +0100 +++ b/scheduler/ipp.c 2013-01-24 14:13:39.352802110 +0100 @@ -4813,7 +4813,7 @@ ippAddDate(con->response, IPP_TAG_PRINTER, "printer-current-time", ippTimeToDate(curtime)); -#ifdef HAVE_DNSSD +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) if (!ra || cupsArrayFind(ra, "printer-dns-sd-name")) { if (printer->reg_name) @@ -4823,7 +4823,7 @@ ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, "printer-dns-sd-name", 0); } -#endif /* HAVE_DNSSD */ +#endif /* HAVE_DNSSD || HAVE_AVAHI */ if (!ra || cupsArrayFind(ra, "printer-error-policy")) ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME, --- a/scheduler/main.c 2013-01-24 14:13:19.829474235 +0100 +++ b/scheduler/main.c 2013-01-24 14:13:39.353802127 +0100 @@ -829,9 +829,9 @@ * Got an error from select! */ -#ifdef HAVE_DNSSD +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) cupsd_printer_t *p; /* Current printer */ -#endif /* HAVE_DNSSD */ +#endif /* HAVE_DNSSD || HAVE_AVAHI */ if (errno == EINTR) /* Just interrupted by a signal */ @@ -872,13 +872,13 @@ job->print_pipes[0], job->print_pipes[1], job->back_pipes[0], job->back_pipes[1]); -#ifdef HAVE_DNSSD +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); p; p = (cupsd_printer_t *)cupsArrayNext(Printers)) cupsdLogMessage(CUPSD_LOG_EMERG, "printer[%s] reg_name=\"%s\"", p->name, p->reg_name ? p->reg_name : "(null)"); -#endif /* HAVE_DNSSD */ +#endif /* HAVE_DNSSD || HAVE_AVAHI */ break; } --- a/scheduler/printers.c 2012-05-23 03:19:11.000000000 +0200 +++ b/scheduler/printers.c 2013-01-24 14:13:39.354802143 +0100 @@ -4829,13 +4829,14 @@ "printer-make-and-model", NULL, "Local System V Printer"); } - else if (!strncmp(p->device_uri, "ipp://", 6) && - (strstr(p->device_uri, "/printers/") != NULL || - strstr(p->device_uri, "/classes/") != NULL || - ((strstr(p->device_uri, "._ipp.") != NULL || - strstr(p->device_uri, "._ipps.") != NULL) && - !strcmp(p->device_uri + strlen(p->device_uri) - 5, - "/cups")))) + else if ((!strncmp(p->device_uri, "ipp://", 6) && + (strstr(p->device_uri, "/printers/") != NULL || + strstr(p->device_uri, "/classes/") != NULL)) || + (!strncmp(p->device_uri, "dnssd://", 8) && + (strstr(p->device_uri, "._ipp.") != NULL || + strstr(p->device_uri, "._ipps.") != NULL) && + !strcmp(p->device_uri + strlen(p->device_uri) - 5, + "/cups"))) { /* * Tell the client this is really a hard-wired remote printer.