Index | Thread | Search

From:
"Theo de Raadt" <deraadt@openbsd.org>
Subject:
Re: cups-filters: fix driverless
To:
ajacoutot@openbsd.org, ports@openbsd.org
Date:
Mon, 16 Feb 2026 12:10:41 -0700

Download raw body.

Thread
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++] = ";";
>