Paul,

I just got done testing owfs with fuse.  Works great, but I had to make one 
change to owfs.h (below).  This is a bit of a hack job with regard to the 
includes and a few declarations I made, but after a break I'll see if I can't 
clean up the compile a bit.  There are quite a few things that only get 
declared when __BSD_VISIBLE is set, but that isn't supposed to be set by the 
program, and when I change the compile options things get a little crazy!

Anyway, it works, and appears to be reliable.  I hope you don't mind a bit of 
the extra debug stuff I threw into the getstatus routine.

Thanks for building such a flexible application!

Rob.

--- owfs-2.4p3/module/owfs/src/include/owfs.h   Sun Jun  4 13:38:18 2006
+++ owfs-2.4p3.rob/module/owfs/src/include/owfs.h       Sun Jul 23 15:26:00 2006
@@ -48,4 +48,8 @@
 int  Fuse_add( char * opt, struct Fuse_option * fo ) ;
 char * Fuse_arg( char * opt_arg, char * entryname ) ;
 
+#ifdef __FreeBSD__
+#define DT_DIR           4
+#endif
+
 #endif /* OWFS_H */


 
On Sunday, July 23, 2006, at 04:39PM, Paul Alfille <[EMAIL PROTECTED]> wrote:

>Very nice!
>
>I'll put it in tomorrow and make a new release.
>
>Paul Alfille
>
>
>On 7/23/06, Robert Nilsson <[EMAIL PROTECTED]> wrote:
>> Paul,
>>
>> Here are my patches.  I haven't tried Fuse yet - I want to revel in the fact 
>> that this is working for owhttpd/owftpd/owserver!
>>
>> I put the usb_clear_halt fix into the DS9490 code, since I really don't know 
>> when the libusb port might get updated.  This could probably use some smart 
>> checking in configure for such things...  It's ugly, but hopefully only 
>> temporary.
>>
>> Any idea why <sys/types> needs to be included twice (lines 77 and 85 of 
>> ow.h)?
>>
>> Rob.
>>
>> --- /home/robert/build/owfs-2.4p3/module/owlib/src/include/ow.h Fri Jun 23 
>> 17:50:23 2006
>> +++ /home/robert/build/owfs-2.4p3.rob/module/owlib/src/include/ow.h     Sun 
>> Jul 23 13:34:36 2006
>> @@ -76,6 +76,11 @@
>>  #ifdef HAVE_SYS_TYPES_H
>>   #include <sys/types.h> /* for stat */
>>  #endif
>> +#ifdef __FreeBSD__ // Fix to compile under FreeBSD
>> + #define major(x)        ((int)(((unsigned int)(x) >> 8)&0xff)) /* major 
>> number */
>> + #define minor(x)        ((int)((x)&0xffff00ff))         /* minor number */
>> + #define IPPORT_RESERVED         1024
>> +#endif
>>  #include <ctype.h>
>>  #include <sys/types.h>
>>  #include <stdlib.h>
>> @@ -99,7 +104,10 @@
>>  #include <termios.h>
>>  #include <errno.h>
>>  #include <syslog.h>
>> -#include <sys/file.h> /* for flock */
>> +// #include <sys/file.h> /* for flock */
>> +#ifdef __FreeBSD__
>> + #include <sys/select.h>
>> +#endif
>>  #ifdef HAVE_GETOPT_H
>>   #include <getopt.h> /* for long options */
>>  #endif
>> @@ -209,6 +217,28 @@
>>  #endif /* OW_MT */
>>
>>  #if OW_USB
>> + #ifdef __FreeBSD__
>> +    // Add a few definitions we need
>> +    #undef HAVE_USB_INTERRUPT_READ // This call in libusb is unneeded for 
>> FreeBSD (and it's broken)
>> +    #define u_long unsigned long
>> +    #define u_char unsigned char
>> +    #define u_int  unsigned int
>> +//    #include <sys/ioctl.h>
>> +    // The include, structure definition, and define are only needed until 
>> FreeBSD has a usb_clear_halt function
>> +    #include <dev/usb/usb.h>
>> +    struct usb_dev_handle {
>> +      int fd;
>> +      struct usb_bus *bus;
>> +      struct usb_device *device;
>> +      int config;
>> +      int interface;
>> +      int altsetting;
>> +      void *impl_info;
>> +    };
>> +    #define USB_CLEAR_HALT BSD_usb_clear_halt
>> + #else
>> +    #define USB_CLEAR_HALT usb_clear_halt
>> + #endif
>>      #include <usb.h>
>>  #endif /* OW_USB */
>>
>>
>> --- /home/robert/build/owfs-2.4p3/module/owlib/src/c/ow_ds9490.c        Fri 
>> Jun 23 17:50:23 2006
>> +++ /home/robert/build/owfs-2.4p3.rob/module/owlib/src/c/ow_ds9490.c    Sun 
>> Jul 23 13:23:42 2006
>> @@ -209,6 +209,28 @@
>>
>>  char badUSBname[] = "-1/-1" ;
>>
>> +#ifdef __FreeBSD__
>> +// This is in here until the libusb on FreeBSD supports the usb_clear_halt 
>> function
>> +int BSD_usb_clear_halt(usb_dev_handle *dev, unsigned int ep)
>> +{
>> +  int ret;
>> +  struct usb_ctl_request ctl_req;
>> +
>> +  ctl_req.ucr_addr = 0; // Not used for this type of request
>> +  ctl_req.ucr_request.bmRequestType = UT_WRITE_ENDPOINT;
>> +  ctl_req.ucr_request.bRequest = UR_CLEAR_FEATURE;
>> +  USETW(ctl_req.ucr_request.wValue, UF_ENDPOINT_HALT);
>> +  USETW(ctl_req.ucr_request.wIndex, ep);
>> +  USETW(ctl_req.ucr_request.wLength, 0);
>> +  ctl_req.ucr_flags = 0;
>> +
>> +  if ((ret = ioctl(dev->fd, USB_DO_REQUEST, &ctl_req)) < 0)
>> +      LEVEL_DATA("DS9490_clear_halt:  failed for %d", ep);
>> +
>> +       return ret;
>> +}
>> +#endif /* __FreeBSD__ */
>> +
>>  int DS9490_enumerate( void ) {
>>      struct usb_list ul ;
>>      int ret = 0 ;
>> @@ -384,10 +406,10 @@
>>
>>                  // clear endpoints
>>                  if ( (ret =
>> -                        usb_clear_halt(usb, DS2490_EP3) ||
>> -                        usb_clear_halt(usb, DS2490_EP2) ||
>> -                        usb_clear_halt(usb, DS2490_EP1) ) ) {
>> -                    LEVEL_DEFAULT("DS9490_open: usb_clear_halt failed 
>> ret=%d\n", ret);
>> +                        USB_CLEAR_HALT(usb, DS2490_EP3) ||
>> +                        USB_CLEAR_HALT(usb, DS2490_EP2) ||
>> +                        USB_CLEAR_HALT(usb, DS2490_EP1) ) ) {
>> +                    LEVEL_DEFAULT("DS9490_open: USB_CLEAR_HALT failed 
>> ret=%d\n", ret);
>>                  } else if ( DS9490_setup_adapter(pn) ||
>>                              DS9490_overdrive(ONEWIREBUSSPEED_REGULAR, pn) ||
>>                              DS9490_level(MODE_NORMAL, pn) ) {
>> @@ -584,8 +606,22 @@
>>      int ret , loops = 0 ;
>>      int i ;
>>      usb_dev_handle * usb = pn->in->connin.usb.usb ;
>> +#ifdef OW_DEBUG
>> +    char s[97], t[4] ; // For my fancy display in the log
>> +#endif
>>
>>      memset(buffer, 0, 32) ; // should not be needed
>> +
>> +    LEVEL_DETAIL("DS9490_getstatus: readlen=%d\n", readlen);
>> +
>> +#ifdef __FreeBSD__ // Clear the Interrupt read buffer before trying to get 
>> status
>> +    char junk[1500] ;
>> +    if ( (ret=usb_bulk_read(usb,DS2490_EP1,(ASCII 
>> *)junk,(size_t)1500,TIMEOUT_USB)) < 0 ) {
>> +        STAT_ADD1_BUS(BUS_status_errors,pn->in);
>> +        LEVEL_DATA("DS9490_getstatus: error reading ret=%d\n", ret);
>> +        return -EIO ;
>> +    }
>> +#endif // __FreeBSD__
>>      do {
>>  #ifdef HAVE_USB_INTERRUPT_READ
>>          // Fix from Wim Heirman -- kernel 2.6 is fussier about endpoint type
>> @@ -597,7 +633,24 @@
>>              LEVEL_DATA("DS9490_getstatus: error reading ret=%d\n", ret);
>>              return -EIO ;
>>          }
>> +#ifdef OW_DEBUG
>> +        if (error_level>4) { // LEVEL_DETAIL
>> +            s[0] = '\0';
>> +            for (i = 0; i < ret; i++) {
>> +                sprintf(t,"-%02x",buffer[i]);
>> +                strcat(s,t);
>> +            }
>> +            LEVEL_DETAIL("DS9490_getstatus: Bytes%s\n", s);
>> +        }
>> +#endif
>>          if(ret > 16) {
>> +            if (ret == 32) { // FreeBSD buffers the input, so this could 
>> just be two readings
>> +                if (!memcmp(buffer, &buffer[16], 6)) {
>> +                    memmove(buffer, &buffer[16],16);
>> +                    ret = 16;
>> +                    LEVEL_DATA("DS9490_getstatus: Corrected buffer 32 byte 
>> read\n", s);
>> +                }
>> +            }
>>              for(i=16; i<ret; i++) {
>>                  BYTE val = buffer[i];
>>                  if(val != ONEWIREDEVICEDETECT) {
>> @@ -810,7 +863,7 @@
>>      //printf("DS9490_read\n");
>>      if ((ret=usb_bulk_read(usb,DS2490_EP3,(ASCII*)buf,(int)size,TIMEOUT_USB 
>> )) > 0) return ret ;
>>      LEVEL_DATA("DS9490_read: failed ret=%d\n", ret);
>> -    usb_clear_halt(usb,DS2490_EP3) ;
>> +    USB_CLEAR_HALT(usb,DS2490_EP3) ;
>>      STAT_ADD1_BUS(BUS_read_errors,pn->in) ;
>>      return ret ;
>>  }
>> @@ -821,7 +874,7 @@
>>      //printf("DS9490_write\n");
>>      if ((ret=usb_bulk_write(usb,DS2490_EP2,(const ASCII *)buf,(const 
>> int)size,TIMEOUT_USB )) > 0) return ret ;
>>      LEVEL_DATA("DS9490_write: failed ret=%d\n", ret);
>> -    usb_clear_halt(usb,DS2490_EP2) ;
>> +    USB_CLEAR_HALT(usb,DS2490_EP2) ;
>>      STAT_ADD1_BUS(BUS_write_errors,pn->in) ;
>>      return ret ;
>>  }
>>
>>
>> --- /home/robert/build/owfs-2.4p3/module/owlib/src/c/ow_net.c   Tue Jun  6 
>> 19:07:00 2006
>> +++ /home/robert/build/owfs-2.4p3.rob/module/owlib/src/c/ow_net.c       Sun 
>> Jul 23 11:23:41 2006
>> @@ -109,8 +109,11 @@
>>      memset( &hint, 0, sizeof(struct addrinfo) ) ;
>>      hint.ai_flags = AI_PASSIVE ;
>>      hint.ai_socktype = SOCK_STREAM ;
>> +#ifdef __FreeBSD__
>> +    hint.ai_family = AF_INET; // Until the code is fixed to bind to more 
>> than one protocol
>> +#else
>>      hint.ai_family = AF_UNSPEC ;
>> -
>> +#endif
>>      //printf("ServerAddr: [%s] [%s]\n", out->host, out->service);
>>
>>      if ( (ret=getaddrinfo( out->host, out->service, &hint, &out->ai )) ) {
>>
>>
>> --- /home/robert/build/owfs-2.4p3/module/owlib/src/c/ow_tree.c  Sun May 21 
>> 19:57:42 2006
>> +++ /home/robert/build/owfs-2.4p3.rob/module/owlib/src/c/ow_tree.c      Sun 
>> Jul 23 11:13:34 2006
>> @@ -33,8 +33,19 @@
>>
>>
>>  static void Device2Tree( const struct device * d, enum pn_type type ) {
>> -    tsearch( d, &Tree[type], device_compare ) ;
>> -    if (d->ft) qsort( d->ft,(size_t) d->nft,sizeof(struct 
>> filetype),file_compare ) ;
>> +       struct device *d_copy;
>> +
>> +    /*  In order for DeviceDestroy to work on FreeBSD we must copy the keys.
>> +        Otherwise, tdestroy will attempt to free implicitly allocated 
>> structures.
>> +    */
>> +
>> +       if ( (d_copy = (struct device *)malloc(sizeof(struct device))) ) {
>> +       memmove(d_copy, d, sizeof(struct device));
>> +        tsearch( d_copy, &Tree[type], device_compare ) ;
>> +        if (d_copy->ft) qsort( d_copy->ft,(size_t) 
>> d_copy->nft,sizeof(struct filetype),file_compare ) ;
>> +    } else {
>> +        LEVEL_DATA("Device2Tree:  Could not allocate memory for device 
>> %s\n",d->name);
>> +    }
>>  /*
>>  {
>>  int i ;
>>
>>
>> -------------------------------------------------------------------------
>> Take Surveys. Earn Cash. Influence the Future of IT
>> Join SourceForge.net's Techsay panel and you'll get the chance to share your
>> opinions on IT & business topics through brief surveys -- and earn cash
>> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
>> _______________________________________________
>> Owfs-developers mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/owfs-developers
>>
>
>-------------------------------------------------------------------------
>Take Surveys. Earn Cash. Influence the Future of IT
>Join SourceForge.net's Techsay panel and you'll get the chance to share your
>opinions on IT & business topics through brief surveys -- and earn cash
>http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
>_______________________________________________
>Owfs-developers mailing list
>[email protected]
>https://lists.sourceforge.net/lists/listinfo/owfs-developers
>
>

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Owfs-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/owfs-developers

Reply via email to