X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=backend%2Fparallel.c;h=125aa8141bdd131284f9bd3021cffabfeeb72a24;hb=771bd8cbffe1ffb06d90b2c7f00191830e6b738c;hp=c33fc10d2c70c7a0fbc8cccea10c2520601f65a9;hpb=b86bc4cf571c35972a94a634ea884baff9799fa9;p=thirdparty%2Fcups.git diff --git a/backend/parallel.c b/backend/parallel.c index c33fc10d2..125aa8141 100644 --- a/backend/parallel.c +++ b/backend/parallel.c @@ -1,25 +1,16 @@ /* - * "$Id: parallel.c 6181 2007-01-03 18:51:27Z mike $" + * "$Id: parallel.c 7810 2008-07-29 01:11:15Z mike $" * - * Parallel port backend for the Common UNIX Printing System (CUPS). + * Parallel port backend for CUPS. * - * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 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 + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" * "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 + * file is missing or damaged, see the license at "http://www.cups.org/". * * This file is subject to the Apple OS-Developed Software exception. * @@ -27,6 +18,7 @@ * * main() - Send a file to the specified parallel port. * list_devices() - List all parallel devices. + * side_cb() - Handle side-channel requests... */ /* @@ -66,7 +58,9 @@ * Local functions... */ -void list_devices(void); +static void list_devices(void); +static int side_cb(int print_fd, int device_fd, int snmp_fd, + http_addr_t *addr, int use_bc); /* @@ -91,7 +85,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */ device_fd, /* Parallel device */ use_bc; /* Read back-channel data? */ int copies; /* Number of copies to print */ - size_t tbytes; /* Total number of bytes written */ + ssize_t tbytes; /* Total number of bytes written */ struct termios opts; /* Parallel port options */ #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ @@ -129,7 +123,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */ } else if (argc < 6 || argc > 7) { - fputs("Usage: parallel job-id user title copies options [file]\n", stderr); + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); return (CUPS_BACKEND_FAILED); } @@ -151,7 +147,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */ if ((print_fd = open(argv[6], O_RDONLY)) < 0) { - perror("ERROR: unable to open print file"); + _cupsLangPrintError("ERROR", _("Unable to open print file")); return (CUPS_BACKEND_FAILED); } @@ -219,8 +215,9 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */ * available printer in the class. */ - fputs("INFO: Unable to open parallel port, queuing on next printer " - "in class...\n", stderr); + _cupsLangPrintFilter(stderr, "INFO", + _("Unable to contact printer, queuing on next " + "printer in class.")); /* * Sleep 5 seconds to keep the job from requeuing too rapidly... @@ -233,21 +230,20 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */ if (errno == EBUSY) { - fputs("INFO: Parallel port busy; will retry in 30 seconds...\n", - stderr); + _cupsLangPrintFilter(stderr, "INFO", + _("Printer busy; will retry in 30 seconds.")); sleep(30); } else if (errno == ENXIO || errno == EIO || errno == ENOENT) { - fputs("INFO: Printer not connected; will retry in 30 seconds...\n", - stderr); + _cupsLangPrintFilter(stderr, "INFO", + _("Printer not connected; will retry in 30 " + "seconds.")); sleep(30); } else { - fprintf(stderr, - "ERROR: Unable to open parallel port device file \"%s\": %s\n", - resource, strerror(errno)); + _cupsLangPrintError("ERROR", _("Unable to open device file")); return (CUPS_BACKEND_FAILED); } } @@ -284,11 +280,10 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */ lseek(print_fd, 0, SEEK_SET); } - tbytes = backendRunLoop(print_fd, device_fd, use_bc); + tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, side_cb); if (print_fd != 0 && tbytes >= 0) - fprintf(stderr, "INFO: Sent print file, " CUPS_LLFMT " bytes...\n", - CUPS_LLCAST tbytes); + _cupsLangPrintFilter(stderr, "INFO", _("Print file sent.")); } /* @@ -300,7 +295,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */ if (print_fd != 0) close(print_fd); - return (tbytes < 0 ? CUPS_BACKEND_FAILED : CUPS_BACKEND_OK); + return (CUPS_BACKEND_OK); } @@ -308,7 +303,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */ * 'list_devices()' - List all parallel devices. */ -void +static void list_devices(void) { #if defined(__hpux) || defined(__sgi) || defined(__sun) @@ -322,7 +317,9 @@ list_devices(void) char device[255], /* Device filename */ basedevice[255], /* Base device filename for ports */ device_id[1024], /* Device ID string */ - make_model[1024]; /* Make and model */ + make_model[1024], /* Make and model */ + info[1024], /* Info string */ + uri[1024]; /* Device URI */ if (!access("/dev/parallel/", 0)) @@ -348,13 +345,20 @@ list_devices(void) * Now grab the IEEE 1284 device ID string... */ + snprintf(uri, sizeof(uri), "parallel:%s", device); + if (!backendGetDeviceID(fd, device_id, sizeof(device_id), make_model, sizeof(make_model), - NULL, NULL, 0)) - printf("direct parallel:%s \"%s\" \"%s LPT #%d\" \"%s\"\n", device, - make_model, make_model, i + 1, device_id); + NULL, uri, sizeof(uri))) + { + snprintf(info, sizeof(info), "%s LPT #%d", make_model, i + 1); + cupsBackendReport("direct", uri, make_model, info, device_id, NULL); + } else - printf("direct parallel:%s \"Unknown\" \"LPT #%d\"\n", device, i + 1); + { + snprintf(info, sizeof(info), "LPT #%d", i + 1); + cupsBackendReport("direct", uri, NULL, info, NULL, NULL); + } close(fd); } @@ -556,7 +560,7 @@ list_devices(void) printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1); } } -#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) +#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) int i; /* Looping var */ int fd; /* File descriptor */ char device[255]; /* Device filename */ @@ -598,5 +602,75 @@ list_devices(void) /* - * End of "$Id: parallel.c 6181 2007-01-03 18:51:27Z mike $". + * 'side_cb()' - Handle side-channel requests... + */ + +static int /* O - 0 on success, -1 on error */ +side_cb(int print_fd, /* I - Print file */ + int device_fd, /* I - Device file */ + int snmp_fd, /* I - SNMP socket (unused) */ + http_addr_t *addr, /* I - Device address (unused) */ + int use_bc) /* I - Using back-channel? */ +{ + cups_sc_command_t command; /* Request command */ + cups_sc_status_t status; /* Request/response status */ + char data[2048]; /* Request/response data */ + int datalen; /* Request/response data size */ + + + (void)snmp_fd; + (void)addr; + + datalen = sizeof(data); + + if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0)) + return (-1); + + switch (command) + { + case CUPS_SC_CMD_DRAIN_OUTPUT : + if (backendDrainOutput(print_fd, device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else if (tcdrain(device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else + status = CUPS_SC_STATUS_OK; + + datalen = 0; + break; + + case CUPS_SC_CMD_GET_BIDI : + status = CUPS_SC_STATUS_OK; + data[0] = use_bc; + datalen = 1; + break; + + case CUPS_SC_CMD_GET_DEVICE_ID : + memset(data, 0, sizeof(data)); + + if (backendGetDeviceID(device_fd, data, sizeof(data) - 1, + NULL, 0, NULL, NULL, 0)) + { + status = CUPS_SC_STATUS_NOT_IMPLEMENTED; + datalen = 0; + } + else + { + status = CUPS_SC_STATUS_OK; + datalen = strlen(data); + } + break; + + default : + status = CUPS_SC_STATUS_NOT_IMPLEMENTED; + datalen = 0; + break; + } + + return (cupsSideChannelWrite(command, status, data, datalen, 1.0)); +} + + +/* + * End of "$Id: parallel.c 7810 2008-07-29 01:11:15Z mike $". */