--- io/hpiod/device.cpp.orig	2006-03-02 19:07:26.000000000 -0500
+++ io/hpiod/device.cpp	2006-04-27 15:47:38.000000000 -0400
@@ -99,14 +99,62 @@
 
 int Device::Write(int fd, const void *buf, int size)
 {
-   syslog(LOG_ERR, "error Write: unimplemented (osx) %s %s %d\n", URI, __FILE__, __LINE__);
-   return -1;
+   int r, ep;
+  
+   if (FD[fd].pHD == NULL)
+   {
+      syslog(LOG_ERR, "invalid Device::Write state (osx): %s %s %d\n", URI,__FILE__, __LINE__);
+      return r;
+   }
+   
+   if ((ep = GetOutEP(dev, FD[fd].Config, FD[fd].Interface, FD[fd].AltSetting, USB_ENDPOINT_TYPE_BULK)) < 0)
+   {
+      syslog(LOG_ERR, "invalid bulk out endpoint (osx) %s %s %d\n", URI, __FILE__, __LINE__);
+      return r;
+   }
+   
+   r = usb_bulk_write(FD[fd].pHD, ep, (char *)buf, size, LIBUSB_TIMEOUT);
+
+   if (r < 0)
+   {
+      syslog(LOG_ERR, "error Write (osx) %s: %s %d\n", URI, __FILE__, __LINE__);
+      return r;
+   }
+   
+   return r;   
 }
 
 int Device::Read(int fd, void *buf, int size, int usec)
 {
-   syslog(LOG_ERR, "error Read: unimplemented (osx) %s %s %d\n", URI, __FILE__, __LINE__);
-   return -2;
+   int r, ep;
+   
+   if (FD[fd].pHD == NULL)
+   {
+      syslog(LOG_ERR, "invalid Device::Read state (osx): %s %s %d\n", URI,__FILE__, __LINE__);
+      return -1;
+   }
+   
+   if ((ep = GetInEP(dev, FD[fd].Config, FD[fd].Interface, FD[fd].AltSetting, USB_ENDPOINT_TYPE_BULK)) < 0)
+   {
+      syslog(LOG_ERR, "invalid bulk in endpoint (osx) %s %s %d\n", URI, __FILE__, __LINE__);
+      return -1;
+   }
+   
+   r = usb_bulk_read(FD[fd].pHD, ep, (char *)buf, size, usec/1000);
+
+   if (r < 0)
+   {
+      syslog(LOG_ERR, "error Read (osx) %s: %s %d\n", URI, __FILE__, __LINE__);
+      return r;
+   }
+   
+   if (r != size)
+   {
+      syslog(LOG_ERR, "error Read (osx) %s: %s %d\n", URI, __FILE__, __LINE__);
+      return -1;
+   }
+   
+   return r;
 }
 
 #else
