diff options
Diffstat (limited to 'filter')
-rw-r--r-- | filter/Makefile | 1 | ||||
-rw-r--r-- | filter/image-gif.c | 3 | ||||
-rw-r--r-- | filter/image-png.c | 46 | ||||
-rw-r--r-- | filter/pdftops.c | 35 | ||||
-rw-r--r-- | filter/rastertoepson.c | 130 | ||||
-rw-r--r-- | filter/rastertohp.c | 120 | ||||
-rw-r--r-- | filter/rastertolabel.c | 85 |
7 files changed, 210 insertions, 210 deletions
diff --git a/filter/Makefile b/filter/Makefile index c0990f8dc..6bd1f556e 100644 --- a/filter/Makefile +++ b/filter/Makefile @@ -130,7 +130,6 @@ install-libs: $(INSTALLSTATIC) $(INSTALL32) $(INSTALL64) $(LN) $(LIBCUPSIMAGE) $(LIBDIR)/`basename $(LIBCUPSIMAGE) .2`; \ fi -if test $(LIBCUPSIMAGE) = "libcupsimage.2.dylib"; then \ - $(STRIP) -x $(LIBDIR)/$(LIBCUPSIMAGE); \ $(RM) $(LIBDIR)/libcupsimage.dylib; \ $(LN) $(LIBCUPSIMAGE) $(LIBDIR)/libcupsimage.dylib; \ fi diff --git a/filter/image-gif.c b/filter/image-gif.c index a391811fc..d78670d37 100644 --- a/filter/image-gif.c +++ b/filter/image-gif.c @@ -37,6 +37,7 @@ #define GIF_INTERLACE 0x40 #define GIF_COLORMAP 0x80 +#define GIF_MAX_BITS 12 typedef cups_ib_t gif_cmap_t[256][4]; typedef short gif_table_t[4096]; @@ -462,7 +463,7 @@ gif_read_image(FILE *fp, /* I - Input file */ pass = 0; code_size = getc(fp); - if (!pixels) + if (code_size > GIF_MAX_BITS || !pixels) return (-1); if (gif_read_lzw(fp, 1, code_size) < 0) diff --git a/filter/image-png.c b/filter/image-png.c index 1db19e2d7..332b3c39b 100644 --- a/filter/image-png.c +++ b/filter/image-png.c @@ -3,7 +3,7 @@ * * PNG image routines for the Common UNIX Printing System (CUPS). * - * Copyright 2007 by Apple Inc. + * Copyright 2007-2008 by Apple Inc. * Copyright 1993-2007 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -170,16 +170,56 @@ _cupsImageReadPNG( * Interlaced images must be loaded all at once... */ + size_t bufsize; /* Size of buffer */ + + if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - in = malloc(img->xsize * img->ysize); + { + bufsize = img->xsize * img->ysize; + + if ((bufsize / img->ysize) != img->xsize) + { + fprintf(stderr, "DEBUG: PNG image dimensions (%ux%u) too large!\n", + (unsigned)width, (unsigned)height); + fclose(fp); + return (1); + } + } else - in = malloc(img->xsize * img->ysize * 3); + { + bufsize = img->xsize * img->ysize * 3; + + if ((bufsize / (img->ysize * 3)) != img->xsize) + { + fprintf(stderr, "DEBUG: PNG image dimensions (%ux%u) too large!\n", + (unsigned)width, (unsigned)height); + fclose(fp); + return (1); + } + } + + in = malloc(bufsize); } bpp = cupsImageGetDepth(img); out = malloc(img->xsize * bpp); + if (!in || !out) + { + fputs("DEBUG: Unable to allocate memory for PNG image!\n", stderr); + + if (in) + free(in); + + if (out) + free(out); + + fclose(fp); + + return (1); + } + /* * Read the image, interlacing as needed... */ diff --git a/filter/pdftops.c b/filter/pdftops.c index 9db1e9168..f1abb52bf 100644 --- a/filter/pdftops.c +++ b/filter/pdftops.c @@ -28,6 +28,7 @@ #include <cups/i18n.h> #include <signal.h> #include <sys/wait.h> +#include <errno.h> /* @@ -38,6 +39,13 @@ static void cancel_job(int sig); /* + * Local globals... + */ + +static int job_canceled = 0; + + +/* * 'main()' - Main entry for filter... */ @@ -57,6 +65,7 @@ main(int argc, /* I - Number of command-line args */ ppd_file_t *ppd; /* PPD file */ ppd_size_t *size; /* Current page size */ int pdfpid, /* Process ID for pdftops */ + pdfwaitpid, /* Process ID from wait() */ pdfstatus, /* Status from pdftops */ pdfargc; /* Number of args for pdftops */ char *pdfargv[100], /* Arguments for pdftops */ @@ -261,7 +270,17 @@ main(int argc, /* I - Number of command-line args */ * Parent comes here... */ - if (wait(&pdfstatus) != pdfpid) + while ((pdfwaitpid = wait(&pdfstatus)) < 0 && errno == EINTR) + { + /* + * Wait until we get a valid process ID or the job is canceled... + */ + + if (job_canceled) + break; + } + + if (pdfwaitpid != pdfpid) { kill(pdfpid, SIGTERM); pdfstatus = 1; @@ -270,18 +289,18 @@ main(int argc, /* I - Number of command-line args */ { if (WIFEXITED(pdfstatus)) { - pdfstatus = WEXITSTATUS(pdfstatus); + pdfstatus = WEXITSTATUS(pdfstatus); - _cupsLangPrintf(stderr, - _("ERROR: pdftops filter exited with status %d!\n"), + _cupsLangPrintf(stderr, + _("ERROR: pdftops filter exited with status %d!\n"), pdfstatus); } else { - pdfstatus = WTERMSIG(pdfstatus); + pdfstatus = WTERMSIG(pdfstatus); - _cupsLangPrintf(stderr, - _("ERROR: pdftops filter crashed on signal %d!\n"), + _cupsLangPrintf(stderr, + _("ERROR: pdftops filter crashed on signal %d!\n"), pdfstatus); } } @@ -306,6 +325,8 @@ static void cancel_job(int sig) /* I - Signal number (unused) */ { (void)sig; + + job_canceled = 1; } diff --git a/filter/rastertoepson.c b/filter/rastertoepson.c index f1ad6547c..62ecb347b 100644 --- a/filter/rastertoepson.c +++ b/filter/rastertoepson.c @@ -77,7 +77,8 @@ int DotBit, /* Bit in buffers */ LineCount, /* # of lines processed */ EvenOffset, /* Offset into 'even' buffers */ OddOffset, /* Offset into 'odd' buffers */ - Shingling; /* Shingle output? */ + Shingling, /* Shingle output? */ + Canceled; /* Has the current job been canceled? */ /* @@ -85,15 +86,15 @@ int DotBit, /* Bit in buffers */ */ void Setup(void); -void StartPage(const ppd_file_t *ppd, const cups_page_header_t *header); -void EndPage(const cups_page_header_t *header); +void StartPage(const ppd_file_t *ppd, const cups_page_header2_t *header); +void EndPage(const cups_page_header2_t *header); void Shutdown(void); void CancelJob(int sig); void CompressData(const unsigned char *line, int length, int plane, int type, int xstep, int ystep); -void OutputLine(const cups_page_header_t *header); -void OutputRows(const cups_page_header_t *header, int row); +void OutputLine(const cups_page_header2_t *header); +void OutputRows(const cups_page_header2_t *header, int row); /* @@ -123,31 +124,11 @@ Setup(void) void StartPage(const ppd_file_t *ppd, /* I - PPD file */ - const cups_page_header_t *header) /* I - Page header */ + const cups_page_header2_t *header) /* I - Page header */ { int n, t; /* Numbers */ int plane; /* Looping var */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ - - - /* - * Register a signal handler to eject the current page if the - * job is cancelled. - */ -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, CancelJob); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = CancelJob; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, CancelJob); -#endif /* HAVE_SIGSET */ /* * Send a reset sequence. @@ -339,7 +320,7 @@ StartPage(const ppd_file_t *ppd, /* I - PPD file */ */ void -EndPage(const cups_page_header_t *header) /* I - Page header */ +EndPage(const cups_page_header2_t *header) /* I - Page header */ { #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) struct sigaction action; /* Actions for POSIX signals */ @@ -378,22 +359,6 @@ EndPage(const cups_page_header_t *header) /* I - Page header */ fflush(stdout); /* - * Unregister the signal handler... - */ - -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, SIG_IGN); -#endif /* HAVE_SIGSET */ - - /* * Free memory... */ @@ -429,31 +394,9 @@ Shutdown(void) void CancelJob(int sig) /* I - Signal */ { - int i; /* Looping var */ - - (void)sig; - /* - * Send out lots of NUL bytes to clear out any pending raster data... - */ - - if (DotBytes) - i = DotBytes * 360 * 8; - else - i = 720; - - for (; i > 0; i --) - putchar(0); - - /* - * End the current page and exit... - */ - - EndPage(NULL); - Shutdown(); - - exit(0); + Canceled = 1; } @@ -670,7 +613,7 @@ CompressData(const unsigned char *line, /* I - Data to compress */ */ void -OutputLine(const cups_page_header_t *header) /* I - Page header */ +OutputLine(const cups_page_header2_t *header) /* I - Page header */ { if (header->cupsRowCount) { @@ -838,7 +781,7 @@ OutputLine(const cups_page_header_t *header) /* I - Page header */ */ void -OutputRows(const cups_page_header_t *header, /* I - Page image header */ +OutputRows(const cups_page_header2_t *header, /* I - Page image header */ int row) /* I - Row number (0 or 1) */ { unsigned i, n; /* Looping vars */ @@ -1012,16 +955,19 @@ OutputRows(const cups_page_header_t *header, /* I - Page image header */ * 'main()' - Main entry and processing of driver. */ -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ { - int fd; /* File descriptor */ - cups_raster_t *ras; /* Raster stream for printing */ - cups_page_header_t header; /* Page header from file */ - ppd_file_t *ppd; /* PPD file */ - int page; /* Current page */ - int y; /* Current line */ + int fd; /* File descriptor */ + cups_raster_t *ras; /* Raster stream for printing */ + cups_page_header2_t header; /* Page header from file */ + ppd_file_t *ppd; /* PPD file */ + int page; /* Current page */ + int y; /* Current line */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* @@ -1065,6 +1011,25 @@ main(int argc, /* I - Number of command-line arguments */ ras = cupsRasterOpen(fd, CUPS_RASTER_READ); /* + * Register a signal handler to eject the current page if the + * job is cancelled. + */ + + Canceled = 0; + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, CancelJob); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = CancelJob; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, CancelJob); +#endif /* HAVE_SIGSET */ + + /* * Initialize the print device... */ @@ -1080,12 +1045,15 @@ main(int argc, /* I - Number of command-line arguments */ page = 0; - while (cupsRasterReadHeader(ras, &header)) + while (cupsRasterReadHeader2(ras, &header)) { /* * Write a status message with the page number and number of copies. */ + if (Canceled) + break; + page ++; fprintf(stderr, "PAGE: %d %d\n", page, header.NumCopies); @@ -1106,6 +1074,9 @@ main(int argc, /* I - Number of command-line arguments */ * Let the user know how far we have progressed... */ + if (Canceled) + break; + if ((y & 127) == 0) fprintf(stderr, _("INFO: Printing page %d, %d%% complete...\n"), page, 100 * y / header.cupsHeight); @@ -1129,6 +1100,9 @@ main(int argc, /* I - Number of command-line arguments */ */ EndPage(&header); + + if (Canceled) + break; } /* diff --git a/filter/rastertohp.c b/filter/rastertohp.c index 04ac4017a..9f9b7bc45 100644 --- a/filter/rastertohp.c +++ b/filter/rastertohp.c @@ -52,7 +52,8 @@ int NumPlanes, /* Number of color planes */ ColorBits, /* Number of bits per color */ Feed, /* Number of lines to skip */ Duplex, /* Current duplex mode */ - Page; /* Current page number */ + Page, /* Current page number */ + Canceled; /* Has the current job been canceled? */ /* @@ -60,13 +61,13 @@ int NumPlanes, /* Number of color planes */ */ void Setup(void); -void StartPage(ppd_file_t *ppd, cups_page_header_t *header); +void StartPage(ppd_file_t *ppd, cups_page_header2_t *header); void EndPage(void); void Shutdown(void); void CancelJob(int sig); void CompressData(unsigned char *line, int length, int plane, int type); -void OutputLine(cups_page_header_t *header); +void OutputLine(cups_page_header2_t *header); /* @@ -91,32 +92,12 @@ Setup(void) void StartPage(ppd_file_t *ppd, /* I - PPD file */ - cups_page_header_t *header) /* I - Page header */ + cups_page_header2_t *header) /* I - Page header */ { int plane; /* Looping var */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* - * Register a signal handler to eject the current page if the - * job is cancelled. - */ - -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, CancelJob); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = CancelJob; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, CancelJob); -#endif /* HAVE_SIGSET */ - - /* * Show page device dictionary... */ @@ -410,11 +391,6 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */ void EndPage(void) { -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ - - /* * Eject the current page... */ @@ -437,22 +413,6 @@ EndPage(void) fflush(stdout); /* - * Unregister the signal handler... - */ - -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, SIG_IGN); -#endif /* HAVE_SIGSET */ - - /* * Free memory... */ @@ -489,26 +449,9 @@ Shutdown(void) void CancelJob(int sig) /* I - Signal */ { - int i; /* Looping var */ - - (void)sig; - /* - * Send out lots of NUL bytes to clear out any pending raster data... - */ - - for (i = 0; i < 600; i ++) - putchar(0); - - /* - * End the current page and exit... - */ - - EndPage(); - Shutdown(); - - exit(0); + Canceled = 1; } @@ -648,7 +591,7 @@ CompressData(unsigned char *line, /* I - Data to compress */ */ void -OutputLine(cups_page_header_t *header) /* I - Page header */ +OutputLine(cups_page_header2_t *header) /* I - Page header */ { int plane, /* Current plane */ bytes, /* Bytes to write */ @@ -731,15 +674,18 @@ OutputLine(cups_page_header_t *header) /* I - Page header */ * 'main()' - Main entry and processing of driver. */ -int /* O - Exit status */ -main(int argc, /* I - Number of command-line arguments */ - char *argv[]) /* I - Command-line arguments */ +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ { - int fd; /* File descriptor */ - cups_raster_t *ras; /* Raster stream for printing */ - cups_page_header_t header; /* Page header from file */ - int y; /* Current line */ - ppd_file_t *ppd; /* PPD file */ + int fd; /* File descriptor */ + cups_raster_t *ras; /* Raster stream for printing */ + cups_page_header2_t header; /* Page header from file */ + int y; /* Current line */ + ppd_file_t *ppd; /* PPD file */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* @@ -783,6 +729,25 @@ main(int argc, /* I - Number of command-line arguments */ ras = cupsRasterOpen(fd, CUPS_RASTER_READ); /* + * Register a signal handler to eject the current page if the + * job is cancelled. + */ + + Canceled = 0; + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, CancelJob); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = CancelJob; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, CancelJob); +#endif /* HAVE_SIGSET */ + + /* * Initialize the print device... */ @@ -796,12 +761,15 @@ main(int argc, /* I - Number of command-line arguments */ Page = 0; - while (cupsRasterReadHeader(ras, &header)) + while (cupsRasterReadHeader2(ras, &header)) { /* * Write a status message with the page number and number of copies. */ + if (Canceled) + break; + Page ++; fprintf(stderr, "PAGE: %d %d\n", Page, header.NumCopies); @@ -822,6 +790,9 @@ main(int argc, /* I - Number of command-line arguments */ * Let the user know how far we have progressed... */ + if (Canceled) + break; + if ((y & 127) == 0) fprintf(stderr, _("INFO: Printing page %d, %d%% complete...\n"), Page, 100 * y / header.cupsHeight); @@ -849,6 +820,9 @@ main(int argc, /* I - Number of command-line arguments */ */ EndPage(); + + if (Canceled) + break; } /* diff --git a/filter/rastertolabel.c b/filter/rastertolabel.c index 05adc0397..cb62278fd 100644 --- a/filter/rastertolabel.c +++ b/filter/rastertolabel.c @@ -3,7 +3,7 @@ * * Label printer filter for the Common UNIX Printing System (CUPS). * - * Copyright 2007 by Apple Inc. + * Copyright 2007-2008 by Apple Inc. * Copyright 2001-2007 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -90,10 +90,10 @@ int ModelNumber, /* cupsModelNumber attribute */ */ void Setup(ppd_file_t *ppd); -void StartPage(ppd_file_t *ppd, cups_page_header_t *header); -void EndPage(ppd_file_t *ppd, cups_page_header_t *header); +void StartPage(ppd_file_t *ppd, cups_page_header2_t *header); +void EndPage(ppd_file_t *ppd, cups_page_header2_t *header); void CancelJob(int sig); -void OutputLine(ppd_file_t *ppd, cups_page_header_t *header, int y); +void OutputLine(ppd_file_t *ppd, cups_page_header2_t *header, int y); void PCLCompress(unsigned char *line, int length); void ZPLCompress(char repeat_char, int repeat_count); @@ -166,13 +166,10 @@ Setup(ppd_file_t *ppd) /* I - PPD file */ void StartPage(ppd_file_t *ppd, /* I - PPD file */ - cups_page_header_t *header) /* I - Page header */ + cups_page_header2_t *header) /* I - Page header */ { ppd_choice_t *choice; /* Marked choice */ int length; /* Actual label length */ -#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) - struct sigaction action; /* Actions for POSIX signals */ -#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* @@ -226,23 +223,6 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */ fprintf(stderr, "DEBUG: cupsRowFeed = %d\n", header->cupsRowFeed); fprintf(stderr, "DEBUG: cupsRowStep = %d\n", header->cupsRowStep); - /* - * Register a signal handler to eject the current page if the - * job is canceled. - */ - -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, CancelJob); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = CancelJob; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, CancelJob); -#endif /* HAVE_SIGSET */ - switch (ModelNumber) { case DYMO_3x0 : @@ -498,7 +478,7 @@ StartPage(ppd_file_t *ppd, /* I - PPD file */ void EndPage(ppd_file_t *ppd, /* I - PPD file */ - cups_page_header_t *header) /* I - Page header */ + cups_page_header2_t *header) /* I - Page header */ { int val; /* Option value */ ppd_choice_t *choice; /* Marked choice */ @@ -733,22 +713,6 @@ EndPage(ppd_file_t *ppd, /* I - PPD file */ fflush(stdout); /* - * Unregister the signal handler... - */ - -#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ - sigset(SIGTERM, SIG_IGN); -#elif defined(HAVE_SIGACTION) - memset(&action, 0, sizeof(action)); - - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_IGN; - sigaction(SIGTERM, &action, NULL); -#else - signal(SIGTERM, SIG_IGN); -#endif /* HAVE_SIGSET */ - - /* * Free memory... */ @@ -779,7 +743,7 @@ CancelJob(int sig) /* I - Signal */ void OutputLine(ppd_file_t *ppd, /* I - PPD file */ - cups_page_header_t *header, /* I - Page header */ + cups_page_header2_t *header, /* I - Page header */ int y) /* I - Line number */ { int i; /* Looping var */ @@ -1145,11 +1109,14 @@ main(int argc, /* I - Number of command-line arguments */ { int fd; /* File descriptor */ cups_raster_t *ras; /* Raster stream for printing */ - cups_page_header_t header; /* Page header from file */ + cups_page_header2_t header; /* Page header from file */ int y; /* Current line */ ppd_file_t *ppd; /* PPD file */ int num_options; /* Number of options */ cups_option_t *options; /* Options */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ /* @@ -1193,6 +1160,25 @@ main(int argc, /* I - Number of command-line arguments */ ras = cupsRasterOpen(fd, CUPS_RASTER_READ); /* + * Register a signal handler to eject the current page if the + * job is cancelled. + */ + + Canceled = 0; + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, CancelJob); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = CancelJob; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, CancelJob); +#endif /* HAVE_SIGSET */ + + /* * Open the PPD file and apply options... */ @@ -1214,15 +1200,17 @@ main(int argc, /* I - Number of command-line arguments */ * Process pages as needed... */ - Page = 0; - Canceled = 0; + Page = 0; - while (cupsRasterReadHeader(ras, &header)) + while (cupsRasterReadHeader2(ras, &header)) { /* * Write a status message with the page number and number of copies. */ + if (Canceled) + break; + Page ++; fprintf(stderr, "PAGE: %d 1\n", Page); @@ -1243,6 +1231,9 @@ main(int argc, /* I - Number of command-line arguments */ * Let the user know how far we have progressed... */ + if (Canceled) + break; + if ((y & 15) == 0) fprintf(stderr, _("INFO: Printing page %d, %d%% complete...\n"), Page, 100 * y / header.cupsHeight); |