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