rpms/cups/devel cups.spec,1.371,1.372 dnssd,1.1,1.2

Tim Waugh (twaugh) fedora-extras-commits at redhat.com
Tue Nov 27 13:57:24 UTC 2007


Author: twaugh

Update of /cvs/pkgs/rpms/cups/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv28160

Modified Files:
	cups.spec dnssd 
Log Message:
* Tue Nov 27 2007 Tim Waugh <twaugh at redhat.com>
- Updated to improved dnssd backend from Till Kamppeter.



Index: cups.spec
===================================================================
RCS file: /cvs/pkgs/rpms/cups/devel/cups.spec,v
retrieving revision 1.371
retrieving revision 1.372
diff -u -r1.371 -r1.372
--- cups.spec	13 Nov 2007 14:54:12 -0000	1.371
+++ cups.spec	27 Nov 2007 13:56:52 -0000	1.372
@@ -449,6 +449,9 @@
 %{cups_serverbin}/daemon/cups-lpd
 
 %changelog
+* Tue Nov 27 2007 Tim Waugh <twaugh at redhat.com>
+- Updated to improved dnssd backend from Till Kamppeter.
+
 * Tue Nov 13 2007 Tim Waugh <twaugh at redhat.com>
 - Fixed CVE-2007-4045 patch; has no effect with shipped packages since they
   are linked with gnutls.


Index: dnssd
===================================================================
RCS file: /cvs/pkgs/rpms/cups/devel/dnssd,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- dnssd	19 Sep 2007 11:28:11 -0000	1.1
+++ dnssd	27 Nov 2007 13:56:52 -0000	1.2
@@ -45,11 +45,12 @@
 
 # IPs which are for computers, consider their printer entries as queues
 # set up with the local printing system (CUPS, LPD, Windows/Samba SMB, ...)
-my @ipblacklist = ();
+my @computerips = ();
 my $output;
+my $hosts;
 my ($interface, $nettype, $ip, $host, $make, $model, $description, $cmd, $makemodel, $deviceid, $protocol, $port, $uriext, $uri);
 
-open (AVAHI, "$avahicmd |") or die "Could not call \"$avahicmd\"\n";
+open (AVAHI, "$avahicmd |") or exit 0;
 while (my $line = <AVAHI>) {
     chomp ($line);
     if ($line =~ /^\s*=\s+(\S+)\s+(\S+)\s+(.*?)\s+(\S+)\s+(\S+)\s*$/) {
@@ -73,7 +74,7 @@
     } elsif ($line =~ /^\s*address\s*=\s*\[([^\]]+)\]\s*$/) {
 	$ip = $1;
 	if ($protocol eq "computer") {
-	    push (@ipblacklist, $ip);
+	    push (@computerips, $ip);
 	    $protocol = "";
 	}
     } elsif ($line =~ /^\s*port\s*=\s*\[([^\]]+)\]\s*$/) {
@@ -124,7 +125,7 @@
 	    $usb_DES ||= $product;
 	    if ($usb_MFG) {
 		$make = $usb_MFG;
-	    } elsif ($usb_DES =~ /^KONICA\s+MINOLTA\b/i) { 
+	    } elsif ($usb_DES =~ /^KONICA\s*MINOLTA\b/i) { 
 		$make = "KONICA MINOLTA";
 	    } elsif ($usb_DES) {
 		$usb_DES =~ /^\s*(\S*)\b/;
@@ -138,7 +139,11 @@
 	    $usb_CMD ||= $pdls;
 	    my $extra;
 	    if ($protocol eq "socket") {
-		$uri = "socket://$ip:$port";
+		if ($port eq "9100") {
+		    $uri = "socket://$ip";
+		} else {
+		    $uri = "socket://$ip:$port";
+		}
 		$extra = "Port $port";
 	    } elsif ($protocol eq "lpd") {
 		$uri = "lpd://$ip" . ($uriext ? "/$uriext" : "");
@@ -164,7 +169,8 @@
 		($usb_DES ? "DES:$usb_DES;" : "") .
 		($usb_CMD ? "CMD:$usb_CMD;" : "");
 	    $deviceid .= "CLS:PRINTER;" if $deviceid;
-	    $output->{$ip}{$protocol}{$extra} =
+	    $hosts->{$ip} = $hostname if ($hostname);
+	    $output->{$ip}{$protocol}{$uriext} =
 		"network $uri \"$makemodel\" \"$makemodel $ip ($extra)\" \"$deviceid\"\n";
 	    ($interface, $nettype, $ip, $host, $make, $model, $description, $cmd, $makemodel, $deviceid, $protocol, $port, $uriext, $uri) =
 		("", "", "", "", "", "", "", "", "", "", "", "", "", "");
@@ -172,31 +178,87 @@
     }
 }
 
+my $localqueues = {};
+my $queue = undef;
+if (open LPSTAT, "LC_ALL=C lpstat -l -p -v |") {
+    while (my $line = <LPSTAT>) {
+	chomp $line;
+	if ($line =~ /^printer\s+(\S+)/i) {
+	    $queue = $1;
+	    $localqueues->{$queue} = {};
+	} elsif ($queue) {
+	    if ($line =~ /^\s+Connection:\s+remote/i) {
+		$localqueues->{$queue}{remote} = 1;
+	    } elsif ($line =~ /^\s+Interface:\s+(\S+)/i) {
+		$localqueues->{$queue}{interface} = $1;
+	    } elsif ($line =~ /^device\s+for\s+(\S+)\s*:\s*(\S+)/i) {
+		$localqueues->{$1}{uri} = $2;
+	    }
+	}
+    }
+    close LPSTAT
+}
+
+my @localips = ();
+if (open IFCONFIG, "LC_ALL=C /sbin/ifconfig |") {
+    while (my $line = <IFCONFIG>) {
+	chomp $line;
+	if ($line =~ /^\s*inet\s+addr:\s*(\S+)/i) {
+	    push (@localips, $1);
+	}
+    }
+    close IFCONFIG;
+}
+
 foreach my $ip (keys(%{$output})) {
-    next if member($ip, @ipblacklist);
+    # Do not list print queues of the local machine
+    next if member($ip, @localips);
     if ($output->{$ip}{"socket"}) {
-	foreach my $extra (keys(%{$output->{$ip}{"socket"}})) {
-	    if (keys(%{$output->{$ip}{"socket"}}) = 1) {
-		$output->{$ip}{"socket"}{$extra} =~
+	foreach my $uriext (keys(%{$output->{$ip}{"socket"}})) {
+	    if (keys(%{$output->{$ip}{"socket"}}) == 1) {
+		$output->{$ip}{"socket"}{$uriext} =~
 		    s/^(\s*\S*\s*\S*\s*\"[^\"]*\"\s*\"[^\"\(]*?)\s*\([^\)]*\)\s*(\"\s*.*)$/$1$2/;
 	    }
-	    print $output->{$ip}{"socket"}{$extra};
+	    print $output->{$ip}{"socket"}{$uriext};
 	}
     } elsif ($output->{$ip}{"lpd"}) {
-	foreach my $extra (keys(%{$output->{$ip}{"lpd"}})) {
-	    if (keys(%{$output->{$ip}{"lpd"}}) = 1) {
-		$output->{$ip}{"lpd"}{$extra} =~
+	foreach my $uriext (keys(%{$output->{$ip}{"lpd"}})) {
+	    if (keys(%{$output->{$ip}{"lpd"}}) == 1) {
+		$output->{$ip}{"lpd"}{$uriext} =~
 		    s/^(\s*\S*\s*\S*\s*\"[^\"]*\"\s*\"[^\"\(]*?)\s*\([^\)]*\)\s*(\"\s*.*)$/$1$2/;
 	    }
-	    print $output->{$ip}{"lpd"}{$extra};
+	    print $output->{$ip}{"lpd"}{$uriext};
 	}
     } elsif ($output->{$ip}{"ipp"}) {
-	foreach my $extra (keys(%{$output->{$ip}{"ipp"}})) {
+	foreach my $uriext (keys(%{$output->{$ip}{"ipp"}})) {
+	    if ($uriext =~ /^(printers|classes)\/(\S+)$/) {
+		# Queue from a CUPS server. We should suppress it if it
+		# is a queue received via CUPS broadcast
+		$queue=$2;
+		if (defined($localqueues->{"$queue\@$ip"})) {
+		    $queue = "$queue\@$ip";
+		} elsif (defined($localqueues->{"$queue\@$hosts->{$ip}"})) {
+		    $queue = "$queue\@$hosts->{$ip}";
+		}
+		if (defined($localqueues->{$queue})) {
+		    if ($localqueues->{$queue}{remote} &&
+			($localqueues->{$queue}{uri} =~
+			 /^ipp:\/\/([^\/:]+)(:\d+|)\/(\S+)/)) {
+			my $host = $1;
+			my $ue = $3;
+			if ($host !~ /\d+\.\d+\.\d+\.\d+/) {
+			    $host =
+				join(".", unpack("C4", gethostbyname($host)));
+			}
+			next if ($host eq $ip) && ($ue eq $uriext);
+		    }
+		}
+	    }
 	    if (keys(%{$output->{$ip}{"ipp"}}) == 1) {
-		$output->{$ip}{"ipp"}{$extra} =~
+		$output->{$ip}{"ipp"}{$uriext} =~
 		    s/^(\s*\S*\s*\S*\s*\"[^\"]*\"\s*\"[^\"]*?)\s*\([^\)]*\)\s*(\"\s*.*)$/$1$2/;
 	    }
-	    print $output->{$ip}{"ipp"}{$extra};
+	    print $output->{$ip}{"ipp"}{$uriext};
 	}
     }
 }




More information about the fedora-extras-commits mailing list