]> git.ipfire.org Git - thirdparty/cups.git/blob - backend/usb-libusb.c
SIGSEGV in CUPS web ui when adding a printer
[thirdparty/cups.git] / backend / usb-libusb.c
1 /*
2 * LIBUSB interface code for CUPS.
3 *
4 * Copyright 2007-2019 by Apple Inc.
5 *
6 * Licensed under Apache License v2.0. See the file "LICENSE" for more
7 * information.
8 */
9
10 /*
11 * Include necessary headers...
12 */
13
14 #include <libusb.h>
15 #include <cups/cups-private.h>
16 #include <cups/ppd-private.h>
17 #include <cups/dir.h>
18 #include <pthread.h>
19 #include <sys/select.h>
20 #include <sys/types.h>
21 #include <sys/stat.h>
22 #include <sys/time.h>
23 #include <unistd.h>
24
25
26 /*
27 * WAIT_EOF_DELAY is number of seconds we'll wait for responses from
28 * the printer after we've finished sending all the data
29 */
30
31 #define WAIT_EOF 0
32 #define WAIT_EOF_DELAY 7
33 #define WAIT_SIDE_DELAY 3
34 #define DEFAULT_TIMEOUT 5000L
35
36
37 /*
38 * Local types...
39 */
40
41 typedef struct usb_printer_s /**** USB Printer Data ****/
42 {
43 struct libusb_device *device; /* Device info */
44 int conf, /* Configuration */
45 origconf, /* Original configuration */
46 iface, /* Interface */
47 altset, /* Alternate setting */
48 write_endp, /* Write endpoint */
49 read_endp, /* Read endpoint */
50 protocol, /* Protocol: 1 = Uni-di, 2 = Bi-di. */
51 usblp_attached, /* "usblp" kernel module attached? */
52 reset_after_job;/* Set to 1 by print_device() */
53 unsigned quirks; /* Quirks flags */
54 struct libusb_device_handle *handle; /* Open handle to device */
55 } usb_printer_t;
56
57 typedef int (*usb_cb_t)(usb_printer_t *, const char *, const char *,
58 const void *);
59
60 typedef struct usb_globals_s /* Global USB printer information */
61 {
62 usb_printer_t *printer; /* Printer */
63
64 pthread_mutex_t read_thread_mutex;
65 pthread_cond_t read_thread_cond;
66 int read_thread_stop;
67 int read_thread_done;
68
69 pthread_mutex_t readwrite_lock_mutex;
70 pthread_cond_t readwrite_lock_cond;
71 int readwrite_lock;
72
73 int print_fd; /* File descriptor to print */
74 ssize_t print_bytes; /* Print bytes read */
75
76 int wait_eof;
77 int drain_output; /* Drain all pending output */
78 int bidi_flag; /* 0=unidirectional, 1=bidirectional */
79
80 pthread_mutex_t sidechannel_thread_mutex;
81 pthread_cond_t sidechannel_thread_cond;
82 int sidechannel_thread_stop;
83 int sidechannel_thread_done;
84 } usb_globals_t;
85
86 /*
87 * Quirks: various printer quirks are handled by this structure and its flags.
88 *
89 * The quirks table used to be compiled into the backend but is now loaded from
90 * one or more files in the /usr/share/cups/usb directory.
91 */
92
93 #define USB_QUIRK_BLACKLIST 0x0001 /* Does not conform to the spec */
94 #define USB_QUIRK_NO_REATTACH 0x0002 /* After printing we cannot re-attach
95 the usblp kernel module */
96 #define USB_QUIRK_SOFT_RESET 0x0004 /* After printing do a soft reset
97 for clean-up */
98 #define USB_QUIRK_UNIDIR 0x0008 /* Requires unidirectional mode */
99 #define USB_QUIRK_USB_INIT 0x0010 /* Needs vendor USB init string */
100 #define USB_QUIRK_VENDOR_CLASS 0x0020 /* Descriptor uses vendor-specific
101 Class or SubClass */
102 #define USB_QUIRK_DELAY_CLOSE 0x0040 /* Delay close */
103 #define USB_QUIRK_WHITELIST 0x0000 /* no quirks */
104
105
106 typedef struct usb_quirk_s /* USB "quirk" information */
107 {
108 int vendor_id, /* Affected vendor ID */
109 product_id; /* Affected product ID or 0 for all */
110 unsigned quirks; /* Quirks bitfield */
111 } usb_quirk_t;
112
113
114
115
116 /*
117 * Globals...
118 */
119
120 cups_array_t *all_quirks; /* Array of printer quirks */
121 usb_globals_t g = { 0 }; /* Globals */
122 libusb_device **all_list; /* List of connected USB devices */
123
124
125 /*
126 * Local functions...
127 */
128
129 static int close_device(usb_printer_t *printer);
130 static int compare_quirks(usb_quirk_t *a, usb_quirk_t *b);
131 static usb_printer_t *find_device(usb_cb_t cb, const void *data);
132 static unsigned find_quirks(int vendor_id, int product_id);
133 static int get_device_id(usb_printer_t *printer, char *buffer,
134 size_t bufsize);
135 static int list_cb(usb_printer_t *printer, const char *device_uri,
136 const char *device_id, const void *data);
137 static void load_quirks(void);
138 static char *make_device_uri(usb_printer_t *printer,
139 const char *device_id,
140 char *uri, size_t uri_size);
141 static int open_device(usb_printer_t *printer, int verbose);
142 static int print_cb(usb_printer_t *printer, const char *device_uri,
143 const char *device_id, const void *data);
144 static void *read_thread(void *reference);
145 static void *sidechannel_thread(void *reference);
146 static void soft_reset(void);
147 static int soft_reset_printer(usb_printer_t *printer);
148
149
150 /*
151 * 'list_devices()' - List the available printers.
152 */
153
154 void
155 list_devices(void)
156 {
157 load_quirks();
158
159 fputs("DEBUG: list_devices\n", stderr);
160 find_device(list_cb, NULL);
161 }
162
163
164 /*
165 * 'print_device()' - Print a file to a USB device.
166 */
167
168 int /* O - Exit status */
169 print_device(const char *uri, /* I - Device URI */
170 const char *hostname, /* I - Hostname/manufacturer */
171 const char *resource, /* I - Resource/modelname */
172 char *options, /* I - Device options/serial number */
173 int print_fd, /* I - File descriptor to print */
174 int copies, /* I - Copies to print */
175 int argc, /* I - Number of command-line arguments (6 or 7) */
176 char *argv[]) /* I - Command-line arguments */
177 {
178 int bytes; /* Bytes written */
179 ssize_t total_bytes; /* Total bytes written */
180 struct sigaction action; /* Actions for POSIX signals */
181 int status = CUPS_BACKEND_OK,
182 /* Function results */
183 iostatus; /* Current IO status */
184 pthread_t read_thread_id, /* Read thread */
185 sidechannel_thread_id; /* Side-channel thread */
186 int have_sidechannel = 0, /* Was the side-channel thread started? */
187 have_backchannel = 0; /* Do we have a back channel? */
188 struct stat sidechannel_info; /* Side-channel file descriptor info */
189 unsigned char print_buffer[8192], /* Print data buffer */
190 *print_ptr; /* Pointer into print data buffer */
191 fd_set input_set; /* Input set for select() */
192 int nfds; /* Number of file descriptors */
193 struct timeval *timeout, /* Timeout pointer */
194 tv; /* Time value */
195 struct timespec cond_timeout; /* pthread condition timeout */
196 int num_opts; /* Number of options */
197 cups_option_t *opts; /* Options */
198 const char *val; /* Option value */
199
200
201 load_quirks();
202
203 /*
204 * See if the side-channel descriptor is valid...
205 */
206
207 have_sidechannel = !fstat(CUPS_SC_FD, &sidechannel_info) &&
208 S_ISSOCK(sidechannel_info.st_mode);
209
210 g.wait_eof = WAIT_EOF;
211
212 /*
213 * Connect to the printer...
214 */
215
216 fprintf(stderr, "DEBUG: Printing on printer with URI: %s\n", uri);
217 while ((g.printer = find_device(print_cb, uri)) == NULL)
218 {
219 _cupsLangPrintFilter(stderr, "INFO",
220 _("Waiting for printer to become available."));
221 sleep(5);
222 }
223
224 g.print_fd = print_fd;
225
226 /*
227 * Some devices need a reset after finishing a job, these devices are
228 * marked with the USB_QUIRK_SOFT_RESET quirk.
229 */
230 g.printer->reset_after_job = (g.printer->quirks & USB_QUIRK_SOFT_RESET ? 1 : 0);
231
232 /*
233 * If we are printing data from a print driver on stdin, ignore SIGTERM
234 * so that the driver can finish out any page data, e.g. to eject the
235 * current page. We only do this for stdin printing as otherwise there
236 * is no way to cancel a raw print job...
237 */
238
239 if (!print_fd)
240 {
241 memset(&action, 0, sizeof(action));
242
243 sigemptyset(&action.sa_mask);
244 action.sa_handler = SIG_IGN;
245 sigaction(SIGTERM, &action, NULL);
246 }
247
248 /*
249 * Start the side channel thread if the descriptor is valid...
250 */
251
252 pthread_mutex_init(&g.readwrite_lock_mutex, NULL);
253 pthread_cond_init(&g.readwrite_lock_cond, NULL);
254 g.readwrite_lock = 1;
255
256 if (have_sidechannel)
257 {
258 g.sidechannel_thread_stop = 0;
259 g.sidechannel_thread_done = 0;
260
261 pthread_cond_init(&g.sidechannel_thread_cond, NULL);
262 pthread_mutex_init(&g.sidechannel_thread_mutex, NULL);
263
264 if (pthread_create(&sidechannel_thread_id, NULL, sidechannel_thread, NULL))
265 {
266 fprintf(stderr, "DEBUG: Fatal USB error.\n");
267 _cupsLangPrintFilter(stderr, "ERROR",
268 _("There was an unrecoverable USB error."));
269 fputs("DEBUG: Couldn't create side-channel thread.\n", stderr);
270 close_device(g.printer);
271 return (CUPS_BACKEND_STOP);
272 }
273 }
274
275 /*
276 * Debug mode: If option "usb-unidir" is given, always deactivate
277 * backchannel
278 */
279
280 num_opts = cupsParseOptions(argv[5], 0, &opts);
281 val = cupsGetOption("usb-unidir", num_opts, opts);
282 if (val && strcasecmp(val, "no") && strcasecmp(val, "off") &&
283 strcasecmp(val, "false"))
284 {
285 g.printer->read_endp = -1;
286 fprintf(stderr, "DEBUG: Forced uni-directional communication "
287 "via \"usb-unidir\" option.\n");
288 }
289
290 /*
291 * Debug mode: If option "usb-no-reattach" is given, do not re-attach
292 * the usblp kernel module after the job has completed.
293 */
294
295 val = cupsGetOption("usb-no-reattach", num_opts, opts);
296 if (val && strcasecmp(val, "no") && strcasecmp(val, "off") &&
297 strcasecmp(val, "false"))
298 {
299 g.printer->usblp_attached = 0;
300 fprintf(stderr, "DEBUG: Forced not re-attaching the usblp kernel module "
301 "after the job via \"usb-no-reattach\" option.\n");
302 }
303
304 /*
305 * Get the read thread going...
306 */
307
308 if (g.printer->read_endp != -1)
309 {
310 have_backchannel = 1;
311
312 g.read_thread_stop = 0;
313 g.read_thread_done = 0;
314
315 pthread_cond_init(&g.read_thread_cond, NULL);
316 pthread_mutex_init(&g.read_thread_mutex, NULL);
317
318 if (pthread_create(&read_thread_id, NULL, read_thread, NULL))
319 {
320 fprintf(stderr, "DEBUG: Fatal USB error.\n");
321 _cupsLangPrintFilter(stderr, "ERROR",
322 _("There was an unrecoverable USB error."));
323 fputs("DEBUG: Couldn't create read thread.\n", stderr);
324 close_device(g.printer);
325 return (CUPS_BACKEND_STOP);
326 }
327 }
328 else
329 fprintf(stderr, "DEBUG: Uni-directional device/mode, back channel "
330 "deactivated.\n");
331
332 /*
333 * The main thread sends the print file...
334 */
335
336 g.drain_output = 0;
337 g.print_bytes = 0;
338 total_bytes = 0;
339 print_ptr = print_buffer;
340
341 while (status == CUPS_BACKEND_OK && copies-- > 0)
342 {
343 _cupsLangPrintFilter(stderr, "INFO", _("Sending data to printer."));
344
345 if (print_fd != STDIN_FILENO)
346 {
347 fputs("PAGE: 1 1\n", stderr);
348 lseek(print_fd, 0, SEEK_SET);
349 }
350
351 while (status == CUPS_BACKEND_OK)
352 {
353 FD_ZERO(&input_set);
354
355 if (!g.print_bytes)
356 FD_SET(print_fd, &input_set);
357
358 /*
359 * Calculate select timeout...
360 * If we have data waiting to send timeout is 100ms.
361 * else if we're draining print_fd timeout is 0.
362 * else we're waiting forever...
363 */
364
365 if (g.print_bytes)
366 {
367 tv.tv_sec = 0;
368 tv.tv_usec = 100000; /* 100ms */
369 timeout = &tv;
370 }
371 else if (g.drain_output)
372 {
373 tv.tv_sec = 0;
374 tv.tv_usec = 0;
375 timeout = &tv;
376 }
377 else
378 timeout = NULL;
379
380 /*
381 * I/O is unlocked around select...
382 */
383
384 pthread_mutex_lock(&g.readwrite_lock_mutex);
385 g.readwrite_lock = 0;
386 pthread_cond_signal(&g.readwrite_lock_cond);
387 pthread_mutex_unlock(&g.readwrite_lock_mutex);
388
389 nfds = select(print_fd + 1, &input_set, NULL, NULL, timeout);
390
391 /*
392 * Reacquire the lock...
393 */
394
395 pthread_mutex_lock(&g.readwrite_lock_mutex);
396 while (g.readwrite_lock)
397 pthread_cond_wait(&g.readwrite_lock_cond, &g.readwrite_lock_mutex);
398 g.readwrite_lock = 1;
399 pthread_mutex_unlock(&g.readwrite_lock_mutex);
400
401 if (nfds < 0)
402 {
403 if (errno == EINTR && total_bytes == 0)
404 {
405 fputs("DEBUG: Received an interrupt before any bytes were "
406 "written, aborting.\n", stderr);
407 close_device(g.printer);
408 return (CUPS_BACKEND_OK);
409 }
410 else if (errno != EAGAIN && errno != EINTR)
411 {
412 _cupsLangPrintFilter(stderr, "ERROR",
413 _("Unable to read print data."));
414 perror("DEBUG: select");
415 close_device(g.printer);
416 return (CUPS_BACKEND_FAILED);
417 }
418 }
419
420 /*
421 * If drain output has finished send a response...
422 */
423
424 if (g.drain_output && !nfds && !g.print_bytes)
425 {
426 /* Send a response... */
427 cupsSideChannelWrite(CUPS_SC_CMD_DRAIN_OUTPUT, CUPS_SC_STATUS_OK, NULL, 0, 1.0);
428 g.drain_output = 0;
429 }
430
431 /*
432 * Check if we have print data ready...
433 */
434
435 if (FD_ISSET(print_fd, &input_set))
436 {
437 g.print_bytes = read(print_fd, print_buffer, sizeof(print_buffer));
438
439 if (g.print_bytes < 0)
440 {
441 /*
442 * Read error - bail if we don't see EAGAIN or EINTR...
443 */
444
445 if (errno != EAGAIN && errno != EINTR)
446 {
447 _cupsLangPrintFilter(stderr, "ERROR",
448 _("Unable to read print data."));
449 perror("DEBUG: read");
450 close_device(g.printer);
451 return (CUPS_BACKEND_FAILED);
452 }
453
454 g.print_bytes = 0;
455 }
456 else if (g.print_bytes == 0)
457 {
458 /*
459 * End of file, break out of the loop...
460 */
461
462 break;
463 }
464
465 print_ptr = print_buffer;
466
467 fprintf(stderr, "DEBUG: Read %d bytes of print data...\n",
468 (int)g.print_bytes);
469 }
470
471 if (g.print_bytes)
472 {
473 iostatus = libusb_bulk_transfer(g.printer->handle,
474 g.printer->write_endp,
475 print_buffer, g.print_bytes,
476 &bytes, 0);
477 /*
478 * Ignore timeout errors, but retain the number of bytes written to
479 * avoid sending duplicate data...
480 */
481
482 if (iostatus == LIBUSB_ERROR_TIMEOUT)
483 {
484 fputs("DEBUG: Got USB transaction timeout during write.\n", stderr);
485 iostatus = 0;
486 }
487
488 /*
489 * If we've stalled, retry the write...
490 */
491
492 else if (iostatus == LIBUSB_ERROR_PIPE)
493 {
494 fputs("DEBUG: Got USB pipe stalled during write.\n", stderr);
495
496 iostatus = libusb_bulk_transfer(g.printer->handle,
497 g.printer->write_endp,
498 print_buffer, g.print_bytes,
499 &bytes, 0);
500 }
501
502 /*
503 * Retry a write after an aborted write since we probably just got
504 * SIGTERM...
505 */
506
507 else if (iostatus == LIBUSB_ERROR_INTERRUPTED)
508 {
509 fputs("DEBUG: Got USB return aborted during write.\n", stderr);
510
511 iostatus = libusb_bulk_transfer(g.printer->handle,
512 g.printer->write_endp,
513 print_buffer, g.print_bytes,
514 &bytes, 0);
515 }
516
517 if (iostatus)
518 {
519 /*
520 * Write error - bail if we don't see an error we can retry...
521 */
522
523 _cupsLangPrintFilter(stderr, "ERROR",
524 _("Unable to send data to printer."));
525 fprintf(stderr, "DEBUG: libusb write operation returned %x.\n",
526 iostatus);
527
528 status = CUPS_BACKEND_FAILED;
529 break;
530 }
531 else if (bytes > 0)
532 {
533 fprintf(stderr, "DEBUG: Wrote %d bytes of print data...\n",
534 (int)bytes);
535
536 g.print_bytes -= bytes;
537 print_ptr += bytes;
538 total_bytes += bytes;
539 }
540 }
541
542 if (print_fd != 0 && status == CUPS_BACKEND_OK)
543 fprintf(stderr, "DEBUG: Sending print file, " CUPS_LLFMT " bytes...\n",
544 CUPS_LLCAST total_bytes);
545 }
546 }
547
548 fprintf(stderr, "DEBUG: Sent " CUPS_LLFMT " bytes...\n",
549 CUPS_LLCAST total_bytes);
550
551 /*
552 * Signal the side channel thread to exit...
553 */
554
555 if (have_sidechannel)
556 {
557 close(CUPS_SC_FD);
558 pthread_mutex_lock(&g.readwrite_lock_mutex);
559 g.readwrite_lock = 0;
560 pthread_cond_signal(&g.readwrite_lock_cond);
561 pthread_mutex_unlock(&g.readwrite_lock_mutex);
562
563 g.sidechannel_thread_stop = 1;
564 pthread_mutex_lock(&g.sidechannel_thread_mutex);
565
566 if (!g.sidechannel_thread_done)
567 {
568 gettimeofday(&tv, NULL);
569 cond_timeout.tv_sec = tv.tv_sec + WAIT_SIDE_DELAY;
570 cond_timeout.tv_nsec = tv.tv_usec * 1000;
571
572 while (!g.sidechannel_thread_done)
573 {
574 if (pthread_cond_timedwait(&g.sidechannel_thread_cond,
575 &g.sidechannel_thread_mutex,
576 &cond_timeout) != 0)
577 break;
578 }
579 }
580
581 pthread_mutex_unlock(&g.sidechannel_thread_mutex);
582 }
583
584 /*
585 * Signal the read thread to exit then wait 7 seconds for it to complete...
586 */
587
588 if (have_backchannel)
589 {
590 g.read_thread_stop = 1;
591
592 pthread_mutex_lock(&g.read_thread_mutex);
593
594 if (!g.read_thread_done)
595 {
596 fputs("DEBUG: Waiting for read thread to exit...\n", stderr);
597
598 gettimeofday(&tv, NULL);
599 cond_timeout.tv_sec = tv.tv_sec + WAIT_EOF_DELAY;
600 cond_timeout.tv_nsec = tv.tv_usec * 1000;
601
602 while (!g.read_thread_done)
603 {
604 if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex,
605 &cond_timeout) != 0)
606 break;
607 }
608
609 /*
610 * If it didn't exit abort the pending read and wait an additional
611 * second...
612 */
613
614 if (!g.read_thread_done)
615 {
616 fputs("DEBUG: Read thread still active, aborting the pending read...\n",
617 stderr);
618
619 g.wait_eof = 0;
620
621 gettimeofday(&tv, NULL);
622 cond_timeout.tv_sec = tv.tv_sec + 1;
623 cond_timeout.tv_nsec = tv.tv_usec * 1000;
624
625 while (!g.read_thread_done)
626 {
627 if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex,
628 &cond_timeout) != 0)
629 break;
630 }
631 }
632 }
633
634 pthread_mutex_unlock(&g.read_thread_mutex);
635 }
636
637 /*
638 * Close the connection and input file and general clean up...
639 */
640
641 if (g.printer->quirks & USB_QUIRK_DELAY_CLOSE)
642 sleep(1);
643
644 close_device(g.printer);
645
646 /*
647 * Clean up ....
648 */
649
650 libusb_free_device_list(all_list, 1);
651 libusb_exit(NULL);
652
653 return (status);
654 }
655
656
657 /*
658 * 'close_device()' - Close the connection to the USB printer.
659 */
660
661 static int /* I - 0 on success, -1 on failure */
662 close_device(usb_printer_t *printer) /* I - Printer */
663 {
664 struct libusb_device_descriptor devdesc;
665 /* Current device descriptor */
666 struct libusb_config_descriptor *confptr;
667 /* Pointer to current configuration */
668
669
670 if (printer->handle)
671 {
672 /*
673 * Release interfaces before closing so that we know all data is written
674 * to the device...
675 */
676
677 int errcode; /* Return value of libusb function */
678 int number1, /* Interface number */
679 number2; /* Configuration number */
680
681 errcode =
682 libusb_get_config_descriptor(printer->device, printer->conf, &confptr);
683 if (errcode >= 0)
684 {
685 number1 = confptr->interface[printer->iface].
686 altsetting[printer->altset].bInterfaceNumber;
687 libusb_release_interface(printer->handle, number1);
688
689 number2 = confptr->bConfigurationValue;
690
691 libusb_free_config_descriptor(confptr);
692
693 /*
694 * If we have changed the configuration from one valid configuration
695 * to another, restore the old one
696 */
697 if (printer->origconf > 0 && printer->origconf != number2)
698 {
699 fprintf(stderr, "DEBUG: Restoring USB device configuration: %d -> %d\n",
700 number2, printer->origconf);
701 if ((errcode = libusb_set_configuration(printer->handle,
702 printer->origconf)) < 0)
703 {
704 if (errcode != LIBUSB_ERROR_BUSY)
705 {
706 errcode =
707 libusb_get_device_descriptor (printer->device, &devdesc);
708 if (errcode < 0)
709 fprintf(stderr,
710 "DEBUG: Failed to set configuration %d\n",
711 printer->origconf);
712 else
713 fprintf(stderr,
714 "DEBUG: Failed to set configuration %d for %04x:%04x\n",
715 printer->origconf, devdesc.idVendor, devdesc.idProduct);
716 }
717 }
718 }
719
720 /*
721 * Re-attach "usblp" kernel module if it was attached before using this
722 * device
723 */
724 if (printer->usblp_attached == 1)
725 if (libusb_attach_kernel_driver(printer->handle, number1) < 0)
726 {
727 errcode = libusb_get_device_descriptor (printer->device, &devdesc);
728 if (errcode < 0)
729 fprintf(stderr,
730 "DEBUG: Failed to re-attach \"usblp\" kernel module\n");
731 else
732 fprintf(stderr,
733 "DEBUG: Failed to re-attach \"usblp\" kernel module to "
734 "%04x:%04x\n", devdesc.idVendor, devdesc.idProduct);
735 }
736 }
737 else
738 fprintf(stderr,
739 "DEBUG: Failed to get configuration descriptor %d\n",
740 printer->conf);
741
742 /*
743 * Reset the device to clean up after the job
744 */
745
746 if (printer->reset_after_job == 1)
747 {
748 if ((errcode = libusb_reset_device(printer->handle)) < 0)
749 fprintf(stderr,
750 "DEBUG: Device reset failed, error code: %d\n",
751 errcode);
752 else
753 fprintf(stderr,
754 "DEBUG: Resetting printer.\n");
755 }
756
757 /*
758 * Close the interface and return...
759 */
760
761 libusb_close(printer->handle);
762 printer->handle = NULL;
763 }
764
765 return (0);
766 }
767
768
769 /*
770 * 'compare_quirks()' - Compare two quirks entries.
771 */
772
773 static int /* O - Result of comparison */
774 compare_quirks(usb_quirk_t *a, /* I - First quirk entry */
775 usb_quirk_t *b) /* I - Second quirk entry */
776 {
777 int result; /* Result of comparison */
778
779 if ((result = b->vendor_id - a->vendor_id) == 0)
780 result = b->product_id - a->product_id;
781
782 return (result);
783 }
784
785
786 /*
787 * 'find_device()' - Find or enumerate USB printers.
788 */
789
790 static usb_printer_t * /* O - Found printer */
791 find_device(usb_cb_t cb, /* I - Callback function */
792 const void *data) /* I - User data for callback */
793 {
794 libusb_device **list; /* List of connected USB devices */
795 libusb_device *device = NULL; /* Current device */
796 struct libusb_device_descriptor devdesc;
797 /* Current device descriptor */
798 struct libusb_config_descriptor *confptr = NULL;
799 /* Pointer to current configuration */
800 const struct libusb_interface *ifaceptr = NULL;
801 /* Pointer to current interface */
802 const struct libusb_interface_descriptor *altptr = NULL;
803 /* Pointer to current alternate setting */
804 const struct libusb_endpoint_descriptor *endpptr = NULL;
805 /* Pointer to current endpoint */
806 ssize_t err = 0, /* Error code */
807 numdevs, /* number of connected devices */
808 i = 0;
809 uint8_t conf, /* Current configuration */
810 iface, /* Current interface */
811 altset, /* Current alternate setting */
812 protocol, /* Current protocol */
813 endp, /* Current endpoint */
814 read_endp, /* Current read endpoint */
815 write_endp; /* Current write endpoint */
816 char device_id[1024],/* IEEE-1284 device ID */
817 device_uri[1024];
818 /* Device URI */
819 static usb_printer_t printer; /* Current printer */
820
821
822 /*
823 * Initialize libusb...
824 */
825
826 err = libusb_init(NULL);
827 if (err)
828 {
829 fprintf(stderr, "DEBUG: Unable to initialize USB access via libusb, "
830 "libusb error %i\n", (int)err);
831 return (NULL);
832 }
833
834 numdevs = libusb_get_device_list(NULL, &list);
835 fprintf(stderr, "DEBUG: libusb_get_device_list=%d\n", (int)numdevs);
836
837 /*
838 * Then loop through the devices it found...
839 */
840
841 if (numdevs > 0)
842 for (i = 0; i < numdevs; i++)
843 {
844 device = list[i];
845
846 /*
847 * Ignore devices with no configuration data and anything that is not
848 * a printer...
849 */
850
851 if (libusb_get_device_descriptor(device, &devdesc) < 0)
852 continue;
853
854 if (!devdesc.bNumConfigurations || !devdesc.idVendor ||
855 !devdesc.idProduct)
856 continue;
857
858 printer.quirks = find_quirks(devdesc.idVendor, devdesc.idProduct);
859
860 /*
861 * Ignore blacklisted printers...
862 */
863
864 if (printer.quirks & USB_QUIRK_BLACKLIST)
865 continue;
866
867 for (conf = 0; conf < devdesc.bNumConfigurations; conf ++)
868 {
869 if (libusb_get_config_descriptor(device, conf, &confptr) < 0)
870 continue;
871 for (iface = 0, ifaceptr = confptr->interface;
872 iface < confptr->bNumInterfaces;
873 iface ++, ifaceptr ++)
874 {
875 /*
876 * Some printers offer multiple interfaces...
877 */
878
879 protocol = 0;
880
881 for (altset = 0, altptr = ifaceptr->altsetting;
882 altset < ifaceptr->num_altsetting;
883 altset ++, altptr ++)
884 {
885 /*
886 * Currently we only support unidirectional and bidirectional
887 * printers. Future versions of this code will support the
888 * 1284.4 (packet mode) protocol as well.
889 */
890
891 if (((altptr->bInterfaceClass != LIBUSB_CLASS_PRINTER ||
892 altptr->bInterfaceSubClass != 1) &&
893 ((printer.quirks & USB_QUIRK_VENDOR_CLASS) == 0)) ||
894 (altptr->bInterfaceProtocol != 1 && /* Unidirectional */
895 altptr->bInterfaceProtocol != 2) || /* Bidirectional */
896 altptr->bInterfaceProtocol < protocol)
897 continue;
898
899 if (printer.quirks & USB_QUIRK_VENDOR_CLASS)
900 fprintf(stderr, "DEBUG: Printer does not report class 7 and/or "
901 "subclass 1 but works as a printer anyway\n");
902
903 read_endp = 0xff;
904 write_endp = 0xff;
905
906 for (endp = 0, endpptr = altptr->endpoint;
907 endp < altptr->bNumEndpoints;
908 endp ++, endpptr ++)
909 if ((endpptr->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) ==
910 LIBUSB_TRANSFER_TYPE_BULK)
911 {
912 if (endpptr->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK)
913 read_endp = endp;
914 else
915 write_endp = endp;
916 }
917
918 if (write_endp != 0xff)
919 {
920 /*
921 * Save the best match so far...
922 */
923
924 protocol = altptr->bInterfaceProtocol;
925 printer.altset = altset;
926 printer.write_endp = write_endp;
927 if (protocol > 1)
928 printer.read_endp = read_endp;
929 else
930 printer.read_endp = -1;
931 }
932 }
933
934 if (protocol > 0)
935 {
936 printer.device = device;
937 printer.conf = conf;
938 printer.iface = iface;
939 printer.protocol = protocol;
940 printer.handle = NULL;
941
942 if (!open_device(&printer, data != NULL))
943 {
944 get_device_id(&printer, device_id, sizeof(device_id));
945 make_device_uri(&printer, device_id, device_uri,
946 sizeof(device_uri));
947
948 fprintf(stderr, "DEBUG2: Printer found with device ID: %s "
949 "Device URI: %s\n",
950 device_id, device_uri);
951
952 if ((*cb)(&printer, device_uri, device_id, data))
953 {
954 fprintf(stderr, "DEBUG: Device protocol: %d\n",
955 printer.protocol);
956 if (printer.quirks & USB_QUIRK_UNIDIR)
957 {
958 printer.read_endp = -1;
959 fprintf(stderr, "DEBUG: Printer reports bi-di support "
960 "but in reality works only uni-directionally\n");
961 }
962 if (printer.read_endp != -1)
963 {
964 printer.read_endp = confptr->interface[printer.iface].
965 altsetting[printer.altset].
966 endpoint[printer.read_endp].
967 bEndpointAddress;
968 }
969 else
970 fprintf(stderr, "DEBUG: Uni-directional USB communication "
971 "only!\n");
972 printer.write_endp = confptr->interface[printer.iface].
973 altsetting[printer.altset].
974 endpoint[printer.write_endp].
975 bEndpointAddress;
976 if (printer.quirks & USB_QUIRK_NO_REATTACH)
977 {
978 printer.usblp_attached = 0;
979 fprintf(stderr, "DEBUG: Printer does not like usblp "
980 "kernel module to be re-attached after job\n");
981 }
982 libusb_free_config_descriptor(confptr);
983 return (&printer);
984 }
985
986 close_device(&printer);
987 }
988 }
989 }
990 libusb_free_config_descriptor(confptr);
991 }
992 }
993
994 /*
995 * If we get this far without returning, then we haven't found a printer
996 * to print to...
997 */
998
999 /*
1000 * Clean up ....
1001 */
1002
1003 if (numdevs >= 0)
1004 libusb_free_device_list(list, 1);
1005 libusb_exit(NULL);
1006
1007 return (NULL);
1008 }
1009
1010
1011 /*
1012 * 'find_quirks()' - Find the quirks for the given printer, if any.
1013 *
1014 * First looks for an exact match, then looks for the vendor ID wildcard match.
1015 */
1016
1017 static unsigned /* O - Quirks flags */
1018 find_quirks(int vendor_id, /* I - Vendor ID */
1019 int product_id) /* I - Product ID */
1020 {
1021 usb_quirk_t key, /* Search key */
1022 *match; /* Matching quirk entry */
1023
1024
1025 key.vendor_id = vendor_id;
1026 key.product_id = product_id;
1027
1028 if ((match = cupsArrayFind(all_quirks, &key)) != NULL)
1029 return (match->quirks);
1030
1031 key.product_id = 0;
1032
1033 if ((match = cupsArrayFind(all_quirks, &key)) != NULL)
1034 return (match->quirks);
1035
1036 return (USB_QUIRK_WHITELIST);
1037 }
1038
1039
1040 /*
1041 * 'get_device_id()' - Get the IEEE-1284 device ID for the printer.
1042 */
1043
1044 static int /* O - 0 on success, -1 on error */
1045 get_device_id(usb_printer_t *printer, /* I - Printer */
1046 char *buffer, /* I - String buffer */
1047 size_t bufsize) /* I - Number of bytes in buffer */
1048 {
1049 int length; /* Length of device ID */
1050
1051
1052 if (libusb_control_transfer(printer->handle,
1053 LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_ENDPOINT_IN |
1054 LIBUSB_RECIPIENT_INTERFACE,
1055 0, printer->conf,
1056 (printer->iface << 8) | printer->altset,
1057 (unsigned char *)buffer, bufsize, 5000) < 0)
1058 {
1059 *buffer = '\0';
1060 return (-1);
1061 }
1062
1063 /*
1064 * Extract the length of the device ID string from the first two
1065 * bytes. The 1284 spec says the length is stored MSB first...
1066 */
1067
1068 length = (int)((((unsigned)buffer[0] & 255) << 8) | ((unsigned)buffer[1] & 255));
1069
1070 /*
1071 * Check to see if the length is larger than our buffer or less than 14 bytes
1072 * (the minimum valid device ID is "MFG:x;MDL:y;" with 2 bytes for the length).
1073 *
1074 * If the length is out-of-range, assume that the vendor incorrectly
1075 * implemented the 1284 spec and re-read the length as LSB first,..
1076 */
1077
1078 if (length > bufsize || length < 14)
1079 length = (int)((((unsigned)buffer[1] & 255) << 8) | ((unsigned)buffer[0] & 255));
1080
1081 if (length > bufsize)
1082 length = bufsize;
1083
1084 if (length < 14)
1085 {
1086 /*
1087 * Invalid device ID, clear it!
1088 */
1089
1090 *buffer = '\0';
1091 return (-1);
1092 }
1093
1094 length -= 2;
1095
1096 /*
1097 * Copy the device ID text to the beginning of the buffer and
1098 * nul-terminate.
1099 */
1100
1101 memmove(buffer, buffer + 2, (size_t)length);
1102 buffer[length] = '\0';
1103
1104 return (0);
1105 }
1106
1107
1108 /*
1109 * 'list_cb()' - List USB printers for discovery.
1110 */
1111
1112 static int /* O - 0 to continue, 1 to stop */
1113 list_cb(usb_printer_t *printer, /* I - Printer */
1114 const char *device_uri, /* I - Device URI */
1115 const char *device_id, /* I - IEEE-1284 device ID */
1116 const void *data) /* I - User data (not used) */
1117 {
1118 char make_model[1024]; /* Make and model */
1119
1120
1121 /*
1122 * Get the device URI and make/model strings...
1123 */
1124
1125 if (backendGetMakeModel(device_id, make_model, sizeof(make_model)))
1126 strlcpy(make_model, "Unknown", sizeof(make_model));
1127
1128 /*
1129 * Report the printer...
1130 */
1131
1132 cupsBackendReport("direct", device_uri, make_model, make_model, device_id,
1133 NULL);
1134
1135 /*
1136 * Keep going...
1137 */
1138
1139 return (0);
1140 }
1141
1142
1143 /*
1144 * 'load_quirks()' - Load all quirks files in the /usr/share/cups/usb directory.
1145 */
1146
1147 static void
1148 load_quirks(void)
1149 {
1150 const char *datadir; /* CUPS_DATADIR environment variable */
1151 char filename[1024], /* Filename */
1152 line[1024]; /* Line from file */
1153 cups_dir_t *dir; /* Directory */
1154 cups_dentry_t *dent; /* Directory entry */
1155 cups_file_t *fp; /* Quirks file */
1156 usb_quirk_t *quirk; /* New quirk */
1157
1158
1159 all_quirks = cupsArrayNew((cups_array_func_t)compare_quirks, NULL);
1160
1161 if ((datadir = getenv("CUPS_DATADIR")) == NULL)
1162 datadir = CUPS_DATADIR;
1163
1164 snprintf(filename, sizeof(filename), "%s/usb", datadir);
1165 if ((dir = cupsDirOpen(filename)) == NULL)
1166 {
1167 perror(filename);
1168 return;
1169 }
1170
1171 fprintf(stderr, "DEBUG: Loading USB quirks from \"%s\".\n", filename);
1172
1173 while ((dent = cupsDirRead(dir)) != NULL)
1174 {
1175 if (!S_ISREG(dent->fileinfo.st_mode))
1176 continue;
1177
1178 snprintf(filename, sizeof(filename), "%s/usb/%s", datadir, dent->filename);
1179 if ((fp = cupsFileOpen(filename, "r")) == NULL)
1180 {
1181 perror(filename);
1182 continue;
1183 }
1184
1185 while (cupsFileGets(fp, line, sizeof(line)))
1186 {
1187 /*
1188 * Skip blank and comment lines...
1189 */
1190
1191 if (line[0] == '#' || !line[0])
1192 continue;
1193
1194 /*
1195 * Add a quirk...
1196 */
1197
1198 if ((quirk = calloc(1, sizeof(usb_quirk_t))) == NULL)
1199 {
1200 perror("DEBUG: Unable to allocate memory for quirk");
1201 break;
1202 }
1203
1204 if (sscanf(line, "%x%x", &quirk->vendor_id, &quirk->product_id) < 1)
1205 {
1206 fprintf(stderr, "DEBUG: Bad line: %s\n", line);
1207 free(quirk);
1208 continue;
1209 }
1210
1211 if (strstr(line, " blacklist"))
1212 quirk->quirks |= USB_QUIRK_BLACKLIST;
1213
1214 if (strstr(line, " delay-close"))
1215 quirk->quirks |= USB_QUIRK_DELAY_CLOSE;
1216
1217 if (strstr(line, " no-reattach"))
1218 quirk->quirks |= USB_QUIRK_NO_REATTACH;
1219
1220 if (strstr(line, " soft-reset"))
1221 quirk->quirks |= USB_QUIRK_SOFT_RESET;
1222
1223 if (strstr(line, " unidir"))
1224 quirk->quirks |= USB_QUIRK_UNIDIR;
1225
1226 if (strstr(line, " usb-init"))
1227 quirk->quirks |= USB_QUIRK_USB_INIT;
1228
1229 if (strstr(line, " vendor-class"))
1230 quirk->quirks |= USB_QUIRK_VENDOR_CLASS;
1231
1232 cupsArrayAdd(all_quirks, quirk);
1233 }
1234
1235 cupsFileClose(fp);
1236 }
1237
1238 fprintf(stderr, "DEBUG: Loaded %d quirks.\n", cupsArrayCount(all_quirks));
1239
1240 cupsDirClose(dir);
1241 }
1242
1243
1244 /*
1245 * 'make_device_uri()' - Create a device URI for a USB printer.
1246 */
1247
1248 static char * /* O - Device URI */
1249 make_device_uri(
1250 usb_printer_t *printer, /* I - Printer */
1251 const char *device_id, /* I - IEEE-1284 device ID */
1252 char *uri, /* I - Device URI buffer */
1253 size_t uri_size) /* I - Size of device URI buffer */
1254 {
1255 struct libusb_device_descriptor devdesc;
1256 /* Current device descriptor */
1257 char options[1024]; /* Device URI options */
1258 int num_values; /* Number of 1284 parameters */
1259 cups_option_t *values; /* 1284 parameters */
1260 const char *mfg, /* Manufacturer */
1261 *mdl, /* Model */
1262 *des = NULL, /* Description */
1263 *sern; /* Serial number */
1264 size_t mfglen; /* Length of manufacturer string */
1265 char tempmfg[256], /* Temporary manufacturer string */
1266 tempsern[256], /* Temporary serial number string */
1267 *tempptr; /* Pointer into temp string */
1268
1269
1270 /*
1271 * Get the make, model, and serial numbers...
1272 */
1273
1274 num_values = _cupsGet1284Values(device_id, &values);
1275
1276 if ((sern = cupsGetOption("SERIALNUMBER", num_values, values)) == NULL)
1277 if ((sern = cupsGetOption("SERN", num_values, values)) == NULL)
1278 if ((sern = cupsGetOption("SN", num_values, values)) == NULL &&
1279 ((libusb_get_device_descriptor(printer->device, &devdesc) >= 0) &&
1280 devdesc.iSerialNumber))
1281 {
1282 /*
1283 * Try getting the serial number from the device itself...
1284 */
1285
1286 int length =
1287 libusb_get_string_descriptor_ascii(printer->handle,
1288 devdesc.iSerialNumber,
1289 (unsigned char *)tempsern,
1290 sizeof(tempsern) - 1);
1291 if (length > 0)
1292 {
1293 tempsern[length] = '\0';
1294 sern = tempsern;
1295 }
1296 }
1297
1298 if ((mfg = cupsGetOption("MANUFACTURER", num_values, values)) == NULL)
1299 mfg = cupsGetOption("MFG", num_values, values);
1300
1301 if ((mdl = cupsGetOption("MODEL", num_values, values)) == NULL)
1302 mdl = cupsGetOption("MDL", num_values, values);
1303
1304 /*
1305 * To maintain compatibility with the original character device backend on
1306 * Linux and *BSD, map manufacturer names...
1307 */
1308
1309 if (mfg)
1310 {
1311 if (!_cups_strcasecmp(mfg, "Hewlett-Packard"))
1312 mfg = "HP";
1313 else if (!_cups_strcasecmp(mfg, "Lexmark International"))
1314 mfg = "Lexmark";
1315 }
1316 else
1317 {
1318 /*
1319 * No manufacturer? Use the model string or description...
1320 */
1321
1322 if (mdl)
1323 _ppdNormalizeMakeAndModel(mdl, tempmfg, sizeof(tempmfg));
1324 else if ((des = cupsGetOption("DESCRIPTION", num_values, values)) != NULL ||
1325 (des = cupsGetOption("DES", num_values, values)) != NULL)
1326 _ppdNormalizeMakeAndModel(des, tempmfg, sizeof(tempmfg));
1327 else
1328 strlcpy(tempmfg, "Unknown", sizeof(tempmfg));
1329
1330 if ((tempptr = strchr(tempmfg, ' ')) != NULL)
1331 *tempptr = '\0';
1332
1333 mfg = tempmfg;
1334 }
1335
1336 if (!mdl)
1337 {
1338 /*
1339 * No model? Use description...
1340 */
1341 if (des)
1342 mdl = des; /* We remove the manufacturer name below */
1343 else if (!strncasecmp(mfg, "Unknown", 7))
1344 mdl = "Printer";
1345 else
1346 mdl = "Unknown Model";
1347 }
1348
1349 mfglen = strlen(mfg);
1350
1351 if (!strncasecmp(mdl, mfg, mfglen) && _cups_isspace(mdl[mfglen]))
1352 {
1353 mdl += mfglen + 1;
1354
1355 while (_cups_isspace(*mdl))
1356 mdl ++;
1357 }
1358
1359 /*
1360 * Generate the device URI from the manufacturer, model, serial number,
1361 * and interface number...
1362 */
1363
1364 if (sern)
1365 {
1366 if (printer->iface > 0)
1367 snprintf(options, sizeof(options), "?serial=%s&interface=%d", sern,
1368 printer->iface);
1369 else
1370 snprintf(options, sizeof(options), "?serial=%s", sern);
1371 }
1372 else if (printer->iface > 0)
1373 snprintf(options, sizeof(options), "?interface=%d", printer->iface);
1374 else
1375 options[0] = '\0';
1376
1377 httpAssembleURIf(HTTP_URI_CODING_ALL, uri, uri_size, "usb", NULL, mfg, 0,
1378 "/%s%s", mdl, options);
1379
1380 cupsFreeOptions(num_values, values);
1381
1382 return (uri);
1383 }
1384
1385
1386 /*
1387 * 'open_device()' - Open a connection to the USB printer.
1388 */
1389
1390 static int /* O - 0 on success, -1 on error */
1391 open_device(usb_printer_t *printer, /* I - Printer */
1392 int verbose) /* I - Update connecting-to-device state? */
1393 {
1394 struct libusb_device_descriptor devdesc;
1395 /* Current device descriptor */
1396 struct libusb_config_descriptor *confptr = NULL;
1397 /* Pointer to current configuration */
1398 int number1 = -1, /* Configuration/interface/altset */
1399 number2 = -1, /* numbers */
1400 errcode = 0;
1401 char current; /* Current configuration */
1402
1403
1404 /*
1405 * Return immediately if we are already connected...
1406 */
1407
1408 if (printer->handle)
1409 return (0);
1410
1411 /*
1412 * Try opening the printer...
1413 */
1414
1415 if ((errcode = libusb_open(printer->device, &printer->handle)) < 0)
1416 {
1417 fprintf(stderr, "DEBUG: Failed to open device, code: %d\n",
1418 errcode);
1419 return (-1);
1420 }
1421
1422 printer->usblp_attached = 0;
1423 printer->reset_after_job = 0;
1424
1425 if (verbose)
1426 fputs("STATE: +connecting-to-device\n", stderr);
1427
1428 if ((errcode = libusb_get_device_descriptor(printer->device, &devdesc)) < 0)
1429 {
1430 fprintf(stderr, "DEBUG: Failed to get device descriptor, code: %d\n",
1431 errcode);
1432 goto error;
1433 }
1434
1435 /*
1436 * Get the "usblp" kernel module out of the way. This backend only
1437 * works without the module attached.
1438 */
1439
1440 errcode = libusb_kernel_driver_active(printer->handle, printer->iface);
1441 if (errcode == 0)
1442 printer->usblp_attached = 0;
1443 else if (errcode == 1)
1444 {
1445 printer->usblp_attached = 1;
1446 if ((errcode =
1447 libusb_detach_kernel_driver(printer->handle, printer->iface)) < 0)
1448 {
1449 fprintf(stderr, "DEBUG: Failed to detach \"usblp\" module from %04x:%04x\n",
1450 devdesc.idVendor, devdesc.idProduct);
1451 goto error;
1452 }
1453 }
1454 else
1455 {
1456 printer->usblp_attached = 0;
1457
1458 if (errcode != LIBUSB_ERROR_NOT_SUPPORTED)
1459 {
1460 fprintf(stderr,
1461 "DEBUG: Failed to check whether %04x:%04x has the \"usblp\" "
1462 "kernel module attached\n", devdesc.idVendor, devdesc.idProduct);
1463 goto error;
1464 }
1465 }
1466
1467 /*
1468 * Set the desired configuration, but only if it needs changing. Some
1469 * printers (e.g., Samsung) don't like libusb_set_configuration. It will
1470 * succeed, but the following print job is sometimes silently lost by the
1471 * printer.
1472 */
1473
1474 if (libusb_control_transfer(printer->handle,
1475 LIBUSB_REQUEST_TYPE_STANDARD | LIBUSB_ENDPOINT_IN |
1476 LIBUSB_RECIPIENT_DEVICE,
1477 8, /* GET_CONFIGURATION */
1478 0, 0, (unsigned char *)&current, 1, 5000) < 0)
1479 current = 0; /* Assume not configured */
1480
1481 printer->origconf = current;
1482
1483 if ((errcode =
1484 libusb_get_config_descriptor (printer->device, printer->conf, &confptr))
1485 < 0)
1486 {
1487 fprintf(stderr, "DEBUG: Failed to get config descriptor for %04x:%04x\n",
1488 devdesc.idVendor, devdesc.idProduct);
1489 goto error;
1490 }
1491 number1 = confptr->bConfigurationValue;
1492
1493 if (number1 != current)
1494 {
1495 fprintf(stderr, "DEBUG: Switching USB device configuration: %d -> %d\n",
1496 current, number1);
1497 if ((errcode = libusb_set_configuration(printer->handle, number1)) < 0)
1498 {
1499 /*
1500 * If the set fails, chances are that the printer only supports a
1501 * single configuration. Technically these printers don't conform to
1502 * the USB printer specification, but otherwise they'll work...
1503 */
1504
1505 if (errcode != LIBUSB_ERROR_BUSY)
1506 fprintf(stderr, "DEBUG: Failed to set configuration %d for %04x:%04x\n",
1507 number1, devdesc.idVendor, devdesc.idProduct);
1508 }
1509 }
1510
1511 /*
1512 * Claim interfaces as needed...
1513 */
1514
1515 number1 = confptr->interface[printer->iface].
1516 altsetting[printer->altset].bInterfaceNumber;
1517
1518 while ((errcode = libusb_claim_interface(printer->handle, number1)) < 0)
1519 {
1520 if (errcode != LIBUSB_ERROR_BUSY)
1521 {
1522 fprintf(stderr,
1523 "DEBUG: Failed to claim interface %d for %04x:%04x: %s\n",
1524 number1, devdesc.idVendor, devdesc.idProduct, strerror(errno));
1525
1526 goto error;
1527 }
1528 else if ((errcode = libusb_detach_kernel_driver(printer->handle, printer->iface)) < 0)
1529 {
1530 fprintf(stderr,
1531 "DEBUG: Failed to detach \"usblp\" module from %04x:%04x\n",
1532 devdesc.idVendor, devdesc.idProduct);
1533
1534 goto error;
1535 }
1536
1537 sleep (1);
1538 }
1539
1540 /*
1541 * Set alternate setting, but only if there is more than one option. Some
1542 * printers (e.g., Samsung) don't like usb_set_altinterface.
1543 */
1544
1545 if (confptr->interface[printer->iface].num_altsetting > 1)
1546 {
1547 number1 = confptr->interface[printer->iface].
1548 altsetting[printer->altset].bInterfaceNumber;
1549 number2 = confptr->interface[printer->iface].
1550 altsetting[printer->altset].bAlternateSetting;
1551
1552 while ((errcode =
1553 libusb_set_interface_alt_setting(printer->handle, number1, number2))
1554 < 0)
1555 {
1556 if (errcode != LIBUSB_ERROR_BUSY)
1557 {
1558 fprintf(stderr,
1559 "DEBUG: Failed to set alternate interface %d for %04x:%04x: "
1560 "%s\n",
1561 number2, devdesc.idVendor, devdesc.idProduct, strerror(errno));
1562
1563 goto error;
1564 }
1565 }
1566 }
1567
1568 libusb_free_config_descriptor(confptr);
1569
1570 if (verbose)
1571 fputs("STATE: -connecting-to-device\n", stderr);
1572
1573 return (0);
1574
1575 /*
1576 * If we get here, there was a hard error...
1577 */
1578
1579 error:
1580
1581 if (verbose)
1582 fputs("STATE: -connecting-to-device\n", stderr);
1583
1584 libusb_close(printer->handle);
1585 printer->handle = NULL;
1586
1587 return (-1);
1588 }
1589
1590
1591 /*
1592 * 'print_cb()' - Find a USB printer for printing.
1593 */
1594
1595 static int /* O - 0 to continue, 1 to stop (found) */
1596 print_cb(usb_printer_t *printer, /* I - Printer */
1597 const char *device_uri, /* I - Device URI */
1598 const char *device_id, /* I - IEEE-1284 device ID */
1599 const void *data) /* I - User data (make, model, S/N) */
1600 {
1601 char requested_uri[1024], /* Requested URI */
1602 *requested_ptr, /* Pointer into requested URI */
1603 detected_uri[1024], /* Detected URI */
1604 *detected_ptr; /* Pointer into detected URI */
1605
1606
1607 /*
1608 * If we have an exact match, stop now...
1609 */
1610
1611 if (!strcmp((char *)data, device_uri))
1612 return (1);
1613
1614 /*
1615 * Work on copies of the URIs...
1616 */
1617
1618 strlcpy(requested_uri, (char *)data, sizeof(requested_uri));
1619 strlcpy(detected_uri, device_uri, sizeof(detected_uri));
1620
1621 /*
1622 * libusb-discovered URIs can have an "interface" specification and this
1623 * never happens for usblp-discovered URIs, so remove the "interface"
1624 * specification from the URI which we are checking currently. This way a
1625 * queue for a usblp-discovered printer can now be accessed via libusb.
1626 *
1627 * Similarly, strip "?serial=NNN...NNN" as needed.
1628 */
1629
1630 if ((requested_ptr = strstr(requested_uri, "?interface=")) == NULL)
1631 requested_ptr = strstr(requested_uri, "&interface=");
1632 if ((detected_ptr = strstr(detected_uri, "?interface=")) == NULL)
1633 detected_ptr = strstr(detected_uri, "&interface=");
1634
1635 if (!requested_ptr && detected_ptr)
1636 {
1637 /*
1638 * Strip "[?&]interface=nnn" from the detected printer.
1639 */
1640
1641 *detected_ptr = '\0';
1642 }
1643 else if (requested_ptr && !detected_ptr)
1644 {
1645 /*
1646 * Strip "[?&]interface=nnn" from the requested printer.
1647 */
1648
1649 *requested_ptr = '\0';
1650 }
1651
1652 if ((requested_ptr = strstr(requested_uri, "?serial=?")) != NULL)
1653 {
1654 /*
1655 * Strip "?serial=?" from the requested printer. This is a special
1656 * case, as "?serial=?" means no serial number and not the serial
1657 * number '?'. This is not covered by the checks below...
1658 */
1659
1660 *requested_ptr = '\0';
1661 }
1662
1663 if ((requested_ptr = strstr(requested_uri, "?serial=")) == NULL &&
1664 (detected_ptr = strstr(detected_uri, "?serial=")) != NULL)
1665 {
1666 /*
1667 * Strip "?serial=nnn" from the detected printer.
1668 */
1669
1670 *detected_ptr = '\0';
1671 }
1672 else if (requested_ptr && !detected_ptr)
1673 {
1674 /*
1675 * Strip "?serial=nnn" from the requested printer.
1676 */
1677
1678 *requested_ptr = '\0';
1679 }
1680
1681 return (!strcmp(requested_uri, detected_uri));
1682 }
1683
1684
1685 /*
1686 * 'read_thread()' - Thread to read the backchannel data on.
1687 */
1688
1689 static void *read_thread(void *reference)
1690 {
1691 unsigned char readbuffer[512];
1692 int rbytes;
1693 int readstatus;
1694 struct timeval now,
1695 delay,
1696 end,
1697 timeleft;
1698
1699
1700 (void)reference;
1701
1702 /*
1703 * Read frequency: once every 250 milliseconds.
1704 */
1705
1706 delay.tv_sec = 0;
1707 delay.tv_usec = 250000;
1708
1709 do
1710 {
1711 /*
1712 * Remember when we started so we can throttle the loop after the read
1713 * call...
1714 */
1715
1716 gettimeofday(&now, NULL);
1717
1718 /*
1719 * Calculate what 250 milliSeconds are in absolute time...
1720 */
1721
1722 timeradd(&now, &delay, &end);
1723
1724 rbytes = sizeof(readbuffer);
1725 readstatus = libusb_bulk_transfer(g.printer->handle,
1726 g.printer->read_endp,
1727 readbuffer, rbytes,
1728 &rbytes, 60000);
1729 if (readstatus == LIBUSB_SUCCESS && rbytes > 0)
1730 {
1731 fprintf(stderr, "DEBUG: Read %d bytes of back-channel data...\n",
1732 (int)rbytes);
1733 cupsBackChannelWrite((const char *)readbuffer, (size_t)rbytes, 1.0);
1734 }
1735 else if (readstatus == LIBUSB_ERROR_TIMEOUT)
1736 fputs("DEBUG: Got USB transaction timeout during read.\n", stderr);
1737 else if (readstatus == LIBUSB_ERROR_PIPE)
1738 fputs("DEBUG: Got USB pipe stalled during read.\n", stderr);
1739 else if (readstatus == LIBUSB_ERROR_INTERRUPTED)
1740 fputs("DEBUG: Got USB return aborted during read.\n", stderr);
1741
1742 /*
1743 * Make sure this loop executes no more than once every 250 miliseconds...
1744 */
1745
1746 if ((g.wait_eof || !g.read_thread_stop))
1747 {
1748 gettimeofday(&now, NULL);
1749 if (timercmp(&now, &end, <))
1750 {
1751 timersub(&end, &now, &timeleft);
1752 usleep(1000000 * timeleft.tv_sec + timeleft.tv_usec);
1753 }
1754 }
1755 } while (g.wait_eof || !g.read_thread_stop);
1756
1757 /*
1758 * Let the main thread know that we have completed the read thread...
1759 */
1760
1761 pthread_mutex_lock(&g.read_thread_mutex);
1762 g.read_thread_done = 1;
1763 pthread_cond_signal(&g.read_thread_cond);
1764 pthread_mutex_unlock(&g.read_thread_mutex);
1765
1766 return (NULL);
1767 }
1768
1769
1770 /*
1771 * 'sidechannel_thread()' - Handle side-channel requests.
1772 */
1773
1774 static void*
1775 sidechannel_thread(void *reference)
1776 {
1777 cups_sc_command_t command; /* Request command */
1778 cups_sc_status_t status; /* Request/response status */
1779 char data[2048]; /* Request/response data */
1780 int datalen; /* Request/response data size */
1781
1782
1783 (void)reference;
1784
1785 do
1786 {
1787 datalen = sizeof(data);
1788
1789 if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0))
1790 {
1791 if (status == CUPS_SC_STATUS_TIMEOUT)
1792 continue;
1793 else
1794 break;
1795 }
1796
1797 switch (command)
1798 {
1799 case CUPS_SC_CMD_SOFT_RESET: /* Do a soft reset */
1800 fputs("DEBUG: CUPS_SC_CMD_SOFT_RESET received from driver...\n",
1801 stderr);
1802
1803 soft_reset();
1804 cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, NULL, 0, 1.0);
1805 fputs("DEBUG: Returning status CUPS_STATUS_OK with no bytes...\n",
1806 stderr);
1807 break;
1808
1809 case CUPS_SC_CMD_DRAIN_OUTPUT: /* Drain all pending output */
1810 fputs("DEBUG: CUPS_SC_CMD_DRAIN_OUTPUT received from driver...\n",
1811 stderr);
1812
1813 g.drain_output = 1;
1814 break;
1815
1816 case CUPS_SC_CMD_GET_BIDI: /* Is the connection bidirectional? */
1817 fputs("DEBUG: CUPS_SC_CMD_GET_BIDI received from driver...\n",
1818 stderr);
1819
1820 data[0] = (g.printer->protocol >= 2 ? 1 : 0);
1821 cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0);
1822
1823 fprintf(stderr,
1824 "DEBUG: Returned CUPS_SC_STATUS_OK with 1 byte (%02X)...\n",
1825 data[0]);
1826 break;
1827
1828 case CUPS_SC_CMD_GET_DEVICE_ID: /* Return IEEE-1284 device ID */
1829 fputs("DEBUG: CUPS_SC_CMD_GET_DEVICE_ID received from driver...\n",
1830 stderr);
1831
1832 datalen = sizeof(data);
1833 if (get_device_id(g.printer, data, sizeof(data)))
1834 {
1835 status = CUPS_SC_STATUS_IO_ERROR;
1836 datalen = 0;
1837 }
1838 else
1839 {
1840 status = CUPS_SC_STATUS_OK;
1841 datalen = strlen(data);
1842 }
1843 cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, datalen, 1.0);
1844
1845 if (datalen < sizeof(data))
1846 data[datalen] = '\0';
1847 else
1848 data[sizeof(data) - 1] = '\0';
1849
1850 fprintf(stderr,
1851 "DEBUG: Returning CUPS_SC_STATUS_OK with %d bytes (%s)...\n",
1852 datalen, data);
1853 break;
1854
1855 case CUPS_SC_CMD_GET_STATE: /* Return device state */
1856 fputs("DEBUG: CUPS_SC_CMD_GET_STATE received from driver...\n",
1857 stderr);
1858
1859 data[0] = CUPS_SC_STATE_ONLINE;
1860 cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0);
1861
1862 fprintf(stderr,
1863 "DEBUG: Returned CUPS_SC_STATUS_OK with 1 byte (%02X)...\n",
1864 data[0]);
1865 break;
1866
1867 case CUPS_SC_CMD_GET_CONNECTED: /* Return whether device is
1868 connected */
1869 fputs("DEBUG: CUPS_SC_CMD_GET_CONNECTED received from driver...\n",
1870 stderr);
1871
1872 data[0] = (g.printer->handle ? 1 : 0);
1873 cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0);
1874
1875 fprintf(stderr,
1876 "DEBUG: Returned CUPS_SC_STATUS_OK with 1 byte (%02X)...\n",
1877 data[0]);
1878 break;
1879
1880 default:
1881 fprintf(stderr, "DEBUG: Unknown side-channel command (%d) received "
1882 "from driver...\n", command);
1883
1884 cupsSideChannelWrite(command, CUPS_SC_STATUS_NOT_IMPLEMENTED,
1885 NULL, 0, 1.0);
1886
1887 fputs("DEBUG: Returned CUPS_SC_STATUS_NOT_IMPLEMENTED with no bytes...\n",
1888 stderr);
1889 break;
1890 }
1891 }
1892 while (!g.sidechannel_thread_stop);
1893
1894 pthread_mutex_lock(&g.sidechannel_thread_mutex);
1895 g.sidechannel_thread_done = 1;
1896 pthread_cond_signal(&g.sidechannel_thread_cond);
1897 pthread_mutex_unlock(&g.sidechannel_thread_mutex);
1898
1899 return (NULL);
1900 }
1901
1902
1903 /*
1904 * 'soft_reset()' - Send a soft reset to the device.
1905 */
1906
1907 static void
1908 soft_reset(void)
1909 {
1910 fd_set input_set; /* Input set for select() */
1911 struct timeval tv; /* Time value */
1912 char buffer[2048]; /* Buffer */
1913 struct timespec cond_timeout; /* pthread condition timeout */
1914
1915
1916 /*
1917 * Send an abort once a second until the I/O lock is released by the main
1918 * thread...
1919 */
1920
1921 pthread_mutex_lock(&g.readwrite_lock_mutex);
1922 while (g.readwrite_lock)
1923 {
1924 gettimeofday(&tv, NULL);
1925 cond_timeout.tv_sec = tv.tv_sec + 1;
1926 cond_timeout.tv_nsec = tv.tv_usec * 1000;
1927
1928 while (g.readwrite_lock)
1929 {
1930 if (pthread_cond_timedwait(&g.readwrite_lock_cond,
1931 &g.readwrite_lock_mutex,
1932 &cond_timeout) != 0)
1933 break;
1934 }
1935 }
1936
1937 g.readwrite_lock = 1;
1938 pthread_mutex_unlock(&g.readwrite_lock_mutex);
1939
1940 /*
1941 * Flush bytes waiting on print_fd...
1942 */
1943
1944 g.print_bytes = 0;
1945
1946 FD_ZERO(&input_set);
1947 FD_SET(g.print_fd, &input_set);
1948
1949 tv.tv_sec = 0;
1950 tv.tv_usec = 0;
1951
1952 while (select(g.print_fd+1, &input_set, NULL, NULL, &tv) > 0)
1953 if (read(g.print_fd, buffer, sizeof(buffer)) <= 0)
1954 break;
1955
1956 /*
1957 * Send the reset...
1958 */
1959
1960 soft_reset_printer(g.printer);
1961
1962 /*
1963 * Release the I/O lock...
1964 */
1965
1966 pthread_mutex_lock(&g.readwrite_lock_mutex);
1967 g.readwrite_lock = 0;
1968 pthread_cond_signal(&g.readwrite_lock_cond);
1969 pthread_mutex_unlock(&g.readwrite_lock_mutex);
1970 }
1971
1972
1973 /*
1974 * 'soft_reset_printer()' - Do the soft reset request specific to printers
1975 *
1976 * This soft reset is specific to the printer device class and is much less
1977 * invasive than the general USB reset libusb_reset_device(). Especially it
1978 * does never happen that the USB addressing and configuration changes. What
1979 * is actually done is that all buffers get flushed and the bulk IN and OUT
1980 * pipes get reset to their default states. This clears all stall conditions.
1981 * See http://cholla.mmto.org/computers/linux/usb/usbprint11.pdf
1982 */
1983
1984 static int /* O - 0 on success, < 0 on error */
1985 soft_reset_printer(
1986 usb_printer_t *printer) /* I - Printer */
1987 {
1988 struct libusb_config_descriptor *confptr = NULL;
1989 /* Pointer to current configuration */
1990 int interface, /* Interface to reset */
1991 errcode; /* Error code */
1992
1993
1994 if (libusb_get_config_descriptor(printer->device, printer->conf,
1995 &confptr) < 0)
1996 interface = printer->iface;
1997 else
1998 interface = confptr->interface[printer->iface].
1999 altsetting[printer->altset].bInterfaceNumber;
2000
2001 libusb_free_config_descriptor(confptr);
2002
2003 if ((errcode = libusb_control_transfer(printer->handle,
2004 LIBUSB_REQUEST_TYPE_CLASS |
2005 LIBUSB_ENDPOINT_OUT |
2006 LIBUSB_RECIPIENT_OTHER,
2007 2, 0, interface, NULL, 0, 5000)) < 0)
2008 errcode = libusb_control_transfer(printer->handle,
2009 LIBUSB_REQUEST_TYPE_CLASS |
2010 LIBUSB_ENDPOINT_OUT |
2011 LIBUSB_RECIPIENT_INTERFACE,
2012 2, 0, interface, NULL, 0, 5000);
2013
2014 return (errcode);
2015 }