Package: libgphoto2
Version: 2.4.6-1
Tags: patch
User: ubuntu-de...@lists.ubuntu.com
Usertags: origin-ubuntu ubuntu-patch karmic

Hello,

I recently did some ramblings about modernizing libgphoto2's udev
rules to work in a Linux world without hal [1]. I added a new udev
rule mode "136" and while I was at it, replaced the slow
check-ptp-camera shell script with a more efficient udev db query.
The patch got committed upstream now.

This doesn't break functionality with hal at all, of course.

This debdiff applies it to the Debian package and also moves udev rule
creation from postinst to debian/rules. This is possible now, since
from udev 136 on, rules are shipped in /lib/udev/rules.d/, thus
avoid becoming conffiles.

Thanks for considering,

Martin

[1] http://lists.freedesktop.org/archives/devkit-devel/2009-June/000191.html
[2] 
https://sourceforge.net/tracker/?func=detail&aid=2801117&group_id=8874&atid=308874

-- 
Martin Pitt                        | http://www.piware.de
Ubuntu Developer (www.ubuntu.com)  | Debian Developer  (www.debian.org)
 * Add patch 01_udev_rules_136: Add a new udev mode "136" to create
   contemporary udev rules which will avoid using the check_ptp_camera
   script, and provide udev DB tags for the hal deprecation. (Now accepted
   into upstream svn).
 * debian/libgphoto2-2.postinst: Drop udev rule creation. Udev rules are
   shipped in /lib now since udev 136, thus we can do it at build time. Drop
   debian/libgphoto2-2.dirs for this.
 * debian/rules: Create udev rules (with new mode 136), install them with
   dh_installudev.

diff -u libgphoto2-2.4.6/debian/libgphoto2-2.postinst 
libgphoto2-2.4.6/debian/libgphoto2-2.postinst
--- libgphoto2-2.4.6/debian/libgphoto2-2.postinst
+++ libgphoto2-2.4.6/debian/libgphoto2-2.postinst
@@ -16,25 +16,6 @@
        rm -f 
/usr/share/hal/fdi/information/10freedesktop/10-camera-$PACKAGE.fdi
        rm -f /usr/share/hal/fdi/information/20thirdparty/$PACKAGE.fdi
        rm -f 
/usr/share/hal/fdi/information/10freedesktop/10-camera-$PACKAGE-device.fdi
-
-       # create udev rules file
-       if [ -d /etc/udev/ ]; then
-           /usr/lib/$PACKAGE/print-camera-list udev-rules version 0.98 mode 
0664 group plugdev > /etc/udev/$PACKAGE.rules
-           # install the udev file only once:
-           #    - the first time the package is installed
-           # OR - the first time the package is upgraded from a version 
earlier than 2.1.6-5.1
-           if [ -z "$2" ] || dpkg --compare-versions "$2" lt 2.1.6-5.1 ; then
-               ln -sf ../$PACKAGE.rules /etc/udev/rules.d/025_$PACKAGE.rules
-           fi
-
-           if [ -L /etc/udev/rules.d/020_libgphoto2_generic-ptp_support.rules 
]; then
-               rm -f /etc/udev/rules.d/020_libgphoto2_generic-ptp_support.rules
-           fi
-
-           if [ -f /etc/udev/libgphoto2_generic-ptp_support.rules ]; then
-               rm -f /etc/udev/libgphoto2_generic-ptp_support.rules
-           fi
-       fi
        ;;
 
     abort-upgrade|abort-remove|abort-deconfigure)
diff -u libgphoto2-2.4.6/debian/libgphoto2-2.postrm 
libgphoto2-2.4.6/debian/libgphoto2-2.postrm
diff -u libgphoto2-2.4.6/debian/changelog libgphoto2-2.4.6/debian/changelog
--- libgphoto2-2.4.6/debian/rules
+++ libgphoto2-2.4.6/debian/rules
@@ -85,8 +85,14 @@
                debian/libgphoto2-port0/usr/share/doc/libgphoto2-port0
 
 ifeq ($(DEB_HOST_ARCH_OS),linux)
-       install -D packaging/generic/check-ptp-camera 
debian/libgphoto2-$(major)/lib/udev/check-ptp-camera
+       # we don't need this any more with current udev
        rm debian/tmp/usr/lib/udev/check-ptp-camera
+
+       # create udev rules
+       ./packaging/generic/print-camera-list udev-rules version 136 mode 0664 
group plugdev > debian/libgphoto2-$(major).udev
+       dh_installudev
+       rm debian/libgphoto2-$(major).udev
+
        -test -e debian/tmp/usr/lib/udev/check-mtp-device && \
                mkdir -p debian/libgphoto2-port0/lib/udev && \
                mv debian/tmp/usr/lib/udev/check-mtp-device \
@@ -122,7 +128,7 @@
        dh_gencontrol -plibgphoto2-$(major)-dev
        dh_gencontrol -plibgphoto2-port0
 ifeq (linux,$(DEB_HOST_ARCH_OS))
-       dh_gencontrol -plibgphoto2-$(major) -- -Vudev-hotplug='udev (>= 
0.113-1)'
+       dh_gencontrol -plibgphoto2-$(major) -- -Vudev-hotplug='udev (>= 0.136)'
 else
        dh_gencontrol -plibgphoto2-$(major)
 endif
reverted:
--- libgphoto2-2.4.6/debian/libgphoto2-2.dirs
+++ libgphoto2-2.4.6.orig/debian/libgphoto2-2.dirs
@@ -1 +0,0 @@
-etc/udev/rules.d
diff -u libgphoto2-2.4.6/debian/patches/series 
libgphoto2-2.4.6/debian/patches/series
--- libgphoto2-2.4.6/debian/patches/series
+++ libgphoto2-2.4.6/debian/patches/series
@@ -1,3 +1,4 @@
+01_udev_rules_136
 10_disable_cache
 #11_hurd_no_path_max_bsdsource
 #45_increase_canon_timeout
only in patch2:
unchanged:
--- libgphoto2-2.4.6.orig/debian/patches/01_udev_rules_136
+++ libgphoto2-2.4.6/debian/patches/01_udev_rules_136
@@ -0,0 +1,108 @@
+# Description: Add a new udev mode "136" to create contemporary udev rules 
which will avoid using the check_ptp_camera script, and provide udev DB tags 
for the hal deprecation. See 
http://lists.freedesktop.org/archives/devkit-devel/2009-June/000191.html for 
discussion.
+# Upstream: 
http://sourceforge.net/tracker/?func=detail&aid=2801117&group_id=8874&atid=308874
 (in svn head)
+Index: libgphoto2-2.4.6/packaging/generic/print-camera-list.c
+===================================================================
+--- libgphoto2-2.4.6.orig/packaging/generic/print-camera-list.c        
2009-06-05 13:34:52.000000000 +0200
++++ libgphoto2-2.4.6/packaging/generic/print-camera-list.c     2009-06-05 
13:35:17.000000000 +0200
+@@ -366,12 +366,14 @@
+ 
+ typedef enum {
+               UDEV_PRE_0_98 = 0,
+-              UDEV_0_98 = 1
++              UDEV_0_98 = 1,
++              UDEV_136 = 2
+ } udev_version_t;
+ 
+ static const StringFlagItem udev_version_t_map[] = {
+       { "pre-0.98", UDEV_PRE_0_98 },
+       { "0.98", UDEV_0_98 },
++      { "136", UDEV_136 },
+       { NULL, 0 }
+ };
+ 
+@@ -399,13 +401,20 @@
+               "ACTION!=\"add\", GOTO=\"libgphoto2_rules_end\"\n\n",
+               /* UDEV_0_98 */
+               "SUBSYSTEM!=\"usb|usb_device\", GOTO=\"libgphoto2_rules_end\"\n"
++              "ACTION!=\"add\", GOTO=\"libgphoto2_rules_end\"\n\n",
++              /* UDEV_136 */
++              "SUBSYSTEM!=\"usb\", GOTO=\"libgphoto2_rules_end\"\n"
++              "ENV{DEVTYPE}!=\"usb_device\", GOTO=\"libgphoto2_rules_end\"\n"
+               "ACTION!=\"add\", GOTO=\"libgphoto2_rules_end\"\n\n"
++              "ENV{ID_USB_INTERFACES}==\"\", IMPORT{program}=\"usb_id 
--export %%p\"\n\n"
+       };
+       static const char * const usbcam_strings[] = {
+               /* UDEV_PRE_0_98 */
+-              "SYSFS{idVendor}==\"%04x\", SYSFS{idProduct}==\"%04x\", ",
++              "SYSFS{idVendor}==\"%04x\", SYSFS{idProduct}==\"%04x\"",
+               /* UDEV_0_98 */
+-              "ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", ",
++              "ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\"",
++              /* UDEV_136 */
++              "ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", 
ENV{ID_GPHOTO2}=\"1\", ENV{GPHOTO2_DRIVER}=\"proprietary\""
+       };
+       udev_persistent_data_t *pdata;
+       pdata = calloc(1, sizeof(udev_persistent_data_t));
+@@ -444,7 +453,8 @@
+           && pdata->mode == NULL 
+           && pdata->group == NULL 
+           && pdata->owner == NULL 
+-          && pdata->script == NULL) {
++          && pdata->script == NULL
++          && pdata->version <= UDEV_0_98) {
+               FATAL("Either <script> or <mode,group,owner> parameters must be 
given.");
+       }
+       if ((pdata->script != NULL) && (pdata->mode != NULL 
+@@ -547,7 +557,11 @@
+ 
+       if (flags & GP_USB_HOTPLUG_MATCH_INT_CLASS) {
+               if ((flags & 
(GP_USB_HOTPLUG_MATCH_INT_CLASS|GP_USB_HOTPLUG_MATCH_INT_SUBCLASS|GP_USB_HOTPLUG_MATCH_INT_PROTOCOL))
 == 
(GP_USB_HOTPLUG_MATCH_INT_CLASS|GP_USB_HOTPLUG_MATCH_INT_SUBCLASS|GP_USB_HOTPLUG_MATCH_INT_PROTOCOL))
 {
+-                      printf("PROGRAM=\"check-ptp-camera %02d/%02d/%02d\", ", 
class, subclass, proto);
++                      if (pdata->version == UDEV_136) {
++                              
printf("ENV{ID_USB_INTERFACES}==\"*:%02d%02d%02d:*\", ENV{ID_GPHOTO2}=\"1\", 
ENV{GPHOTO2_DRIVER}=\"PTP\"", class, subclass, proto);
++                      } else {
++                              printf("PROGRAM=\"check-ptp-camera 
%02d/%02d/%02d\"", class, subclass, proto);
++                      }
+                       has_valid_rule = 1;
+               } else {
+                       if (class == 666) {
+@@ -568,6 +582,9 @@
+               }
+       }
+       if (has_valid_rule != 0) {
++              if (pdata->script != NULL || pdata->mode != NULL || 
pdata->owner != NULL || pdata->group != NULL)
++                      printf(", ");
++
+               if (pdata->script != NULL) {
+                       printf("RUN+=\"%s\"\n", pdata->script);
+               } else if (pdata->mode != NULL || pdata->owner != NULL || 
pdata->group != NULL) {
+@@ -589,7 +606,8 @@
+                       printf("\n");
+               } else {
+                       printf("\n");
+-                      FATAL("udev_camera_func(): illegal branch");
++                      if (pdata->version < UDEV_136)
++                              FATAL("udev_camera_func(): illegal branch");
+               }
+       }
+       return 0;
+@@ -1118,12 +1136,16 @@
+        fdi_device_end_func
+       },
+       {"udev-rules",
+-       "udev rules file either for pre-0.98 or 0.98 and later",
+-       "Put it into /etc/udev/rules.d/90-libgphoto2.rules, set file mode, 
owner, group\n"
++       "udev rules file",
++       "For modes \"pre-0.98\" and \"0.98\" (and later), put it into\n"
++       "        /etc/udev/rules.d/90-libgphoto2.rules, set file mode, owner, 
group\n"
+        "        or add script to run. This rule files also uses the\n"
+        "        check-ptp-camera script included in libgphoto2 source. Either 
put it to\n"
+        "        /lib/udev/check-ptp-camera or adjust the path in the 
generated rules file.\n"
+-       "        If you give a script parameter, the mode, owner, group 
parameters will be ignored.",
++       "        If you give a script parameter, the mode, owner, group 
parameters will be ignored.\n"
++       "        For mode \"136\" put it into 
/lib/udev/rules.d/40-libgphoto2.rules;\n"
++       "        you can still use mode/owner/group, but the preferred mode of 
operation\n"
++       "        is to use udev-extras for dynamic access permissions.\n",
+        "[script <PATH_TO_SCRIPT>|version <version>|mode <mode>|owner 
<owner>|group <group>]*",
+        udev_begin_func, 
+        udev_camera_func,

Attachment: signature.asc
Description: Digital signature

Reply via email to