Download raw body.
cups-filters: fix driverless
https://pubs.opengroup.org/onlinepubs/9799919799/
I think we should be adding the -e and -E stuff to echo
That still cannot use getopt, it must manually look at argv[1]
for - followed by a series of e, E, and n, then apply it. If the
pattern isn't precisely -[eEn]* it should print it as if it
wasn't this special argument.
joshua stein <jcs@jcs.org> wrote:
> I was trying to use the driverless thing in CUPS to be able to add
> AirPrint printers on my network but 'driverless list' would never
> show any printers even with Avahi running.
>
> Turns out the driverless binary is shelling out to ippfind and
> passing a long string of args to act as a filter, and that filter
> depends on echo having an -e flag to print in a format that
> driverless reads back. Since we don't have -e, it was just reading
> back garbage.
>
> ippfind -T 0 _ipps._tcp _ipp._tcp ! --txt printer-type --and \( --txt-pdl image/pwg-raster --or --txt-pdl application/PCLm --or --txt-pdl image/urf --or --txt-pdl application/pdf \) -x echo -en '\n{service_scheme}\t{service_name}\t{service_domain}\t{txt_usb_MFG}\t{txt_usb_MDL}\t{txt_product}\t{txt_ty}\t{service_name}\t{txt_pdl}\t{txt_UUID}\t{txt_rfo}\t' \; --local -x echo -en L \;
>
> The easiest solution seemed to be to depend on gecho from coreutils
> but maybe there's a shorter path.
>
>
> diff --git print/cups-filters/Makefile print/cups-filters/Makefile
> index c34782cf7e5..9ec9dfb9e60 100644
> --- print/cups-filters/Makefile
> +++ print/cups-filters/Makefile
> @@ -2,7 +2,7 @@ COMMENT= OpenPrinting CUPS filters
>
> V= 2.0.1
> DISTNAME= cups-filters-${V}
> -REVISION= 0
> +REVISION= 1
>
> CATEGORIES= print
>
> @@ -32,7 +32,8 @@ LIB_DEPENDS= print/libcupsfilters \
>
> # make it easier for users: bring in foomatic-db and allow the
> # regeneration of PPD files from share/foomatic/db/source/*/*.xml
> -RUN_DEPENDS += print/foomatic-db-engine
> +RUN_DEPENDS += print/foomatic-db-engine \
> + sysutils/coreutils
>
> FAKE_FLAGS= pkgfontconfigdir=${PREFIX}/share/examples/cups-filters \
> pkgcupsserverrootdir=${PREFIX}/share/examples/cups-filters/cups
> diff --git print/cups-filters/patches/patch-utils_driverless_c print/cups-filters/patches/patch-utils_driverless_c
> new file mode 100644
> index 00000000000..e234226fbec
> --- /dev/null
> +++ print/cups-filters/patches/patch-utils_driverless_c
> @@ -0,0 +1,26 @@
> +--- utils/driverless.c.orig Sun Feb 15 21:03:40 2026
> ++++ utils/driverless.c Sun Feb 15 21:04:25 2026
> +@@ -419,7 +419,11 @@
> + ippfind_argv[i++] = "application/pdf"; /* PDF */
> + ippfind_argv[i++] = ")";
> + ippfind_argv[i++] = "-x";
> ++#ifdef __OpenBSD__
> ++ ippfind_argv[i++] = "gecho"; /* Output the needed data fields */
> ++#else
> + ippfind_argv[i++] = "echo"; /* Output the needed data fields */
> ++#endif
> + ippfind_argv[i++] = "-en"; /* separated by tab characters */
> + if (mode < 0) {
> + if (isFax)
> +@@ -440,7 +444,11 @@
> + if (mode < 0) {
> + ippfind_argv[i++] = "--local"; /* Rest only if local service */
> + ippfind_argv[i++] = "-x";
> ++#ifdef __OpenBSD__
> ++ ippfind_argv[i++] = "gecho"; /* Output an 'L' at the end of the */
> ++#else
> + ippfind_argv[i++] = "echo"; /* Output an 'L' at the end of the */
> ++#endif
> + ippfind_argv[i++] = "-en"; /* line */
> + ippfind_argv[i++] = "L";
> + ippfind_argv[i++] = ";";
>
cups-filters: fix driverless