summaryrefslogtreecommitdiff
path: root/filter
diff options
context:
space:
mode:
Diffstat (limited to 'filter')
-rw-r--r--filter/Makefile1
-rw-r--r--filter/image-gif.c3
-rw-r--r--filter/image-png.c46
-rw-r--r--filter/pdftops.c35
-rw-r--r--filter/rastertoepson.c130
-rw-r--r--filter/rastertohp.c120
-rw-r--r--filter/rastertolabel.c85
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);