| 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 |
| |