Download raw body.
cups-filters: fix driverless
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.
> >
> >
> > 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