Sat Mar 31 16:06:56 2012 UTC ()
Bump PKGREVISION

* Fix build on FreeBSD 9.0
** Patches are borrowed from FreeBSD ports
** Split FreeBSD support from DragonFly/FreeBSD support


(ryoon)
diff -r1.59 -r1.60 pkgsrc/sysutils/hal/Makefile
diff -r0 -r1.1 pkgsrc/sysutils/hal/PLIST.DragonFly
diff -r1.3 -r1.4 pkgsrc/sysutils/hal/PLIST.FreeBSD
diff -r1.22 -r1.23 pkgsrc/sysutils/hal/distinfo
diff -r1.3 -r1.4 pkgsrc/sysutils/hal/patches/patch-ak
diff -r1.3 -r1.4 pkgsrc/sysutils/hal/patches/patch-ao
diff -r0 -r1.1 pkgsrc/sysutils/hal/patches/patch-hald_freebsd_addons_addon-storage.c
diff -r0 -r1.1 pkgsrc/sysutils/hal/patches/patch-hald_freebsd_hf-devd.c
diff -r0 -r1.1 pkgsrc/sysutils/hal/patches/patch-hald_freebsd_hf-usb2.c
diff -r0 -r1.1 pkgsrc/sysutils/hal/patches/patch-hald_freebsd_hf-volume.c
diff -r0 -r1.1 pkgsrc/sysutils/hal/patches/patch-hald_freebsd_probing_probe-usb2-device.c
diff -r0 -r1.1 pkgsrc/sysutils/hal/patches/patch-hald_freebsd_probing_probe-usb2-interface.c

cvs diff -r1.59 -r1.60 pkgsrc/sysutils/hal/Makefile (expand / switch to context diff)
--- pkgsrc/sysutils/hal/Makefile 2012/03/03 00:12:20 1.59
+++ pkgsrc/sysutils/hal/Makefile 2012/03/31 16:06:56 1.60
@@ -1,7 +1,7 @@
-# $NetBSD: Makefile,v 1.59 2012/03/03 00:12:20 wiz Exp $
+# $NetBSD: Makefile,v 1.60 2012/03/31 16:06:56 ryoon Exp $
 
 DISTNAME=		hal-0.5.14
-PKGREVISION=		5
+PKGREVISION=		6
 CATEGORIES=		sysutils
 MASTER_SITES=		http://hal.freedesktop.org/releases/
 EXTRACT_SUFX=		.tar.bz2
@@ -36,7 +36,13 @@
 
 .include "../../mk/bsd.prefs.mk"
 
-.if ${OPSYS} == "FreeBSD" || ${OPSYS} == "DragonFly"
+.if ${OPSYS} == "DragonFly"
+.include "../../devel/libvolume_id/buildlink3.mk"
+CONFIGURE_ARGS+=	--with-eject=/usr/sbin/cdcontrol
+CONFIGURE_ARGS+=	--with-backend=freebsd
+PLIST_SRC=		PLIST.DragonFly PLIST
+
+.elif ${OPSYS} == "FreeBSD"
 .include "../../devel/libvolume_id/buildlink3.mk"
 CONFIGURE_ARGS+=	--with-eject=/usr/sbin/cdcontrol
 CONFIGURE_ARGS+=	--with-backend=freebsd

File Added: pkgsrc/sysutils/hal/PLIST.DragonFly
@comment $NetBSD: PLIST.DragonFly,v 1.1 2012/03/31 16:06:56 ryoon Exp $
libexec/hald-addon-mouse-sysmouse
libexec/hald-addon-storage
libexec/hald-probe-hiddev
libexec/hald-probe-mouse
libexec/hald-probe-scsi
libexec/hald-probe-smbios
libexec/hald-probe-storage
libexec/hald-probe-volume
libexec/scripts/freebsd/hal-system-lcd-get-brightness-freebsd
libexec/scripts/freebsd/hal-system-lcd-set-brightness-freebsd
libexec/scripts/freebsd/hal-system-power-reboot-freebsd
libexec/scripts/freebsd/hal-system-power-set-power-save-freebsd
libexec/scripts/freebsd/hal-system-power-shutdown-freebsd
libexec/scripts/freebsd/hal-system-power-suspend-freebsd

cvs diff -r1.3 -r1.4 pkgsrc/sysutils/hal/PLIST.FreeBSD (expand / switch to context diff)
--- pkgsrc/sysutils/hal/PLIST.FreeBSD 2011/01/08 13:00:13 1.3
+++ pkgsrc/sysutils/hal/PLIST.FreeBSD 2012/03/31 16:06:56 1.4
@@ -1,4 +1,4 @@
-@comment $NetBSD: PLIST.FreeBSD,v 1.3 2011/01/08 13:00:13 obache Exp $
+@comment $NetBSD: PLIST.FreeBSD,v 1.4 2012/03/31 16:06:56 ryoon Exp $
 libexec/hald-addon-mouse-sysmouse
 libexec/hald-addon-storage
 libexec/hald-probe-hiddev
@@ -6,6 +6,8 @@
 libexec/hald-probe-scsi
 libexec/hald-probe-smbios
 libexec/hald-probe-storage
+libexec/hald-probe-usb2-device
+libexec/hald-probe-usb2-interface
 libexec/hald-probe-volume
 libexec/scripts/freebsd/hal-system-lcd-get-brightness-freebsd
 libexec/scripts/freebsd/hal-system-lcd-set-brightness-freebsd

cvs diff -r1.22 -r1.23 pkgsrc/sysutils/hal/distinfo (expand / switch to context diff)
--- pkgsrc/sysutils/hal/distinfo 2011/10/04 10:31:37 1.22
+++ pkgsrc/sysutils/hal/distinfo 2012/03/31 16:06:56 1.23
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.22 2011/10/04 10:31:37 dsainty Exp $
+$NetBSD: distinfo,v 1.23 2012/03/31 16:06:56 ryoon Exp $
 
 SHA1 (hal-0.5.14.tar.bz2) = a6ec098d78112e18e2773afa5f9ed642b00c4c59
 RMD160 (hal-0.5.14.tar.bz2) = 0314dace9512bf49a62bd1556963fc60a6c9caf9
@@ -12,11 +12,11 @@
 SHA1 (patch-ag) = 3fd8b7d10b1a43311541d2c6ad67a944e286c5ec
 SHA1 (patch-ah) = 6d801a2c30cee6199b25acf46d7e9866f6004182
 SHA1 (patch-aj) = f20e4b1286d177e53a550b2ba1608d22e4b5c609
-SHA1 (patch-ak) = c6e9f20df9230de1bbf599315ad7f32fe6433f48
+SHA1 (patch-ak) = 2964207f8907229b5d00ecce7f56fb3359d01f0d
 SHA1 (patch-al) = fe567d7504e961cb623e492f8dc155ef2f3b4c9e
 SHA1 (patch-am) = 6a4940006e583300d9a983511bdcb05268f74b1a
 SHA1 (patch-an) = 0307b2f0f6bb5e4a6d7bf837163e74749b7d24b2
-SHA1 (patch-ao) = 2bbd39404284c5c05068e87c9d20b8f6a65c3503
+SHA1 (patch-ao) = 5413ef5a9810dcf9dbed54243d5af26a4486a810
 SHA1 (patch-ap) = 9051ced9c00911b993198c98c6d02f5846c16728
 SHA1 (patch-aq) = 7d0b224b4b1e6052983a6512217eee4f530e0720
 SHA1 (patch-ar) = bf44c939b338359f18457b1e65434731c3605130
@@ -25,6 +25,12 @@
 SHA1 (patch-au) = c9e843f57b8a31f1bdc42478d450ea5606b4d7db
 SHA1 (patch-av) = 075ab5e265be4733d856a17184129d0b301bc0b8
 SHA1 (patch-ax) = 278cbf10dd288f7a4aeedd7545b325c1a82715db
+SHA1 (patch-hald_freebsd_addons_addon-storage.c) = 0a9f63690224c11b38f2ad1c814e7b1433c5597d
+SHA1 (patch-hald_freebsd_hf-devd.c) = 37394dfd49e56659cfe5282f66781d4845f5ee97
+SHA1 (patch-hald_freebsd_hf-usb2.c) = 9a1a612fe6f81078ea246fb49ec60157b8641e75
+SHA1 (patch-hald_freebsd_hf-volume.c) = 45f27050f2b0ef8825d32d2bbdcac168c8f5b2b5
+SHA1 (patch-hald_freebsd_probing_probe-usb2-device.c) = eb655ef42d02cd2c6a86004c309e20de942f033b
+SHA1 (patch-hald_freebsd_probing_probe-usb2-interface.c) = 8ad0ac33ae366f7f470b2cb751a31bb99b2e6313
 SHA1 (patch-na) = 2786db8149a55dbd5ea11419d789f420bac1993c
 SHA1 (patch-nb) = 1693b7a2faa5bee20a594f0b60b8ff6caea0efdc
 SHA1 (patch-nc) = 32453e49734902749ce24eb4364fc7f531986227

cvs diff -r1.3 -r1.4 pkgsrc/sysutils/hal/patches/patch-ak (expand / switch to context diff)
--- pkgsrc/sysutils/hal/patches/patch-ak 2011/01/08 13:00:13 1.3
+++ pkgsrc/sysutils/hal/patches/patch-ak 2012/03/31 16:06:56 1.4
@@ -1,4 +1,4 @@
-$NetBSD: patch-ak,v 1.3 2011/01/08 13:00:13 obache Exp $
+$NetBSD: patch-ak,v 1.4 2012/03/31 16:06:56 ryoon Exp $
 
 --- hald/freebsd/probing/probe-volume.c.orig	2009-09-17 13:45:09.000000000 +0000
 +++ hald/freebsd/probing/probe-volume.c
@@ -85,7 +85,25 @@
  	  libhal_device_set_property_string(hfp_ctx, hfp_udi, "volume.freebsd.ufsid", ufsid, &hfp_error);
  	  ufs_devs = libhal_manager_find_device_string_match(hfp_ctx,
  			  				     "volume.freebsd.ufsid",
-@@ -597,7 +632,9 @@ main (int argc, char **argv)
+@@ -582,7 +617,11 @@ main (int argc, char **argv)
+ 	  dbus_error_free(&hfp_error);
+ 	  for (i = 0; i < num_udis; i++)
+             {
++#if defined(__FreeBSD__)
++	      if (ufs_devs[i] != NULL && strcmp(ufs_devs[i], hfp_udi))
++#else
+               if (ufs_devs[i] != NULL)
++#endif
+                 {
+                   gboolean mounted;
+ 
+@@ -592,12 +631,15 @@ main (int argc, char **argv)
+ 		    {
+                       libhal_device_set_property_bool(hfp_ctx, hfp_udi, "volume.ignore", TRUE, &hfp_error);
+ 		      dbus_error_free(&hfp_error);
++		      break;
+ 		    }
+ 		}
  	    }
  	  if (ufs_devs)
  	    libhal_free_string_array(ufs_devs);
@@ -95,7 +113,7 @@
  	}
      }
  
-@@ -628,7 +665,11 @@ main (int argc, char **argv)
+@@ -628,7 +670,11 @@ main (int argc, char **argv)
  
    libhal_device_set_property_string(hfp_ctx, hfp_udi, "volume.uuid", vid ? vid->uuid : "", &hfp_error);
  

cvs diff -r1.3 -r1.4 pkgsrc/sysutils/hal/patches/patch-ao (expand / switch to context diff)
--- pkgsrc/sysutils/hal/patches/patch-ao 2011/01/08 13:00:13 1.3
+++ pkgsrc/sysutils/hal/patches/patch-ao 2012/03/31 16:06:56 1.4
@@ -1,4 +1,4 @@
-$NetBSD: patch-ao,v 1.3 2011/01/08 13:00:13 obache Exp $
+$NetBSD: patch-ao,v 1.4 2012/03/31 16:06:56 ryoon Exp $
 
 On DragonFly /dev/usb will be taken by usbd(8), but that does not
 mean that one cannot check usbX devices. The same behaviour was present
@@ -20,7 +20,19 @@
  
  #include "../logger.h"
  #include "../osspec.h"
-@@ -613,7 +617,6 @@ hf_usb_privileged_init (void)
+@@ -392,7 +396,11 @@ hf_usb_device_new (HalDevice *parent,
+     hf_devtree_device_set_name(device, di->udi_devnames[0]);
+ 
+   if ((devname = hf_usb_get_devname(di, "ukbd")))	/* USB keyboard */
++#if defined(__FreeBSD__)
++    hf_device_set_input(device, "keyboard", "keys", NULL);
++#else
+     hf_device_set_input(device, "keyboard", "keys", devname);
++#endif
+   else if ((devname = hf_usb_get_devname(di, "ums")))	/* USB mouse */
+     hf_device_set_input(device, "mouse", NULL, devname);
+   else if ((devname = hf_usb_get_devname(di, "uhid")))	/* UHID device */
+@@ -613,7 +621,6 @@ hf_usb_privileged_init (void)
    if (hf_usb_fd < 0)
      {
        HAL_INFO(("unable to open %s: %s", HF_USB_DEVICE, g_strerror(errno)));
@@ -28,3 +40,12 @@
      }
  
    for (i = 0; i < 16; i++)
+@@ -908,6 +915,8 @@ hf_usb_add_webcam_properties (HalDevice 
+ 
+   hal_device_property_set_string(device, "info.category", "video4linux");
+   hal_device_add_capability(device, "video4linux");
++  hal_device_add_capability(device, "video4linux.video_capture");
+   hf_device_property_set_string_printf(device, "video4linux.device", "/dev/video%i", unit);
+   hal_device_property_set_string(device, "info.product", "Video Device");
++  hal_device_property_set_string(device, "video4linux.version", "1");
+ }

File Added: pkgsrc/sysutils/hal/patches/patch-hald_freebsd_addons_addon-storage.c
$NetBSD: patch-hald_freebsd_addons_addon-storage.c,v 1.1 2012/03/31 16:06:56 ryoon Exp $

* From FreeBSD ports repository to fix build on FreeBSD 9.0 RELEASE.

--- hald/freebsd/addons/addon-storage.c.orig	2009-08-24 12:42:29.000000000 +0000
+++ hald/freebsd/addons/addon-storage.c
@@ -107,8 +107,12 @@ hf_addon_storage_update (void)
 
 	  if (hf_addon_storage_cdrom_eject_pressed(cdrom))
 	    {
+#if defined(__FreeBSD__)
+	      libhal_device_emit_condition(hfp_ctx, hfp_udi, "EjectPressed", "", NULL);
+#else
 	      libhal_device_emit_condition(hfp_ctx, hfp_udi, "EjectPressed", "", &hfp_error);
 	      dbus_error_free(&hfp_error);
+#endif
 	    }
 
 	  hfp_cdrom_free(cdrom);
@@ -164,11 +168,17 @@ unmount_volumes (void)
                                                          "block.storage_device",
 							 hfp_udi,
 							 &num_volumes,
+#if defined(__FreeBSD__)
+							 NULL)) != NULL)
+#else
 							 &hfp_error)) != NULL)
+#endif
     {
       int i;
 
+#if !defined(__FreeBSD__)
       dbus_error_free(&hfp_error);
+#endif
 
       for (i = 0; i < num_volumes; i++)
         {
@@ -176,7 +186,11 @@ unmount_volumes (void)
 
 	  vol_udi = volumes[i];
 
+#if defined(__FreeBSD__)
+	  if (libhal_device_get_property_bool(hfp_ctx, vol_udi, "volume.is_mounted", NULL))
+#else
 	  if (libhal_device_get_property_bool(hfp_ctx, vol_udi, "volume.is_mounted", &hfp_error))
+#endif
             {
               DBusMessage *msg = NULL;
 	      DBusMessage *reply = NULL;
@@ -185,7 +199,9 @@ unmount_volumes (void)
 	      char **options = NULL;
 	      char *devfile;
 
+#if !defined(__FreeBSD__)
 	      dbus_error_free(&hfp_error);
+#endif
               hfp_info("Forcing unmount of volume '%s'", vol_udi);
 
 	      dbus_connection = libhal_ctx_get_dbus_connection(hfp_ctx);
@@ -265,10 +281,16 @@ poll_for_media (boolean check_only, bool
       check_lock_state = FALSE;
 
       hfp_info("Checking whether device %s is locked by HAL", addon.device_file);
+#if defined(__FreeBSD__)
+      if (libhal_device_is_locked_by_others(hfp_ctx, hfp_udi, "org.freedesktop.Hal.Device.Storage", NULL))
+#else
       if (libhal_device_is_locked_by_others(hfp_ctx, hfp_udi, "org.freedesktop.Hal.Device.Storage", &hfp_error))
+#endif
         {
           hfp_info("... device %s is locked by HAL", addon.device_file);
+#if !defined(__FreeBSD__)
 	  dbus_error_free(&hfp_error);
+#endif
 	  is_locked_by_hal = TRUE;
 	  update_proc_title(addon.device_file);
 	  goto skip_check;
@@ -278,9 +300,13 @@ poll_for_media (boolean check_only, bool
           hfp_info("... device %s is not locked by HAL", addon.device_file);
 	  is_locked_by_hal = FALSE;
 	}
+#if defined(__FreeBSD__)
+      should_poll = libhal_device_get_property_bool(hfp_ctx, hfp_udi, "storage.media_check_enabled", NULL);
+#else
       dbus_error_free(&hfp_error);
 
       should_poll = libhal_device_get_property_bool(hfp_ctx, hfp_udi, "storage.media_check_enabled", &hfp_error);
+#endif
       dbus_error_free(&hfp_error);
       polling_disabled = ! should_poll;
       update_proc_title(addon.device_file);
@@ -314,8 +340,12 @@ poll_for_media (boolean check_only, bool
       unmount_volumes();
 #endif
 
+#if defined(__FreeBSD__)
+      libhal_device_rescan(hfp_ctx, hfp_udi, NULL);
+#else
       libhal_device_rescan(hfp_ctx, hfp_udi, &hfp_error);
       dbus_error_free(&hfp_error);
+#endif
       addon.had_media = has_media;
 
       return TRUE;
@@ -412,12 +442,19 @@ main (int argc, char **argv)
     ! strcmp(driver, "cd")))) && ! strcmp(removable, "true");
   addon.had_media = poll_for_media(TRUE, FALSE);
 
+#if defined(__FreeBSD__)
+  if (! libhal_device_addon_is_ready(hfp_ctx, hfp_udi, NULL))
+    goto end;
+
+  syscon = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
+#else
   if (! libhal_device_addon_is_ready(hfp_ctx, hfp_udi, &hfp_error))
     goto end;
   dbus_error_free(&hfp_error);
 
   syscon = dbus_bus_get(DBUS_BUS_SYSTEM, &hfp_error);
   dbus_error_free(&hfp_error);
+#endif
   assert(syscon != NULL);
   dbus_connection_set_exit_on_disconnect(syscon, 0);
 
@@ -452,12 +489,18 @@ main (int argc, char **argv)
 				      "    <method name=\"CheckForMedia\">\n"
 				      "      <arg name=\"call_had_sideeffect\" direction=\"out\" type=\"b\"/>\n"
 				      "    </method>\n",
+#if defined(__FreeBSD__)
+				      NULL))
+#else
 				      &hfp_error))
+#endif
     {
       hfp_critical("Cannot claim interface 'org.freedesktop.Hal.Device.Storage.Removable'");
       goto end;
     }
+#if !defined(__FreeBSD__)
   dbus_error_free(&hfp_error);
+#endif
 
   while (TRUE)
     {

File Added: pkgsrc/sysutils/hal/patches/patch-hald_freebsd_hf-devd.c
$NetBSD: patch-hald_freebsd_hf-devd.c,v 1.1 2012/03/31 16:06:56 ryoon Exp $

* From FreeBSD ports repository to fix build on FreeBSD 9.0 RELEASE.

--- hald/freebsd/hf-devd.c.orig	2009-08-24 12:42:29.000000000 +0000
+++ hald/freebsd/hf-devd.c
@@ -122,7 +122,11 @@ hf_devd_parse_add_remove (const char *ev
   g_return_val_if_fail(parent != NULL, FALSE);
 
   if ((params_ptr = strchr(event, ' '))
+#if defined(__FreeBSD__)
+      && (at_ptr = strstr(params_ptr, "at "))
+#else
       && (at_ptr = strstr(params_ptr + 1, " at "))
+#endif
       && (parent_ptr = strstr(at_ptr + 4, " on ")))
     {
       char *params_str;
@@ -130,7 +134,11 @@ hf_devd_parse_add_remove (const char *ev
 
       *name = g_strndup(event, params_ptr - event);
       params_str = g_strndup(params_ptr + 1, at_ptr - params_ptr - 1);
+#if defined(__FreeBSD__)
+      at_str = g_strndup(at_ptr + 3, parent_ptr - at_ptr - 3);
+#else
       at_str = g_strndup(at_ptr + 4, parent_ptr - at_ptr - 4);
+#endif
       *parent = g_strdup(parent_ptr + 4);
 
       if (! strcmp(*parent, ".")) /* sys/kern/subr_bus.c */
@@ -398,7 +406,11 @@ hf_devd_event_cb (GIOChannel *source, GI
       hf_devd_process_event(event);
       g_free(event);
     }
+#if defined(__FreeBSD__)
+  else if (status == G_IO_STATUS_AGAIN || status == G_IO_STATUS_EOF)
+#else
   else if (status == G_IO_STATUS_AGAIN)
+#endif
     {
       hf_devd_init();
       if (hf_devd_inited)

File Added: pkgsrc/sysutils/hal/patches/patch-hald_freebsd_hf-usb2.c
$NetBSD: patch-hald_freebsd_hf-usb2.c,v 1.1 2012/03/31 16:06:56 ryoon Exp $

* From FreeBSD ports repository to fix build on FreeBSD 9.0 RELEASE.

--- hald/freebsd/hf-usb2.c.orig	2009-08-24 12:42:29.000000000 +0000
+++ hald/freebsd/hf-usb2.c
@@ -22,7 +22,7 @@
  **************************************************************************/
 
 #ifdef HAVE_CONFIG_H
-#  include <config.h>
+#include <config.h>
 #endif
 
 #include <string.h>
@@ -42,246 +42,200 @@
 static struct libusb20_backend *hf_usb2_be = NULL;
 
 static void
-hf_usb2_copy_parent (HalDevice *parent,
-		     const char *key,
-		     gpointer user_data)
+hf_usb2_probe_interfaces(HalDevice * parent)
 {
-  HalDevice *device;
+	int num_interfaces;
+	int i;
 
-  g_return_if_fail(HAL_IS_DEVICE(parent));
-  g_return_if_fail(HAL_IS_DEVICE(user_data));
+	g_return_if_fail(HAL_IS_DEVICE(parent));
 
-  device = HAL_DEVICE(user_data);
-
-  if (! strncmp(key, "usb_device.", strlen("usb_device.")))
-    hal_device_copy_property(parent, key, device, key);
+	if (hal_device_property_get_bool(parent, "info.ignore"))
+		return;
+
+	num_interfaces = hal_device_property_get_int(parent,
+	    "usb_device.num_interfaces");
+
+	for (i = 0; i < num_interfaces; i++) {
+		HalDevice *device;
+
+		device = hf_device_new(parent);
+
+		hal_device_property_set_string(device, "info.subsystem", "usb");
+		hal_device_property_set_int(device, "usb.interface.number", i);
+		hal_device_copy_property(parent, "info.product", device, "info.product");
+		hal_device_copy_property(parent, "info.vendor", device, "info.vendor");
+		hal_device_merge_with_rewrite(device, parent, "usb.", "usb_device.");
+
+		if (hf_device_preprobe(device)) {
+			const char *driver, *devname;
+
+			hf_runner_run_sync(device, 0, "hald-probe-usb2-interface", NULL);
+
+			devname = hal_device_property_get_string(device,
+			    "usb.freebsd.devname");
+			if (devname)
+				hf_devtree_device_set_name(device, devname);
+
+			driver = hal_device_property_get_string(device, "freebsd.driver");
+			if (driver) {
+				if (!strcmp(driver, "ukbd"))
+					hf_device_set_input(device, "keyboard", "keys", NULL);
+				else if (!strcmp(driver, "ums") || !strcmp(driver, "atp")) {
+					hf_device_set_input(device, "mouse", NULL, devname);
+					hf_runner_run_sync(device, 0, "hald-probe-mouse", NULL);
+				} else if (!strcmp(driver, "uhid")) {
+					hal_device_property_set_string(device, "info.category",
+					    "hiddev");
+					hal_device_add_capability(device, "hiddev");
+					hf_device_property_set_string_printf(device, "hiddev.device",
+					    "/dev/%s", devname);
+					hal_device_copy_property(device, "info.product", device,
+					    "hiddev.product");
+					hf_runner_run_sync(device, 0, "hald-probe-hiddev", NULL);
+				} else if (!strcmp(driver, "ldev")) {
+					/* Linux driver (webcam) */
+
+					/*
+		                         * XXX This is a hack.  Currently, all ldev devices are
+				         * webcams.  That may not always be the case.  Hopefully,
+				         * when other Linux driver support is added, there will be
+				         * a sysctl or some other way to determine device class.
+			                 */
+					hf_usb_add_webcam_properties(device);
+				} else if (!strcmp(driver, "pwc")) {
+					/* Phillips Web Cam */
+					hf_usb_add_webcam_properties(device);
+				}
+			} else {
+				/* Try and detect webcamd devices. */
+				hf_runner_run_sync(device, 0, "hald-probe-video4linux", NULL);
+			}
+
+			hf_usb_device_compute_udi(device);
+			hf_device_add(device);
+		}
+	}
 }
 
 static void
-hf_usb2_probe_interfaces(HalDevice *parent)
+hf_usb2_probe_device(HalDevice * parent, int bus, int addr)
 {
-  int num_interfaces;
-  int i;
+	HalDevice *device;
 
-  g_return_if_fail(HAL_IS_DEVICE(parent));
+	g_return_if_fail(HAL_IS_DEVICE(parent));
 
-  if (hal_device_property_get_bool(parent, "info.ignore"))
-    return;
+	device = hf_device_new(parent);
 
-  num_interfaces = hal_device_property_get_int(parent,
-    "usb_device.num_interfaces");
-
-  for (i = 0; i < num_interfaces; i++)
-    {
-      HalDevice *device;
-
-      device = hf_device_new(parent);
-
-      hal_device_property_set_string(device, "info.subsystem", "usb");
-      hal_device_property_set_int(device, "usb.interface.number", i);
-      hal_device_property_foreach(parent, hf_usb2_copy_parent, device);
-      hal_device_copy_property(parent, "info.product", device, "info.product");
-      hal_device_copy_property(parent, "info.vendor", device, "info.vendor");
-
-      if (hf_device_preprobe(device))
-        {
-          const char *driver, *devname;
-
-          hf_runner_run_sync(device, 0, "hald-probe-usb2-interface", NULL);
-
-	  devname = hal_device_property_get_string(device,
-            "usb.freebsd.devname");
-	  if (devname)
-            hf_devtree_device_set_name(device, devname);
-
-	  driver = hal_device_property_get_string(device, "freebsd.driver");
-	  if (driver)
-            {
-	      if (! strcmp(driver, "ukbd"))
-                hf_device_set_input(device, "keyboard", NULL);
-	      else if (! strcmp(driver, "ums"))
-                {
-                  hf_device_set_input(device, "mouse", devname);
-	          hf_runner_run_sync(device, 0, "hald-probe-mouse", NULL);
-	        }
-	      else if (! strcmp(driver, "uhid"))
-                {
-                  hal_device_property_set_string(device, "info.category",
-                    "hiddev");
-	          hal_device_add_capability(device, "hiddev");
-	          hf_device_property_set_string_printf(device, "hiddev.device",
-                    "/dev/%s", devname);
-	          hal_device_copy_property(device, "info.product", device,
-                    "hiddev.product");
-	          hf_runner_run_sync(device, 0, "hald-probe-hiddev", NULL);
-	        }
-	      else if (! strcmp(driver, "ldev"))
-                {
-                  /* Linux driver (webcam) */
-
-	          /*
-                   * XXX This is a hack.  Currently, all ldev devices are
-		   * webcams.  That may not always be the case.  Hopefully,
-		   * when other Linux driver support is added, there will be
-		   * a sysctl or some other way to determine device class.
-	           */
-                  hf_usb_add_webcam_properties(device);
-	        }
-	      else if (! strcmp(driver, "pwc"))
-                {
-                  /* Phillips Web Cam */
-                  hf_usb_add_webcam_properties(device);
-	        }
-	    }
+	hal_device_property_set_string(device, "info.subsystem", "usb_device");
+	hal_device_property_set_int(device, "usb_device.bus_number", bus);
+	hal_device_property_set_int(device, "usb_device.level_number", 1);
+	hal_device_property_set_int(device, "usb_device.port_number", addr);
 
-	  hf_usb_device_compute_udi(device);
-	  hf_device_add(device);
+	if (hf_device_preprobe(device)) {
+		hf_runner_run_sync(device, 0, "hald-probe-usb2-device", NULL);
+		hf_usb_device_compute_udi(device);
+		hf_device_add(device);
+		hf_usb2_probe_interfaces(device);
 	}
-    }
 }
 
 static void
-hf_usb2_probe_device (HalDevice *parent, int bus, int addr)
+hf_usb2_privileged_init(void)
 {
-  HalDevice *device;
-
-  g_return_if_fail(HAL_IS_DEVICE(parent));
-
-  device = hf_device_new(parent);
+	hf_usb2_be = libusb20_be_alloc_default();
+	if (hf_usb2_be == NULL)
+		HAL_INFO(("unable to open USB backend: %s", g_strerror(errno)));
+}
 
-  hal_device_property_set_string(device, "info.subsystem", "usb_device");
-  hal_device_property_set_int(device, "usb_device.bus_number", bus);
-  hal_device_property_set_int(device, "usb_device.level_number", addr - 1);
-  hal_device_property_set_int(device, "usb_device.port_number", addr);
+static void
+hf_usb2_new_device(int bus, int addr)
+{
+	HalDevice *parent;
 
-  if (hf_device_preprobe(device))
-    {
-      hf_runner_run_sync(device, 0, "hald-probe-usb2-device", NULL);
-      hf_usb_device_compute_udi(device);
+	parent = hf_devtree_find_from_info(hald_get_gdl(), "usbus", bus);
 
-      hf_device_add(device);
-    }
-  else
-    return;
+	if (!parent || hal_device_property_get_bool(parent, "info.ignore"))
+		return;
 
-  hf_usb2_probe_interfaces(device);
+	hf_usb2_probe_device(parent, bus, addr);
 }
 
 static void
-hf_usb2_privileged_init (void)
+hf_usb2_probe(void)
 {
-  hf_usb2_be = libusb20_be_alloc_default();
-  if (hf_usb2_be == NULL)
-    HAL_INFO(("unable to open USB backend: %s", g_strerror(errno)));
-}
+	struct libusb20_device *pdev = NULL;
 
-static void
-hf_usb2_probe (void)
-{
-  struct libusb20_device *pdev = NULL;
+	if (hf_usb2_be == NULL)
+		return;
 
-  if (hf_usb2_be == NULL)
-    return;
+	while ((pdev = libusb20_be_device_foreach(hf_usb2_be, pdev))) {
+		hf_usb2_new_device(libusb20_dev_get_bus_number(pdev),
+		    libusb20_dev_get_address(pdev));
+	}
 
-  while ((pdev = libusb20_be_device_foreach(hf_usb2_be, pdev)))
-    {
-      HalDevice *parent;
-      int bus, addr;
-
-      bus = libusb20_dev_get_bus_number(pdev);
-      addr = libusb20_dev_get_address(pdev);
-
-      if (addr == 1)
-        parent = hf_devtree_find_parent_from_info(hald_get_gdl(), "usbus", bus);
-      else
-        parent = hf_device_store_match(hald_get_gdl(), "usb_device.bus_number",
-          HAL_PROPERTY_TYPE_INT32, bus, "usb_device.port_number",
-	  HAL_PROPERTY_TYPE_INT32, addr - 1, NULL);
-      if (! parent || hal_device_property_get_bool(parent, "info.ignore"))
-        continue;
+	libusb20_be_free(hf_usb2_be);
+	hf_usb2_be = NULL;
+}
 
-      hf_usb2_probe_device(parent, bus, addr);
-    }
+static	gboolean
+hf_usb2_devd_notify(const char *system,
+    const char *subsystem,
+    const char *type,
+    const char *data)
+{
+	const char *ugen;
+	int bus;
+	int addr;
+
+	if (!data || strcmp(system, "USB") || strcmp(subsystem, "DEVICE") ||
+	    (strcmp(type, "ATTACH") && strcmp(type, "DETACH")))
+		return FALSE;
+
+	ugen = strstr(data, "ugen=");
+	if (ugen == NULL) {
+		/*
+		 * The following case is not required in
+		 * FreeBSD 8-stable and newer:
+		 */
+		ugen = strstr(data, "cdev=");
+		if (ugen == NULL)
+			return FALSE;
+
+		if (sscanf(ugen, "cdev=ugen%i.%i", &bus, &addr) != 2)
+			return FALSE;
+	} else {
+		if (sscanf(ugen, "ugen=ugen%i.%i", &bus, &addr) != 2)
+			return FALSE;
+	}
 
-  libusb20_be_free(hf_usb2_be);
-  hf_usb2_be = NULL;
-}
+	if (strcmp(type, "ATTACH") == 0) {
 
-static gboolean
-hf_usb2_devd_add (const char *name,
-		  GHashTable *params,
-		  GHashTable *at,
-		  const char *parent)
-{
-  HalDevice *parent_device;
-  int bus, addr, pbus, paddr;
+		HAL_INFO(("received devd attach event, device %s", data));
 
-  if (strncmp(name, "ugen", strlen("ugen")))
-    return FALSE;
-  else if (strncmp(parent, "ugen", strlen("ugen")))
-    return TRUE;
-
-  if (sscanf(name, "ugen%i.%i", &bus, &addr) != 2)
-    return FALSE;
-
-  if (sscanf(parent, "ugen%i.%i", &pbus, &paddr) != 2)
-    return FALSE;
-
-  HAL_INFO(("received devd add event for device '%s' with parent '%s'",
-           name, parent));
-
-  parent_device = hf_device_store_match(hald_get_gdl(),
-    "usb_device.bus_number", HAL_PROPERTY_TYPE_INT32, pbus,
-    "usb_device.port_number", HAL_PROPERTY_TYPE_INT32, paddr, NULL);
-
-  if (parent_device && ! hal_device_property_get_bool(parent_device,
-      "info.ignore"))
-    {
-      hf_usb2_probe_device(parent_device, bus, addr);
-      return TRUE;
-    }
+		hf_usb2_new_device(bus, addr);
+	}
+	if (strcmp(type, "DETACH") == 0) {
 
-  return FALSE;
-}
+		HalDevice *device;
 
-static gboolean
-hf_usb2_devd_remove (const char *name,
-		     GHashTable *params,
-		     GHashTable *at,
-		     const char *parent)
-{
-  HalDevice *device;
-  int bus, addr;
+		HAL_INFO(("received devd detach event, device %s", data));
 
-  if (strncmp(name, "ugen", strlen("ugen")))
-    return FALSE;
-  else if (strncmp(parent, "ugen", strlen("ugen")))
-    return TRUE;
-
-  if (sscanf(name, "ugen%i.%i", &bus, &addr) != 2)
-    return FALSE;
-
-  HAL_INFO(("received devd remove event, device %s", name));
-
-  device = hf_device_store_match(hald_get_gdl(), "usb_device.bus_number",
-    HAL_PROPERTY_TYPE_INT32, bus, "usb_device.port_number",
-    HAL_PROPERTY_TYPE_INT32, addr, NULL);
-
-  if (device)
-    {
-      hf_device_remove_tree(device);
-      return TRUE;
-    }
+		device = hf_device_store_match(hald_get_gdl(),
+		    "usb_device.bus_number", HAL_PROPERTY_TYPE_INT32, bus,
+		    "usb_device.port_number", HAL_PROPERTY_TYPE_INT32, addr,
+		    "info.bus", HAL_PROPERTY_TYPE_STRING, "usb_device", NULL);
 
-  return FALSE;
+		if (device)
+			hf_device_remove_tree(device);
+	}
+	return TRUE;
 }
 
 HFHandler hf_usb2_handler = {
-  .privileged_init	= hf_usb2_privileged_init,
-  .probe		= hf_usb2_probe
+	.privileged_init = hf_usb2_privileged_init,
+	.probe = hf_usb2_probe
 };
 
 HFDevdHandler hf_usb2_devd_handler = {
-  .add =	hf_usb2_devd_add,
-  .remove =	hf_usb2_devd_remove
+	.notify = hf_usb2_devd_notify
 };

File Added: pkgsrc/sysutils/hal/patches/patch-hald_freebsd_hf-volume.c
$NetBSD: patch-hald_freebsd_hf-volume.c,v 1.1 2012/03/31 16:06:56 ryoon Exp $

* From FreeBSD ports repository to fix build on FreeBSD 9.0 RELEASE.

--- hald/freebsd/hf-volume.c.orig	2009-08-24 12:42:29.000000000 +0000
+++ hald/freebsd/hf-volume.c
@@ -86,9 +86,12 @@ hf_volume_resolve_fuse (const char *spec
         {
           if (strcmp(fields[0], special) == 0)
 	    {
+	      char *ret;
+
+	      ret = g_strdup(fields[1]);
 	      g_strfreev(fields);
 	      g_strfreev(lines);
-	      return g_strdup(fields[1]);
+	      return ret;
 	    }
 	}
       g_strfreev(fields);

File Added: pkgsrc/sysutils/hal/patches/patch-hald_freebsd_probing_probe-usb2-device.c
$NetBSD: patch-hald_freebsd_probing_probe-usb2-device.c,v 1.1 2012/03/31 16:06:56 ryoon Exp $

* From FreeBSD ports repository to fix build on FreeBSD 9.0 RELEASE.

--- hald/freebsd/probing/probe-usb2-device.c.orig	2009-08-24 12:42:29.000000000 +0000
+++ hald/freebsd/probing/probe-usb2-device.c
@@ -147,16 +147,16 @@ main(int argc, char **argv)
 	    speed = 12.0;
 	    bcdspeed = 0x01200;
 	    break;
-	  case LIBUSB20_SPEED_HIGH:
+	  case LIBUSB20_SPEED_VARIABLE:
 	    speed = 480.0;
 	    bcdspeed = 0x48000;
 	    break;
 	  case LIBUSB20_SPEED_SUPER:
-	    speed = 4800.0;
-	    bcdspeed = 0x480000;
+	    speed = 5000.0;
+	    bcdspeed = 0x500000;
 	    break;
 	  default:
-	    ;
+	    break;
 	}
 
       libhal_device_set_property_double(hfp_ctx, hfp_udi, "usb_device.speed",
@@ -169,6 +169,9 @@ main(int argc, char **argv)
           case UD_USB_2_0:
             version = 2.0;
 	    break;
+	  case 0x0250:
+	    version = 2.5;
+	    break;
 	  case UD_USB_3_0:
 	    version = 3.0;
 	    break;
@@ -184,7 +187,7 @@ main(int argc, char **argv)
       libhal_device_set_property_int(hfp_ctx, hfp_udi,
         "usb_device.vendor_id", di.udi_vendorNo, &hfp_error);
       libhal_device_set_property_int(hfp_ctx, hfp_udi,
-        "usb_device.device_revision_bcd", ddesc->bcdUSB, &hfp_error);
+        "usb_device.device_revision_bcd", ddesc->bcdDevice, &hfp_error);
       libhal_device_set_property_string(hfp_ctx, hfp_udi,
         "usb_device.serial", di.udi_serial, &hfp_error);
       libhal_device_set_property_string(hfp_ctx, hfp_udi,

File Added: pkgsrc/sysutils/hal/patches/patch-hald_freebsd_probing_probe-usb2-interface.c
$NetBSD: patch-hald_freebsd_probing_probe-usb2-interface.c,v 1.1 2012/03/31 16:06:56 ryoon Exp $

* From FreeBSD ports repository to fix build on FreeBSD 9.0 RELEASE.

--- hald/freebsd/probing/probe-usb2-interface.c.orig	2009-08-24 12:42:29.000000000 +0000
+++ hald/freebsd/probing/probe-usb2-interface.c
@@ -58,11 +58,11 @@ main(int argc, char **argv)
   if (pbe == NULL)
     goto end;
 
-  busstr = getenv("HAL_PROP_USB_DEVICE_BUS_NUMBER");
+  busstr = getenv("HAL_PROP_USB_BUS_NUMBER");
   if (! busstr)
     goto end;
 
-  addrstr = getenv("HAL_PROP_USB_DEVICE_PORT_NUMBER");
+  addrstr = getenv("HAL_PROP_USB_PORT_NUMBER");
   if (! addrstr)
     goto end;