Update of /cvsroot/playerstage/code/player/libplayersd
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15009

Modified Files:
        playersd.h playersd_mdns.c 
Log Message:


Index: playersd_mdns.c
===================================================================
RCS file: /cvsroot/playerstage/code/player/libplayersd/playersd_mdns.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** playersd_mdns.c     25 Sep 2007 20:41:08 -0000      1.2
--- playersd_mdns.c     25 Sep 2007 21:00:33 -0000      1.3
***************
*** 45,48 ****
--- 45,51 ----
  #include <assert.h>
  #include <stdio.h>
+ #include <errno.h>
+ 
+ #include <sys/poll.h>
  
  #include <dns_sd.h>
***************
*** 145,149 ****
  player_sd_register(player_sd_t* sd, 
                     const char* name, 
!                    player_devaddr_t addr)
  {
    DNSServiceErrorType sdErr;
--- 148,153 ----
  player_sd_register(player_sd_t* sd, 
                     const char* name, 
!                    player_devaddr_t addr,
!                    int timeout)
  {
    DNSServiceErrorType sdErr;
***************
*** 153,156 ****
--- 157,162 ----
    player_sd_mdns_dev_t* dev;
    char nameBuf[PLAYER_SD_NAME_MAXLEN];
+   struct pollfd ufds[1];
+   int numready;
  
    // Find a spot for this device
***************
*** 200,207 ****
    sdErr = kDNSServiceErr_NameConflict;
  
    while(sdErr == kDNSServiceErr_NameConflict)
    {
      sdErr = DNSServiceRegister(&(dev->regRef), 
!                                0,
                                 0,
                                 nameBuf,
--- 206,214 ----
    sdErr = kDNSServiceErr_NameConflict;
  
+   // Avahi can return the kDNSServiceErr_NameConflict immediately.
    while(sdErr == kDNSServiceErr_NameConflict)
    {
      sdErr = DNSServiceRegister(&(dev->regRef), 
!                                kDNSServiceFlagsNoAutoRename,
                                 0,
                                 nameBuf,
***************
*** 224,227 ****
--- 231,263 ----
    }
  
+   // mDNSResponder will return the kDNSServiceErr_NameConflict by callback.
+   // Unfortunately, Avahi never invokes our callback (!).  So we poll
+   // with timeout.
+   while(!dev->valid && !dev->fail)
+   {
+     ufds[0].fd = DNSServiceRefSockFD(dev->regRef);
+     ufds[0].events = POLLIN;
+     if((numready = poll(ufds,1,timeout)) < 0)
+     {
+       if(errno == EAGAIN)
+         continue;
+       else
+       {
+         PLAYER_ERROR1("poll returned error: %s\n", strerror(errno));
+         DNSServiceRefDeallocate(dev->regRef);
+         return(-1);
+       }
+     }
+     else if(numready > 0)
+     {
+       DNSServiceProcessResult(dev->regRef);
+     }
+     else
+     {
+       // Timed out.  Not necessarily an error.
+       break;
+     }
+   }
+ 
    if(sdErr != kDNSServiceErr_NoError)
    {
***************
*** 229,232 ****
--- 265,274 ----
      return(-1);
    }
+ 
+   if(dev->fail)
+   {
+     PLAYER_ERROR1("Registration of %s failed", name);
+     return(-1);
+   }
    else
    {
***************
*** 248,261 ****
             void *context)
  {
-   // It seems that Avahi returns the NameConflict immediately from
-   // DNSServiceRegister(), and that mDNSResponder never complains about it,
-   // even in the callback (!).  However, we have to keep this callback
-   // defined, because Avahi will abort if we pass NULL.
- #if 0
    DNSServiceErrorType sdErr;
    player_sd_mdns_dev_t* dev = (player_sd_mdns_dev_t*)context;
  
!   puts("registerCB");
! 
    if(errorCode == kDNSServiceErr_NoError)
    {
--- 290,298 ----
             void *context)
  {
    DNSServiceErrorType sdErr;
    player_sd_mdns_dev_t* dev = (player_sd_mdns_dev_t*)context;
+   char nameBuf[PLAYER_SD_NAME_MAXLEN];
  
!   printf("registerCB: %d\n", errorCode);
    if(errorCode == kDNSServiceErr_NoError)
    {
***************
*** 298,301 ****
      dev->fail = 1;
    }
- #endif
  }
--- 335,337 ----

Index: playersd.h
===================================================================
RCS file: /cvsroot/playerstage/code/player/libplayersd/playersd.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** playersd.h  25 Sep 2007 19:59:05 -0000      1.2
--- playersd.h  25 Sep 2007 21:00:33 -0000      1.3
***************
*** 84,88 ****
  int player_sd_register(player_sd_t* sd, 
                         const char* name, 
!                        player_devaddr_t addr);
  
  // Unregister (terminate) the named device.  Returns 0 on success, non-zero 
--- 84,89 ----
  int player_sd_register(player_sd_t* sd, 
                         const char* name, 
!                        player_devaddr_t addr,
!                        int timeout);
  
  // Unregister (terminate) the named device.  Returns 0 on success, non-zero 


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to