[Printing-architecture] [cups-filters] using cups-browsed for DNS-SD/IPP discovery

Brian Norris computersforpeace at gmail.com
Tue Mar 22 20:40:34 UTC 2016


Hi,

I'm looking at the features of cups-browsed to see if I would want to
use it for my purposes, and I ran across a really confusing piece of
logic in the source code:

    if (!pdl || pdl[0] == '\0' ||
        (!strcasestr(pdl, "application/postscript") &&
         !strcasestr(pdl, "application/pdf") &&
         !strcasestr(pdl, "image/pwg-raster") &&
         ((!strcasestr(pdl, "application/vnd.hp-PCL") &&
           !strcasestr(pdl, "application/PCL") &&
           !strcasestr(pdl, "application/x-pcl")) ||
          ((strncasecmp(make_model, "HP", 2) ||
            strncasecmp(make_model, "Hewlett Packard", 15) ||
            strncasecmp(make_model, "Hewlett-Packard", 15)) &&
           !strcasestr(make_model, "LaserJet") &&
           !strcasestr(make_model, "Mopier"))) &&
         !strcasestr(pdl, "application/vnd.hp-PCLXL"))) {
      debug_printf("cups-browsed: Cannot create remote printer %s (%s) as its PDLs are not known, ignoring this printer.\n",
                   p->name, p->uri);
      goto fail;
    }

First of all, can anyone explain exactly what the block about HP is
really supposed to be doing? I can't honestly figure it out.

But at any rate, I don't see how it could be correct. Particularly, this
clause is always true (at most one of the comparisons will return 0), so
why is it there?

           (strncasecmp(make_model, "HP", 2) ||
            strncasecmp(make_model, "Hewlett Packard", 15) ||
            strncasecmp(make_model, "Hewlett-Packard", 15))

Seems like at a minimum, this block should be corrected to actually
produce the status of "is this an HP model." e.g., does the following
diff make sense?

=== modified file 'utils/cups-browsed.c'
--- utils/cups-browsed.c	2016-02-10 14:18:28 +0000
+++ utils/cups-browsed.c	2016-03-22 20:25:19 +0000
@@ -2784,8 +2784,8 @@
 	 ((!strcasestr(pdl, "application/vnd.hp-PCL") &&
 	   !strcasestr(pdl, "application/PCL") &&
 	   !strcasestr(pdl, "application/x-pcl")) ||
-	  ((strncasecmp(make_model, "HP", 2) ||
-	    strncasecmp(make_model, "Hewlett Packard", 15) ||
+	  ((strncasecmp(make_model, "HP", 2) &&
+	    strncasecmp(make_model, "Hewlett Packard", 15) &&
 	    strncasecmp(make_model, "Hewlett-Packard", 15)) &&
 	   !strcasestr(make_model, "LaserJet") &&
 	   !strcasestr(make_model, "Mopier"))) &&

But I still don't feel like that's really what's intended, so an answer
to my first question would be the most helpful.

Now, besides the correctness of this logic, is this aspect of the daemon
something that people regularly use? I see that it's installed on many
Linux distributions, but it seems like it isn't really exercised for
Bonjour/DNS-SD discovery unless someone modifies the default
cups-browsed.conf to have 'CreateIPPPrinterQueues Yes'.

Regards,
Brian


More information about the Printing-architecture mailing list