| Allow filter search in epson-escpr-wrapper |
| |
| Instead of calling epson-escpr from wrapper in hard coded CUPS_FILTER_PATH, |
| this patch allows wrapper to search filter in non-standard location by calling |
| cups API cupsSearchFilterLatest: |
| |
| https://chromium-review.googlesource.com/c/518931/ |
| |
| --- a/src/wrapper.c |
| +++ b/src/wrapper.c |
| @@ -33,6 +33,8 @@ |
| #include <ctype.h> |
| /* added 22-04-2004 */ |
| #include <signal.h> |
| +/* added 07-09-2017 */ |
| +#include <linux/limits.h> |
| |
| #include "libprtX.h" |
| |
| @@ -282,10 +284,42 @@ main (int argc, char *argv[]) |
| |
| if (pfp == NULL) |
| { |
| - char tmpbuf[256]; |
| + char tmpbuf[256 + PATH_MAX]; |
| |
| + char cups_filter_path[PATH_MAX]; // filter full path. |
| + // Fill in default filter path (2 additional characters: '/' and '\0'). |
| + int total_size = snprintf(cups_filter_path, sizeof(cups_filter_path), |
| + "%s/%s", CUPS_FILTER_PATH, CUPS_FILTER_NAME); |
| + if (total_size < 0 || total_size >= sizeof(cups_filter_path)) |
| + return 1; |
| + if (access(cups_filter_path, F_OK) != 0) |
| + { |
| + // Filter does not exist in default location. |
| + int status = _cupsSearchFilterLatest( |
| + "epson-escpr", |
| + cups_filter_path, |
| + sizeof(cups_filter_path)); |
| + if (status == 1) |
| + { |
| + // found a filter. |
| + char *end_of_basedir = strrchr(cups_filter_path, '/'); |
| + if (!end_of_basedir) |
| + return 1; |
| + // cut the filename off the filter path. |
| + *end_of_basedir = '\0'; |
| + } |
| + else { |
| + debug_msg("_cupsSearchFilterLatest failed: %d", status); |
| + return 1; |
| + } |
| + } |
| + else { |
| + // cut off filename (CUPS_FILTER_NAME). |
| + strncpy(cups_filter_path, CUPS_FILTER_PATH, |
| + sizeof(cups_filter_path)); |
| + } |
| sprintf (tmpbuf, "%s/%s \"%s\" %d %d %d %s %s %s %s %s %s %s %s", |
| - CUPS_FILTER_PATH, |
| + cups_filter_path, |
| CUPS_FILTER_NAME, |
| fopt.model, |
| header.cupsWidth, |