blob: 726fbf21d0b5ec7cf7d1d054e5c72ba1400a80e8 [file] [log] [blame]
From 9c7bbafe795f079c7f31efec9334233efd6f9713 Mon Sep 17 00:00:00 2001
From: Piotr Pawliczek <pawliczek@google.com>
Date: Tue, 16 Oct 2018 20:26:03 -0700
Subject: [PATCH] Patch forcing CUPS to dump file with printing pipeline being
executed to /tmp folder
Change-Id: I5f189e9a95f97a9da3dd5193195b0d879fae3eb8
---
my_log.h | 142 ++++++++++++++++++++++++++++++++++++++++++++++++
scheduler/job.c | 7 +++
2 files changed, 149 insertions(+)
create mode 100644 my_log.h
diff --git a/my_log.h b/my_log.h
new file mode 100644
index 000000000..c33a2488b
--- /dev/null
+++ b/my_log.h
@@ -0,0 +1,142 @@
+#ifndef CUPS_MY_LOG_H_
+#define CUPS_MY_LOG_H_
+
+#include <stdio.h>
+#include <string.h>
+
+
+extern int cupsdLogMessage(int, const char *, ...);
+
+
+struct my_log_buffer_type
+{
+ size_t entries_count;
+ size_t buffer_size;
+ char * buffer;
+} my_log_buffer = { 0, 0, NULL };
+
+
+static void my_log_write_str(char const * const p)
+{
+ size_t len_str = strlen(p);
+ size_t len_buf;
+ char * new_buf;
+ if (my_log_buffer.buffer == NULL) {
+ return;
+ }
+ len_buf = strlen(my_log_buffer.buffer);
+ while (len_str + len_buf >= my_log_buffer.buffer_size) {
+ new_buf = malloc(2*my_log_buffer.buffer_size);
+ if (new_buf == NULL) {
+ return;
+ }
+ strcpy(new_buf, my_log_buffer.buffer);
+ free(my_log_buffer.buffer);
+ my_log_buffer.buffer = new_buf;
+ my_log_buffer.buffer_size *= 2;
+ }
+ strcpy(my_log_buffer.buffer + len_buf, p);
+}
+
+
+static void my_log_init()
+{
+ size_t const s = 1024;
+ my_log_buffer.entries_count = 0;
+ if (my_log_buffer.buffer != NULL) {
+ my_log_buffer.buffer[0] = '\0';
+ return;
+ }
+ my_log_buffer.buffer = malloc(s);
+ if (my_log_buffer.buffer != NULL) {
+ my_log_buffer.buffer_size = s;
+ my_log_buffer.buffer[0] = '\0';
+ my_log_write_str("#!/bin/bash\n");
+ }
+}
+
+
+static void my_log_add_entry(const char* cmd, char* const* argv, char* const* envp)
+{
+ int i;
+ if (cmd == NULL) return;
+ size_t const entry = ++(my_log_buffer.entries_count);
+ char filename_out[] = "X.doc";
+ char filename_err[] = "X.err";
+ if (envp != NULL) {
+ for (i = 0; envp[i] != NULL; ++i) {
+ my_log_write_str("export ");
+ if (strncmp(envp[i],"PPD=",4) == 0) {
+ my_log_write_str("PPD=${TEST_PPD}");
+ } else {
+ my_log_write_str(envp[i]);
+ }
+ my_log_write_str("\n");
+ }
+ }
+ if (argv != NULL && argv[0] != NULL) {
+ my_log_write_str("(exec -a '");
+ my_log_write_str(argv[0]);
+ my_log_write_str("' ");
+ my_log_write_str(cmd);
+ my_log_write_str(" ");
+ for (i = 1; argv[i] != NULL; ++i) {
+ if (i == 6 && entry == 1) {
+ my_log_write_str(" ${TEST_DOCUMENT}");
+ } else {
+ my_log_write_str(" '");
+ my_log_write_str(argv[i]);
+ my_log_write_str("'");
+ }
+ }
+ my_log_write_str(")");
+ } else {
+ my_log_write_str(cmd);
+ }
+ if (entry > 1) {
+ filename_out[0] = '0' + ((entry-1)%10);
+ my_log_write_str(" <");
+ my_log_write_str(filename_out);
+ }
+ filename_out[0] = filename_err[0] = '0' + (entry%10);
+ my_log_write_str(" 1>");
+ my_log_write_str(filename_out);
+ my_log_write_str(" 2>");
+ my_log_write_str(filename_err);
+ my_log_write_str("\n");
+}
+
+
+static void my_log_dump_to_file(const char* job_name)
+{
+ size_t len;
+ char path[] = "/tmp/cups_12345678901234567890123456789012";
+ FILE * file;
+ if (my_log_buffer.buffer == NULL) {
+ cupsdLogMessage(CUPSD_LOG_WARN,"my_log: my_log_buffer.buffer == NULL");
+ return;
+ }
+ if (job_name == NULL) {
+ cupsdLogMessage(CUPSD_LOG_WARN,"my_log: job_name == NULL");
+ return;
+ }
+ if (strlen(job_name) > 32) {
+ cupsdLogMessage(CUPSD_LOG_WARN,"my_log: strlen(job_name) > 32");
+ return;
+ }
+ strcpy(path+10, job_name);
+ file = fopen(path, "wb");
+ if (file == NULL) {
+ cupsdLogMessage(CUPSD_LOG_WARN,"my_log: fopen failed");
+ return;
+ }
+ len = fwrite(my_log_buffer.buffer, strlen(my_log_buffer.buffer), 1, file);
+ if (len != 1) {
+ cupsdLogMessage(CUPSD_LOG_WARN,"my_log: fwrite failed");
+ }
+ if (fclose(file) != 0) {
+ cupsdLogMessage(CUPSD_LOG_WARN,"my_log: fclose failed");
+ }
+}
+
+#endif /* CUPS_MY_LOG_H_ */
diff --git a/scheduler/job.c b/scheduler/job.c
index ceac27eba..0ed5eb79c 100644
--- a/scheduler/job.c
+++ b/scheduler/job.c
@@ -29,6 +29,8 @@
#endif /* __APPLE__ */
+#include "../my_log.h"
+
/*
* Design Notes for Job Management
* -------------------------------
@@ -555,6 +557,8 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
cupsdLogMessage(CUPSD_LOG_DEBUG2,
"cupsdContinueJob(job=%p(%d)): current_file=%d, num_files=%d",
job, job->id, job->current_file, job->num_files);
+ my_log_init();
+ cupsdLogMessage(CUPSD_LOG_WARN, "job->current_file=%s", job->current_file);
/*
* Figure out what filters are required to convert from
@@ -1205,6 +1209,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
filterfds[slot][1] = job->print_pipes[1];
}
+ my_log_add_entry(command, argv, envp);
pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0],
filterfds[slot][1], job->status_pipes[1],
job->back_pipes[0], job->side_pipes[0], 0,
@@ -1331,6 +1336,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "Job #%d started.",
job->id);
+ my_log_dump_to_file(title);
return;
@@ -1341,6 +1347,7 @@ cupsdContinueJob(cupsd_job_t *job) /* I - Job */
abort_job:
+ my_log_dump_to_file(title);
FilterLevel -= job->cost;
job->cost = 0;
--
2.19.1.331.ge82ca0e54c-goog