Download raw body.
cups-filters: fix driverless
why not swap out the "echo -en" for "printf"?
Does the below patch work? It would avoid needing coreutils and
may be portable than using echo?
(just add a REVISION bump to the port as well which I've left out here)
On Wed, 18 Feb 2026, Theo de Raadt wrote:
> Can someone write the -e and -E diff for echo like I suggest please?
>
> Theo de Raadt <deraadt@openbsd.org> wrote:
>
> > 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.
> > >
> > >
------8<--- patch-utils_driverless_c ---8<-------------------------------
"echo -en" is not portable; use printf instead
Index: utils/driverless.c
--- utils/driverless.c.orig
+++ utils/driverless.c
@@ -385,7 +385,7 @@ list_printers (int mode, int reg_type_no, int isFax)
* for our desired output.
*/
- /* 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 \;*/
+ /* 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 printf '\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 printf L \;*/
i = 0;
ippfind_argv[i++] = "ippfind";
@@ -419,8 +419,8 @@ list_printers (int mode, int reg_type_no, int isFax)
ippfind_argv[i++] = "application/pdf"; /* PDF */
ippfind_argv[i++] = ")";
ippfind_argv[i++] = "-x";
- ippfind_argv[i++] = "echo"; /* Output the needed data fields */
- ippfind_argv[i++] = "-en"; /* separated by tab characters */
+ ippfind_argv[i++] = "printf"; /* Output the needed data fields */
+ /* separated by tab characters */
if (mode < 0) {
if (isFax)
ippfind_argv[i++] =
@@ -440,8 +440,7 @@ list_printers (int mode, int reg_type_no, int isFax)
if (mode < 0) {
ippfind_argv[i++] = "--local"; /* Rest only if local service */
ippfind_argv[i++] = "-x";
- ippfind_argv[i++] = "echo"; /* Output an 'L' at the end of the */
- ippfind_argv[i++] = "-en"; /* line */
+ ippfind_argv[i++] = "printf"; /* Output an 'L' at the end of the line */
ippfind_argv[i++] = "L";
ippfind_argv[i++] = ";";
}
cups-filters: fix driverless