Hi Frederic,

Attached is the diff for libgphoto2 2.1.6-4.1 which adds udev support
to libgphoto2-2.

I left the README.Debian update up to you, as you'll probably want to
rewrite it.

Please send print-udev-rules.c upstream.

JB.

-- 
 Julien BLACHE <[EMAIL PROTECTED]>  |  Debian, because code matters more 
 Debian & GNU/Linux Developer        |       <http://www.debian.org>
 Public key available on <http://www.jblache.org> - KeyID: F5D6 5169 
 GPG Fingerprint : 935A 79F1 C8B3 3521 FD62 7CC7 CD61 4FD7 F5D6 5169 

diff -u libgphoto2-2.1.6/debian/changelog libgphoto2-2.1.6/debian/changelog
--- libgphoto2-2.1.6/debian/changelog
+++ libgphoto2-2.1.6/debian/changelog
@@ -1,3 +1,15 @@
+libgphoto2 (2.1.6-4.1) unstable; urgency=low
+
+  * Non-Maintainer Upload.
+  * Derived print-udev-rules from print-usb-usermap to generate the udev
+    rules file.
+  * debian/libgphoto2-2.postinst: call print-udev-rules, create the symlink
+    in /etc/udev/rules.d if needed (closes: #332936).
+  * debian/hotplug: use chown user:group instead of chown user.group.
+  * debian/control: libgphoto2-2 Recommends: udev | hotplug
+
+ -- Julien BLACHE <[EMAIL PROTECTED]>  Mon, 10 Oct 2005 20:40:53 +0200
+
 libgphoto2 (2.1.6-4) unstable; urgency=low
 
   * camlibs/ptp2/library.c: ported (kludgy) patch to work with HP
diff -u libgphoto2-2.1.6/debian/hotplug libgphoto2-2.1.6/debian/hotplug
--- libgphoto2-2.1.6/debian/hotplug
+++ libgphoto2-2.1.6/debian/hotplug
@@ -7,7 +7,7 @@
     # check if $GROUP really exists
     if getent group $GROUP > /dev/null; then
 	chmod 660 "$DEVICE"
-	chown root.$GROUP "$DEVICE"
+	chown root:$GROUP "$DEVICE"
     fi
 fi
 
diff -u libgphoto2-2.1.6/debian/libgphoto2-2.postinst libgphoto2-2.1.6/debian/libgphoto2-2.postinst
--- libgphoto2-2.1.6/debian/libgphoto2-2.postinst
+++ libgphoto2-2.1.6/debian/libgphoto2-2.postinst
@@ -15,6 +15,16 @@
         # create USB usermap
 	test -e /usr/lib/$PACKAGE/print-usb-usermap && \
 		/usr/lib/$PACKAGE/print-usb-usermap $PACKAGE > /etc/hotplug/usb/$PACKAGE.usermap
+        # create udev rules file
+	if [ -e /usr/lib/$PACKAGE/print-udev-rules ]; then
+	    /usr/lib/$PACKAGE/print-udev-rules /etc/hotplug/usb/$PACKAGE > /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-4.1
+	    if [ -z "$2" ] || dpkg --compare-versions "$2" lt 2.1.6-4.1 ; then
+		ln -sf ../$PACKAGE.rules /etc/udev/rules.d/025_$PACKAGE.rules
+	    fi
+	fi
         ;;
 
     abort-upgrade|abort-remove|abort-deconfigure)
diff -u libgphoto2-2.1.6/debian/control libgphoto2-2.1.6/debian/control
--- libgphoto2-2.1.6/debian/control
+++ libgphoto2-2.1.6/debian/control
@@ -38,6 +38,7 @@
 Architecture: any
 Conflicts: gphoto2 (<= 2.1.1)
 Depends: ${shlibs:Depends}, adduser
+Recommends: ${udev-hotplug}
 Suggests: gphoto2 (>= 2.1.1), gtkam
 Description: gphoto2 digital camera library
  The gphoto2 library can be used by applications to access various
diff -u libgphoto2-2.1.6/debian/rules libgphoto2-2.1.6/debian/rules
--- libgphoto2-2.1.6/debian/rules
+++ libgphoto2-2.1.6/debian/rules
@@ -5,6 +5,14 @@
 # Uncomment this to turn on verbose mode.
 #export DH_VERBOSE=1
 
+DEB_HOST_ARCH_OS ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)
+ifeq ($(DEB_HOST_ARCH_OS),)
+  DEB_HOST_ARCH_OS := $(subst -gnu,,$(shell dpkg-architecture -qDEB_HOST_GNU_SYSTEM))
+  ifeq ($(DEB_HOST_ARCH_OS),gnu)
+      DEB_HOST_ARCH_OS := hurd
+  endif
+endif
+
 major=2
 
 CFLAGS = -g
@@ -97,7 +105,11 @@
 	dh_shlibdeps -ldebian/libgphoto2-$(major)/usr/lib/:debian/libgphoto2-port0/usr/lib/
 	dh_gencontrol -plibgphoto2-$(major)-dev
 	dh_gencontrol -plibgphoto2-port0
+ifeq (linux,$(DEB_HOST_ARCH_OS))
+	dh_gencontrol -plibgphoto2-$(major) -- -Vudev-hotplug="udev | hotplug"
+else
 	dh_gencontrol -plibgphoto2-$(major)
+endif
 	dh_md5sums
 	dh_builddeb
 
diff -u libgphoto2-2.1.6/debian/control.in libgphoto2-2.1.6/debian/control.in
--- libgphoto2-2.1.6/debian/control.in
+++ libgphoto2-2.1.6/debian/control.in
@@ -38,6 +38,7 @@
 Architecture: any
 Conflicts: gphoto2 (<= 2.1.1)
 Depends: ${shlibs:Depends}, adduser
+Recommends: ${udev-hotplug}
 Suggests: gphoto2 (>= 2.1.1), gtkam
 Description: gphoto2 digital camera library
  The gphoto2 library can be used by applications to access various
diff -u libgphoto2-2.1.6/debian/libgphoto2-2.files.in libgphoto2-2.1.6/debian/libgphoto2-2.files.in
--- libgphoto2-2.1.6/debian/libgphoto2-2.files.in
+++ libgphoto2-2.1.6/debian/libgphoto2-2.files.in
@@ -6,0 +7 @@
[EMAIL PROTECTED]@ usr/lib/libgphoto2/print-udev-rules
only in patch2:
unchanged:
--- libgphoto2-2.1.6.orig/packaging/linux-hotplug/print-udev-rules.c
+++ libgphoto2-2.1.6/packaging/linux-hotplug/print-udev-rules.c
@@ -0,0 +1,240 @@
+/* $Id$
+ *
+ * Copyright © 2002 Hans Ulrich Niedermann <[EMAIL PROTECTED]>
+ * Portions Copyright © 2002 Lutz Müller <[EMAIL PROTECTED]>
+ * Portions Copyright © 2002 FIXME
+ * Portions Copyright © 2005 Julien BLACHE <[EMAIL PROTECTED]>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, 
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details. 
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#define GP_USB_HOTPLUG_SCRIPT "/etc/hotplug/usb/usbcam"
+
+#define HELP_TEXT \
+"print-udev-rules - print rules file for udev\n" \
+"\n" \
+"Syntax:\n" \
+"    print-udev-rules [ --verbose ] [ --debug ] [ <scriptname> ]\n" \
+"\n" \
+" --verbose   also print comments with camera model names\n" \
+" --debug     print all debug output\n" \
+"\n" \
+"print-udev-rules prints the lines for the rules file on stdout.\n" \
+"All other messages are printed on stderr. In case of any error, the \n" \
+"program aborts regardless of data printed on stdout and returns a non-zero\n" \
+"status code.\n" \
+"If no <scriptname> is given, print-udev-rules uses the script name\n" \
+"\"" GP_USB_HOTPLUG_SCRIPT "\"."
+
+#include <stdio.h>
+#include <sys/time.h>
+#include <time.h>
+#include <string.h>
+
+#include <gphoto2-camera.h>
+#include <gphoto2-port-log.h>
+
+#ifndef TRUE
+#define TRUE  (0==0)
+#endif
+#ifndef FALSE
+#define FALSE (0!=0)
+#endif
+
+#define GP_USB_HOTPLUG_MATCH_VENDOR_ID          0x0001
+#define GP_USB_HOTPLUG_MATCH_PRODUCT_ID         0x0002
+
+#define GP_USB_HOTPLUG_MATCH_DEV_CLASS          0x0080
+#define GP_USB_HOTPLUG_MATCH_DEV_SUBCLASS       0x0100
+#define GP_USB_HOTPLUG_MATCH_DEV_PROTOCOL       0x0200
+
+#ifdef __GNUC__
+#define CR(result) \
+	do { \
+		int r = (result); \
+		if (r < 0) { \
+			fprintf(stderr, "print-usb-usermap: " \
+				"Fatal error running `%s'.\n" \
+				"Aborting.\n", #result ); \
+			return (r); \
+		} \
+	} while (0)
+#else /* !__GNUC__ */
+#define CR(result) \
+	do { \
+		int r = (result); \
+		if (r < 0) { \
+			fprintf(stderr, "print-usb-usermap: " \
+				"Fatal error detected, aborting.\n"); \
+			return (r); \
+		} \
+	} while (0)
+#endif /* __GNUC__ */
+
+/* print-udev-rules
+ *
+ * Print out lines that can be included into an udev rules file
+ * - for all cams supported by our instance of libgphoto2.
+ *
+ * written after list_cameras & print_usb_usermap
+ */
+
+static int print_udev_rules (const char *hotplug_script, const int add_comments)
+{
+	int x, n;
+	CameraAbilitiesList *al;
+        CameraAbilities a;
+
+	CR (gp_abilities_list_new (&al));
+	CR (gp_abilities_list_load (al, NULL)); /* use NULL context */
+	CR (n = gp_abilities_list_count (al));
+
+	printf ("# udev rules file for libgphoto2\n#\n");
+	printf ("BUS!=\"usb\", ACTION!=\"add\", GOTO=\"libgphoto2_rules_end\"\n\n");
+
+        for (x = 0; x < n; x++) {
+		int flags = 0;
+		int class = 0, subclass = 0, proto = 0;
+		int usb_vendor = 0, usb_product = 0;
+
+		CR (gp_abilities_list_get_abilities (al, x, &a));
+
+		if (!(a.port & GP_PORT_USB))
+		    continue;
+
+		if (a.usb_vendor) { /* usb product id may be 0! */
+			class = 0;
+			subclass = 0;
+			proto = 0;
+			flags = GP_USB_HOTPLUG_MATCH_VENDOR_ID | GP_USB_HOTPLUG_MATCH_PRODUCT_ID;
+			usb_vendor = a.usb_vendor;
+			usb_product = a.usb_product;
+		} else if (a.usb_class) {
+			class = a.usb_class;
+			subclass = a.usb_subclass;
+			proto = a.usb_protocol;
+			flags = GP_USB_HOTPLUG_MATCH_DEV_CLASS;
+			if (subclass != -1)
+			    flags |= GP_USB_HOTPLUG_MATCH_DEV_SUBCLASS;
+			else
+			    subclass = 0;
+			if (proto != -1)
+			    flags |= GP_USB_HOTPLUG_MATCH_DEV_PROTOCOL;
+			else
+			    proto = 0;
+			usb_vendor = 0;
+			usb_product = 0;
+		} else {
+			flags = 0;
+		}
+
+		if (flags != 0) {
+			printf ("# %s\n", 
+				a.model);
+
+			if (flags & GP_USB_HOTPLUG_MATCH_DEV_CLASS) {
+				printf("SYSFS{bDeviceClass}==\"%02x\", ", class);
+				if (flags & GP_USB_HOTPLUG_MATCH_DEV_SUBCLASS) {
+					printf("SYSFS{bDeviceSubClass}==\"%02x\", ", subclass);
+				}
+				if (flags & GP_USB_HOTPLUG_MATCH_DEV_PROTOCOL) {
+					printf("SYSFS{bDeviceProtocol}==\"%02x\", ", proto);
+				}
+			} else {
+				printf ("SYSFS{idVendor}==\"%04x\", SYSFS{idProduct}==\"%04x\", ",
+					a.usb_vendor, a.usb_product);
+			}
+			printf("RUN+=\"%s\"\n", hotplug_script);
+		} else {
+			fputs ("Error: Neither vendor/product nor class/subclass matched\n", stderr);
+			return 2;
+		}
+        }
+	printf ("\nLABEL=\"libgphoto2_rules_end\"\n");
+
+	CR (gp_abilities_list_free (al));
+
+        return (0);
+}
+
+/* time zero for debug log time stamps */
+struct timeval glob_tv_zero = { 0, 0 };
+
+static void
+debug_func (GPLogLevel level, const char *domain, const char *format,
+	    va_list args, void *data)
+{
+	struct timeval tv;
+	gettimeofday (&tv,NULL);
+	fprintf (stderr, "%li.%06li %s(%i): ", 
+		 tv.tv_sec - glob_tv_zero.tv_sec, 
+		 (1000000 + tv.tv_usec - glob_tv_zero.tv_usec) % 1000000,
+		 domain, level);
+	vfprintf (stderr, format, args);
+	fprintf (stderr, "\n");
+}
+
+int main(int argc, char *argv[])
+{
+	char *hotplug_script = NULL; /* script name to use */
+	int add_comments = FALSE;    /* whether to add cam model as a comment */
+	int debug_mode = FALSE;      /* whether we should output debug messages */
+
+	int i;
+
+	/* check command line arguments */
+	for (i=1; i<argc; i++) {
+		if (0 == strcmp(argv[i], "--verbose")) {
+			if (add_comments) {
+				fprintf(stderr, "Error: duplicate parameter: option \"%s\"\n", argv[i]);
+				return 1;
+			}
+			add_comments = TRUE;
+		} else if (0 == strcmp(argv[i], "--debug")) {
+			if (debug_mode) {
+				fprintf(stderr, "Error: duplicate parameter: option \"%s\"\n", argv[i]);
+				return 1;
+			}
+			debug_mode = TRUE;
+			/* now is time zero for debug log time stamps */
+			gettimeofday (&glob_tv_zero, NULL);
+			gp_log_add_func (GP_LOG_ALL, debug_func, NULL);
+		} else if (0 == strcmp(argv[i], "--help")) {
+			puts(HELP_TEXT);
+			return 0;
+		} else {
+			if (hotplug_script != NULL) {
+				fprintf(stderr, "Error: duplicate script parameter: \"%s\"\n", argv[i]);
+				return 1;
+			}
+			/* assume script name */
+			hotplug_script = argv[i];
+		}
+	}
+
+	if (NULL == hotplug_script) {
+		hotplug_script = GP_USB_HOTPLUG_SCRIPT;
+	}
+
+	return print_udev_rules(hotplug_script, add_comments);
+}
+
+/*
+ * Local Variables:
+ * c-file-style:"linux"
+ * indent-tabs-mode:t
+ * End:
+ */
only in patch2:
unchanged:
--- libgphoto2-2.1.6.orig/packaging/linux-hotplug/Makefile.am
+++ libgphoto2-2.1.6/packaging/linux-hotplug/Makefile.am
@@ -13,10 +13,14 @@
 # FIXME: utilsdir be modifiable by a ./configure option to adapt to local
 #       policies
 utilsdir = $(libdir)/$(PACKAGE)
-utils_PROGRAMS = print-usb-usermap
+utils_PROGRAMS = print-usb-usermap print-udev-rules
 
 print_usb_usermap_SOURCE = print-usb-usermap.c
 print_usb_usermap_LDADD = $(top_builddir)/libgphoto2/libgphoto2.la \
 	$(top_builddir)/libgphoto2_port/libgphoto2_port/libgphoto2_port.la
 
+print_udev_rules_SOURCE = print-udev-rules.c
+print_udev_rules_LDADD = $(top_builddir)/libgphoto2/libgphoto2.la \
+	$(top_builddir)/libgphoto2_port/libgphoto2_port/libgphoto2_port.la
+
 endif
only in patch2:
unchanged:
--- libgphoto2-2.1.6.orig/packaging/linux-hotplug/Makefile.in
+++ libgphoto2-2.1.6/packaging/linux-hotplug/Makefile.in
@@ -146,14 +146,16 @@
 # FIXME: utilsdir be modifiable by a ./configure option to adapt to local
 #       policies
 @[EMAIL PROTECTED] = $(libdir)/$(PACKAGE)
[EMAIL PROTECTED]@utils_PROGRAMS = print-usb-usermap
[EMAIL PROTECTED]@utils_PROGRAMS = print-usb-usermap print-udev-rules
 
 @[EMAIL PROTECTED] = print-usb-usermap.c
 @[EMAIL PROTECTED] = $(top_builddir)/libgphoto2/libgphoto2.la 	$(top_builddir)/libgphoto2_port/libgphoto2_port/libgphoto2_port.la
[EMAIL PROTECTED]@print_udev_rules_SOURCE = print-udev-rules.c
[EMAIL PROTECTED]@print_udev_rules_LDADD = $(top_builddir)/libgphoto2/libgphoto2.la 	$(top_builddir)/libgphoto2_port/libgphoto2_port/libgphoto2_port.la
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = ../../config.h
 CONFIG_CLEAN_FILES = 
[EMAIL PROTECTED]@utils_PROGRAMS =  print-usb-usermap$(EXEEXT)
[EMAIL PROTECTED]@utils_PROGRAMS =  print-usb-usermap$(EXEEXT) print-udev-rules$(EXEEXT)
 PROGRAMS =  $(utils_PROGRAMS)
 
 
@@ -167,6 +169,12 @@
 @[EMAIL PROTECTED](top_builddir)/libgphoto2/libgphoto2.la \
 @[EMAIL PROTECTED](top_builddir)/libgphoto2_port/libgphoto2_port/libgphoto2_port.la
 print_usb_usermap_LDFLAGS = 
+print_udev_rules_SOURCES = print-udev-rules.c
+print_udev_rules_OBJECTS =  print-udev-rules.$(OBJEXT)
[EMAIL PROTECTED]@print_udev_rules_DEPENDENCIES =  \
[EMAIL PROTECTED]@$(top_builddir)/libgphoto2/libgphoto2.la \
[EMAIL PROTECTED]@$(top_builddir)/libgphoto2_port/libgphoto2_port/libgphoto2_port.la
+print_udev_rules_LDFLAGS = 
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -181,8 +189,8 @@
 
 TAR = tar
 GZIP_ENV = --best
-SOURCES = print-usb-usermap.c
-OBJECTS = print-usb-usermap.$(OBJEXT)
+SOURCES = print-usb-usermap.c print-udev-rules.c
+OBJECTS = print-usb-usermap.$(OBJEXT) print-udev-rules.$(OBJEXT)
 
 all: all-redirect
 .SUFFIXES:
@@ -268,6 +276,10 @@
 	@rm -f print-usb-usermap$(EXEEXT)
 	$(LINK) $(print_usb_usermap_LDFLAGS) $(print_usb_usermap_OBJECTS) $(print_usb_usermap_LDADD) $(LIBS)
 
+print-udev-rules$(EXEEXT): $(print_udev_rules_OBJECTS) $(print_udev_rules_DEPENDENCIES)
+	@rm -f print-udev-rules$(EXEEXT)
+	$(LINK) $(print_udev_rules_LDFLAGS) $(print_udev_rules_OBJECTS) $(print_udev_rules_LDADD) $(LIBS)
+
 install-hotplugdocDATA: $(hotplugdoc_DATA)
 	@$(NORMAL_INSTALL)
 	$(mkinstalldirs) $(DESTDIR)$(hotplugdocdir)

Reply via email to