- Split out D-Bus service for udev helper.
This commit is contained in:
parent
6aafd66f58
commit
e22999a35a
2568
system-config-printer-525e996.patch
Normal file
2568
system-config-printer-525e996.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,322 +0,0 @@
|
|||||||
diff --git a/udev/udev-add-printer b/udev/udev-add-printer
|
|
||||||
index 03d301e..2e4d933 100755
|
|
||||||
--- a/udev/udev-add-printer
|
|
||||||
+++ b/udev/udev-add-printer
|
|
||||||
@@ -27,13 +27,11 @@ import sys
|
|
||||||
import traceback
|
|
||||||
from syslog import *
|
|
||||||
|
|
||||||
-def create_queue (c, name, device_uri, ppdname, info):
|
|
||||||
+def create_queue (c, printernames, name, device_uri, ppdname, info):
|
|
||||||
# Make sure the name is unique.
|
|
||||||
- printers = cupshelpers.getPrinters (c)
|
|
||||||
- names = printers.keys ()
|
|
||||||
- if name in names:
|
|
||||||
+ if name in printernames:
|
|
||||||
suffix = 2
|
|
||||||
- while (name + "-" + str (suffix)) in names:
|
|
||||||
+ while (name + "-" + str (suffix)) in printernames:
|
|
||||||
suffix += 1
|
|
||||||
if suffix == 100:
|
|
||||||
break
|
|
||||||
@@ -83,7 +81,10 @@ def add_queue (device_id, device_uris, is_fax=False):
|
|
||||||
name = name.replace ("/", "-")
|
|
||||||
name = name.replace ("#", "-")
|
|
||||||
|
|
||||||
- create_queue (c, name, device_uris[0], ppdname,
|
|
||||||
+ printers = cupshelpers.getPrinters (c)
|
|
||||||
+ printernames = printers.keys ()
|
|
||||||
+
|
|
||||||
+ create_queue (c, printernames, name, device_uris[0], ppdname,
|
|
||||||
"%s %s" % (id_dict["MFG"], id_dict["MDL"]))
|
|
||||||
|
|
||||||
if not is_fax:
|
|
||||||
@@ -93,24 +94,8 @@ def add_queue (device_id, device_uris, is_fax=False):
|
|
||||||
# find one whose scheme ends in "fax", use that as a fax
|
|
||||||
# queue. Note that the HPLIP backends do follow this
|
|
||||||
# pattern (hp and hpfax).
|
|
||||||
- not_fax_schemes=["beh",
|
|
||||||
- "bluetooth",
|
|
||||||
- "http",
|
|
||||||
- "https",
|
|
||||||
- "ipp",
|
|
||||||
- "lpd",
|
|
||||||
- "parallel",
|
|
||||||
- "serial",
|
|
||||||
- "smb",
|
|
||||||
- "snmp",
|
|
||||||
- "socket",
|
|
||||||
- "scsi",
|
|
||||||
- "usb"]
|
|
||||||
- devices = c.getDevices (exclude_schemes=not_fax_schemes)
|
|
||||||
- for uri, device_dict in devices.iteritems ():
|
|
||||||
- if uri in device_uris:
|
|
||||||
- continue
|
|
||||||
-
|
|
||||||
+ used_uris = map (lambda x: x.device_uri, printers.values ())
|
|
||||||
+ for uri in device_uris[1:]:
|
|
||||||
if uri.find (":") == -1:
|
|
||||||
continue
|
|
||||||
|
|
||||||
@@ -119,8 +104,20 @@ def add_queue (device_id, device_uris, is_fax=False):
|
|
||||||
# Now see if the non-scheme parts of the URI match
|
|
||||||
# any of the URIs we were given.
|
|
||||||
for each_uri in device_uris:
|
|
||||||
+ if each_uri == uri:
|
|
||||||
+ continue
|
|
||||||
(s, device_uri_rest) = each_uri.split (":", 1)
|
|
||||||
if rest == device_uri_rest:
|
|
||||||
+ # This one matches. Check there is not
|
|
||||||
+ # already a queue using this URI.
|
|
||||||
+ if uri in used_uris:
|
|
||||||
+ break
|
|
||||||
+
|
|
||||||
+ devices = c.getDevices (include_schemes=[scheme])
|
|
||||||
+ device_dict = devices.get (uri)
|
|
||||||
+ if device_dict == None:
|
|
||||||
+ break
|
|
||||||
+
|
|
||||||
add_queue (device_dict.get ("device-id", ""),
|
|
||||||
[uri], is_fax=True)
|
|
||||||
else:
|
|
||||||
diff --git a/udev/udev-configure-printer.c b/udev/udev-configure-printer.c
|
|
||||||
index a3c87dc..37a8682 100644
|
|
||||||
--- a/udev/udev-configure-printer.c
|
|
||||||
+++ b/udev/udev-configure-printer.c
|
|
||||||
@@ -708,7 +708,7 @@ cupsDoRequestOrDie (http_t *http,
|
|
||||||
|
|
||||||
static int
|
|
||||||
find_matching_device_uris (struct device_id *id,
|
|
||||||
- const char *serial,
|
|
||||||
+ const char *usbserial,
|
|
||||||
struct device_uris *uris,
|
|
||||||
const char *devpath)
|
|
||||||
{
|
|
||||||
@@ -716,21 +716,34 @@ find_matching_device_uris (struct device_id *id,
|
|
||||||
ipp_t *request, *answer;
|
|
||||||
ipp_attribute_t *attr;
|
|
||||||
struct device_uris uris_noserial;
|
|
||||||
+ struct device_uris all_uris;
|
|
||||||
+ size_t i, n;
|
|
||||||
+ const char *exclude_schemes[] = {
|
|
||||||
+ "beh",
|
|
||||||
+ "bluetooth",
|
|
||||||
+ "http",
|
|
||||||
+ "https",
|
|
||||||
+ "ipp",
|
|
||||||
+ "lpd",
|
|
||||||
+ "ncp",
|
|
||||||
+ "parallel",
|
|
||||||
+ "scsi",
|
|
||||||
+ "smb",
|
|
||||||
+ "snmp",
|
|
||||||
+ "socket",
|
|
||||||
+ };
|
|
||||||
|
|
||||||
- uris->n_uris = 0;
|
|
||||||
- uris->uri = NULL;
|
|
||||||
-
|
|
||||||
- uris_noserial.n_uris = 0;
|
|
||||||
- uris_noserial.uri = NULL;
|
|
||||||
+ uris->n_uris = uris_noserial.n_uris = all_uris.n_uris = 0;
|
|
||||||
+ uris->uri = uris_noserial.uri = all_uris.uri = NULL;
|
|
||||||
|
|
||||||
/* Leave the bus to settle. */
|
|
||||||
sleep (1);
|
|
||||||
|
|
||||||
cups = cups_connection ();
|
|
||||||
request = ippNewRequest (CUPS_GET_DEVICES);
|
|
||||||
- ippAddStrings (request, IPP_TAG_OPERATION, IPP_TAG_NAME, "include-schemes",
|
|
||||||
- sizeof (device_uri_types) / sizeof(device_uri_types[0]),
|
|
||||||
- NULL, device_uri_types);
|
|
||||||
+ ippAddStrings (request, IPP_TAG_OPERATION, IPP_TAG_NAME, "exclude-schemes",
|
|
||||||
+ sizeof (exclude_schemes) / sizeof(exclude_schemes[0]),
|
|
||||||
+ NULL, exclude_schemes);
|
|
||||||
|
|
||||||
answer = cupsDoRequestOrDie (cups, request, "/");
|
|
||||||
httpClose (cups);
|
|
||||||
@@ -757,6 +770,28 @@ find_matching_device_uris (struct device_id *id,
|
|
||||||
parse_device_id (attr->values[0].string.text, &this_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* Only use device schemes in our preference order for matching
|
|
||||||
+ * against the IEEE 1284 Device ID. */
|
|
||||||
+
|
|
||||||
+ for (i = 0;
|
|
||||||
+ device_uri &&
|
|
||||||
+ i < sizeof (device_uri_types) / sizeof (device_uri_types[0]);
|
|
||||||
+ i++)
|
|
||||||
+ {
|
|
||||||
+ size_t len = strlen (device_uri_types[i]);
|
|
||||||
+ if (!strncmp (device_uri_types[i], device_uri, len) &&
|
|
||||||
+ device_uri[len] == ':')
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (device_uri)
|
|
||||||
+ add_device_uri (&all_uris, device_uri);
|
|
||||||
+
|
|
||||||
+ if (i == sizeof (device_uri_types) / sizeof (device_uri_types[0]))
|
|
||||||
+ /* Not what we want to match against. Ignore this one. */
|
|
||||||
+ device_uri = NULL;
|
|
||||||
+
|
|
||||||
+ /* Now check the manufacturer and model names. */
|
|
||||||
if (device_uri && this_id.mfg && this_id.mdl &&
|
|
||||||
!strcmp (this_id.mfg, id->mfg) &&
|
|
||||||
!strcmp (this_id.mdl, id->mdl))
|
|
||||||
@@ -803,11 +838,11 @@ find_matching_device_uris (struct device_id *id,
|
|
||||||
match = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!match && strlen (serial) >= 12)
|
|
||||||
+ if (!match && usbserial[0] != '\0')
|
|
||||||
{
|
|
||||||
if (!id->sern)
|
|
||||||
{
|
|
||||||
- if (this_id.sern && !strcmp (serial, this_id.sern))
|
|
||||||
+ if (this_id.sern && !strcmp (usbserial, this_id.sern))
|
|
||||||
{
|
|
||||||
syslog (LOG_DEBUG,
|
|
||||||
"SERN field matches USB serial number");
|
|
||||||
@@ -819,10 +854,11 @@ find_matching_device_uris (struct device_id *id,
|
|
||||||
{
|
|
||||||
char *saveptr, *uri = strdup (device_uri);
|
|
||||||
const char *token;
|
|
||||||
- for (token = strtok_r (uri, "?=&", &saveptr);
|
|
||||||
+ const char *sep = "?=&/";
|
|
||||||
+ for (token = strtok_r (uri, sep, &saveptr);
|
|
||||||
token;
|
|
||||||
- token = strtok_r (NULL, "?=&", &saveptr))
|
|
||||||
- if (!strcmp (token, serial))
|
|
||||||
+ token = strtok_r (NULL, sep, &saveptr))
|
|
||||||
+ if (!strcmp (token, usbserial))
|
|
||||||
{
|
|
||||||
syslog (LOG_DEBUG, "URI contains USB serial number");
|
|
||||||
match = 1;
|
|
||||||
@@ -886,14 +922,56 @@ find_matching_device_uris (struct device_id *id,
|
|
||||||
uris->uri = old;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- size_t i;
|
|
||||||
for (i = 0; i < uris_noserial.n_uris; i++)
|
|
||||||
uris->uri[uris->n_uris + i] = uris_noserial.uri[i];
|
|
||||||
uris->n_uris += uris_noserial.n_uris;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ uris_noserial.n_uris = 0;
|
|
||||||
+ uris_noserial.uri = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
free_device_uris (&uris_noserial);
|
|
||||||
+
|
|
||||||
+ /* Having decided which device URIs match based on IEEE 1284 Device
|
|
||||||
+ * ID, we now need to look for "paired" URIs for other functions of
|
|
||||||
+ * a multi-function device. This are the same except for the
|
|
||||||
+ * scheme. */
|
|
||||||
+
|
|
||||||
+ n = uris->n_uris;
|
|
||||||
+ for (i = 0; i < n; i++)
|
|
||||||
+ {
|
|
||||||
+ size_t j;
|
|
||||||
+ char *me = uris->uri[i];
|
|
||||||
+ char *my_rest = strchr (me, ':');
|
|
||||||
+ size_t my_schemelen;
|
|
||||||
+ if (!my_rest)
|
|
||||||
+ continue;
|
|
||||||
+
|
|
||||||
+ my_schemelen = my_rest - me;
|
|
||||||
+ for (j = 0; j < all_uris.n_uris; j++)
|
|
||||||
+ {
|
|
||||||
+ char *twin = all_uris.uri[j];
|
|
||||||
+ char *twin_rest = strchr (twin, ':');
|
|
||||||
+ size_t twin_schemelen;
|
|
||||||
+ if (!twin_rest)
|
|
||||||
+ continue;
|
|
||||||
+
|
|
||||||
+ twin_schemelen = twin_rest - twin;
|
|
||||||
+ if (my_schemelen == twin_schemelen &&
|
|
||||||
+ !strncmp (me, twin, my_schemelen))
|
|
||||||
+ /* This is the one we are looking for the twin of. */
|
|
||||||
+ continue;
|
|
||||||
+
|
|
||||||
+ if (!strcmp (my_rest, twin_rest))
|
|
||||||
+ {
|
|
||||||
+ syslog (LOG_DEBUG, "%s twinned with %s", me, twin);
|
|
||||||
+ add_device_uri (uris, twin);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ free_device_uris (&all_uris);
|
|
||||||
if (uris->n_uris > 0)
|
|
||||||
{
|
|
||||||
struct usb_uri_map *map = read_usb_uri_map ();
|
|
||||||
@@ -1048,12 +1126,12 @@ do_add (const char *cmd, const char *devpath)
|
|
||||||
struct device_id id;
|
|
||||||
struct device_uris device_uris;
|
|
||||||
char *usb_device_devpath;
|
|
||||||
- char serial[256];
|
|
||||||
+ char usbserial[256];
|
|
||||||
|
|
||||||
syslog (LOG_DEBUG, "add %s", devpath);
|
|
||||||
|
|
||||||
usb_device_devpath = device_id_from_devpath (devpath, &id,
|
|
||||||
- serial, sizeof (serial));
|
|
||||||
+ usbserial, sizeof (usbserial));
|
|
||||||
if (!id.mfg || !id.mdl)
|
|
||||||
{
|
|
||||||
syslog (LOG_ERR, "invalid or missing IEEE 1284 Device ID%s%s",
|
|
||||||
@@ -1063,28 +1141,31 @@ do_add (const char *cmd, const char *devpath)
|
|
||||||
}
|
|
||||||
|
|
||||||
syslog (LOG_DEBUG, "MFG:%s MDL:%s SERN:%s serial:%s", id.mfg, id.mdl,
|
|
||||||
- id.sern ? id.sern : "-", serial);
|
|
||||||
-
|
|
||||||
- if ((pid = fork ()) == -1)
|
|
||||||
- syslog (LOG_ERR, "Failed to fork process");
|
|
||||||
- else if (pid != 0)
|
|
||||||
- /* Parent. */
|
|
||||||
- exit (0);
|
|
||||||
-
|
|
||||||
- close (STDIN_FILENO);
|
|
||||||
- close (STDOUT_FILENO);
|
|
||||||
- close (STDERR_FILENO);
|
|
||||||
- f = open ("/dev/null", O_RDWR);
|
|
||||||
- if (f != STDIN_FILENO)
|
|
||||||
- dup2 (f, STDIN_FILENO);
|
|
||||||
- if (f != STDOUT_FILENO)
|
|
||||||
- dup2 (f, STDOUT_FILENO);
|
|
||||||
- if (f != STDERR_FILENO)
|
|
||||||
- dup2 (f, STDERR_FILENO);
|
|
||||||
-
|
|
||||||
- setsid ();
|
|
||||||
-
|
|
||||||
- find_matching_device_uris (&id, serial, &device_uris, usb_device_devpath);
|
|
||||||
+ id.sern ? id.sern : "-", usbserial);
|
|
||||||
+
|
|
||||||
+ if (getenv ("DEBUG") == NULL)
|
|
||||||
+ {
|
|
||||||
+ if ((pid = fork ()) == -1)
|
|
||||||
+ syslog (LOG_ERR, "Failed to fork process");
|
|
||||||
+ else if (pid != 0)
|
|
||||||
+ /* Parent. */
|
|
||||||
+ exit (0);
|
|
||||||
+
|
|
||||||
+ close (STDIN_FILENO);
|
|
||||||
+ close (STDOUT_FILENO);
|
|
||||||
+ close (STDERR_FILENO);
|
|
||||||
+ f = open ("/dev/null", O_RDWR);
|
|
||||||
+ if (f != STDIN_FILENO)
|
|
||||||
+ dup2 (f, STDIN_FILENO);
|
|
||||||
+ if (f != STDOUT_FILENO)
|
|
||||||
+ dup2 (f, STDOUT_FILENO);
|
|
||||||
+ if (f != STDERR_FILENO)
|
|
||||||
+ dup2 (f, STDERR_FILENO);
|
|
||||||
+
|
|
||||||
+ setsid ();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ find_matching_device_uris (&id, usbserial, &device_uris, usb_device_devpath);
|
|
||||||
free (usb_device_devpath);
|
|
||||||
if (device_uris.n_uris == 0)
|
|
||||||
{
|
|
@ -7,14 +7,14 @@
|
|||||||
Summary: A printer administration tool
|
Summary: A printer administration tool
|
||||||
Name: system-config-printer
|
Name: system-config-printer
|
||||||
Version: 1.1.10
|
Version: 1.1.10
|
||||||
Release: 3%{?dist}
|
Release: 4%{?dist}
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
URL: http://cyberelk.net/tim/software/system-config-printer/
|
URL: http://cyberelk.net/tim/software/system-config-printer/
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
Source0: http://cyberelk.net/tim/data/system-config-printer/1.1/system-config-printer-%{version}.tar.bz2
|
Source0: http://cyberelk.net/tim/data/system-config-printer/1.1/system-config-printer-%{version}.tar.bz2
|
||||||
Source1: http://cyberelk.net/tim/data/pycups/pycups-%{pycups_version}.tar.bz2
|
Source1: http://cyberelk.net/tim/data/pycups/pycups-%{pycups_version}.tar.bz2
|
||||||
Source2: http://cyberelk.net/tim/data/pysmbc/pysmbc-%{pysmbc_version}.tar.bz2
|
Source2: http://cyberelk.net/tim/data/pysmbc/pysmbc-%{pysmbc_version}.tar.bz2
|
||||||
Patch1: system-config-printer-a05bd9c.patch
|
Patch1: system-config-printer-525e996.patch
|
||||||
|
|
||||||
BuildRequires: cups-devel >= 1.2
|
BuildRequires: cups-devel >= 1.2
|
||||||
BuildRequires: python-devel >= 2.4
|
BuildRequires: python-devel >= 2.4
|
||||||
@ -25,6 +25,9 @@ BuildRequires: intltool
|
|||||||
BuildRequires: libusb-devel, libudev-devel
|
BuildRequires: libusb-devel, libudev-devel
|
||||||
BuildRequires: xmlto
|
BuildRequires: xmlto
|
||||||
BuildRequires: epydoc
|
BuildRequires: epydoc
|
||||||
|
|
||||||
|
BuildRequires: automake, autoconf
|
||||||
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||||
|
|
||||||
Requires: pygtk2 >= 2.4.0, pygtk2-libglade
|
Requires: pygtk2 >= 2.4.0, pygtk2-libglade
|
||||||
@ -76,7 +79,9 @@ printers.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -a 1 -a 2
|
%setup -q -a 1 -a 2
|
||||||
%patch1 -p1 -b .a05bd9c
|
%patch1 -p1 -b .525e996
|
||||||
|
automake --copy --add-missing
|
||||||
|
autoconf
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%configure --with-udev-rules
|
%configure --with-udev-rules
|
||||||
@ -127,7 +132,12 @@ rm -rf %buildroot
|
|||||||
%files udev
|
%files udev
|
||||||
%defattr(-,root,root,-)
|
%defattr(-,root,root,-)
|
||||||
%{_sysconfdir}/udev/rules.d/*.rules
|
%{_sysconfdir}/udev/rules.d/*.rules
|
||||||
/lib/udev/*
|
%{_sysconfdir}/dbus-1/system.d/*.conf
|
||||||
|
%{_libexecdir}/printer-config-daemon
|
||||||
|
%{_libexecdir}/udev-add-printer
|
||||||
|
%{_datadir}/dbus-1/interfaces/*.xml
|
||||||
|
%{_datadir}/dbus-1/system-services/*.service
|
||||||
|
/lib/udev/udev-usb-printer
|
||||||
|
|
||||||
%files
|
%files
|
||||||
%defattr(-,root,root,-)
|
%defattr(-,root,root,-)
|
||||||
@ -184,6 +194,9 @@ rm -rf %buildroot
|
|||||||
exit 0
|
exit 0
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sun Jul 26 2009 Tim Waugh <twaugh@redhat.com> 1.1.10-4
|
||||||
|
- Split out D-Bus service for udev helper.
|
||||||
|
|
||||||
* Fri Jul 24 2009 Tim Waugh <twaugh@redhat.com> 1.1.10-3
|
* Fri Jul 24 2009 Tim Waugh <twaugh@redhat.com> 1.1.10-3
|
||||||
- Removed gnome-packagekit dependency. The presence of
|
- Removed gnome-packagekit dependency. The presence of
|
||||||
gpk-install-package-name is detected at run-time, and the program
|
gpk-install-package-name is detected at run-time, and the program
|
||||||
|
Loading…
Reference in New Issue
Block a user