int do_smb_browse(void) { int mdnsfd; int fdsetsz; int ret; struct mdns_browse_state bstate; struct mdns_smbsrv_result *resptr; struct timeval tv; DNSServiceRef mdns_conn_sdref = NULL; DNSServiceErrorType err; TALLOC_CTX * ctx = talloc_stackframe(); ZERO_STRUCT(bstate); err = DNSServiceBrowse(&mdns_conn_sdref, 0, 0, "_smb._tcp", "", do_smb_browse_reply, &bstate); if (err != kDNSServiceErr_NoError) { d_printf("Error connecting to the Multicast DNS daemon\n"); TALLOC_FREE(ctx); return 1; } mdnsfd = DNSServiceRefSockFD(mdns_conn_sdref); for (;;) { int revents; ret = poll_one_fd(mdnsfd, POLLIN|POLLHUP, 1000, &revents); if (ret <= 0 && errno != EINTR) { break; } if (revents & (POLLIN|POLLHUP|POLLERR)) { /* Invoke callback function */ if (DNSServiceProcessResult(mdns_conn_sdref)) { break; } if (bstate.browseDone) { break; } } } DNSServiceRefDeallocate(mdns_conn_sdref); if (bstate.listhead != NULL) { resptr = bstate.listhead; while (resptr != NULL) { struct mdns_smbsrv_result *oldresptr; oldresptr = resptr; /* Resolve smb service instance */ do_smb_resolve(resptr); resptr = resptr->nextResult; } } TALLOC_FREE(ctx); return 0; }
int do_smb_browse(void) { int mdnsfd; int fdsetsz; int ret; fd_set *fdset = NULL; struct mdns_browse_state bstate; struct mdns_smbsrv_result *resptr; struct timeval tv; DNSServiceRef mdns_conn_sdref = NULL; DNSServiceErrorType err; TALLOC_CTX * ctx = talloc_stackframe(); ZERO_STRUCT(bstate); err = DNSServiceBrowse(&mdns_conn_sdref, 0, 0, "_smb._tcp", "", do_smb_browse_reply, &bstate); if (err != kDNSServiceErr_NoError) { d_printf("Error connecting to the Multicast DNS daemon\n"); TALLOC_FREE(ctx); return 1; } mdnsfd = DNSServiceRefSockFD(mdns_conn_sdref); for (;;) { if (fdset != NULL) { TALLOC_FREE(fdset); } fdsetsz = howmany(mdnsfd + 1, NFDBITS) * sizeof(fd_mask); fdset = TALLOC_ZERO(ctx, fdsetsz); FD_SET(mdnsfd, fdset); tv.tv_sec = 1; tv.tv_usec = 0; /* Wait until response received from mDNS daemon */ ret = sys_select(mdnsfd + 1, fdset, NULL, NULL, &tv); if (ret <= 0 && errno != EINTR) { break; } if (FD_ISSET(mdnsfd, fdset)) { /* Invoke callback function */ if (DNSServiceProcessResult(mdns_conn_sdref)) { break; } if (bstate.browseDone) { break; } } } DNSServiceRefDeallocate(mdns_conn_sdref); if (bstate.listhead != NULL) { resptr = bstate.listhead; while (resptr != NULL) { struct mdns_smbsrv_result *oldresptr; oldresptr = resptr; /* Resolve smb service instance */ do_smb_resolve(resptr); resptr = resptr->nextResult; } } TALLOC_FREE(ctx); return 0; }