+ else if (do_cancel)
+ {
+ /*
+ * Write PS or PCL lines until we see SIGTERM...
+ */
+
+ int line = 0, page = 0; /* Current line and page */
+ ssize_t bytes; /* Number of bytes of response data */
+ char buffer[1024]; /* Output buffer */
+
+
+ if (do_pcl)
+ write(1, "\033E", 2);
+ else
+ write(1, "%!\n/Courier findfont 12 scalefont setfont 0 setgray\n", 52);
+
+ while (!job_canceled)
+ {
+ if (line == 0)
+ {
+ page ++;
+
+ if (do_pcl)
+ snprintf(buffer, sizeof(buffer), "PCL Page %d\r\n\r\n", page);
+ else
+ snprintf(buffer, sizeof(buffer),
+ "18 732 moveto (PS Page %d) show\n", page);
+
+ write(1, buffer, strlen(buffer));
+ }
+
+ line ++;
+
+ if (do_pcl)
+ snprintf(buffer, sizeof(buffer), "Line %d\r\n", line);
+ else
+ snprintf(buffer, sizeof(buffer), "18 %d moveto (Line %d) show\n",
+ 720 - line * 12, line);
+
+ write(1, buffer, strlen(buffer));
+
+ if (line >= 55)
+ {
+ /*
+ * Eject after 55 lines...
+ */
+
+ line = 0;
+ if (do_pcl)
+ write(1, "\014", 1);
+ else
+ write(1, "showpage\n", 9);
+ }
+
+ /*
+ * Check for back-channel data...
+ */
+
+ if ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 0)) > 0)
+ write(2, buffer, bytes);
+
+ /*
+ * Throttle output to ~100hz...
+ */
+
+ usleep(10000);
+ }
+
+ /*
+ * Eject current page with info...
+ */
+
+ if (do_pcl)
+ snprintf(buffer, sizeof(buffer),
+ "Canceled on line %d of page %d\r\n\014\033E", line, page);
+ else
+ snprintf(buffer, sizeof(buffer),
+ "\n18 %d moveto (Canceled on line %d of page %d)\nshowpage\n",
+ 720 - line * 12, line, page);
+
+ write(1, buffer, strlen(buffer));
+
+ /*
+ * See if we get any back-channel data...
+ */
+
+ while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 5.0)) > 0)
+ write(2, buffer, bytes);
+
+ exit(0);
+ }