13 #ifdef HAVE_DNSREGISTRATION
14 #include <DNSServiceDiscovery/DNSServiceDiscovery.h>
21 extern struct program_state ps ;
23 #ifdef HAVE_DNSREGISTRATION
24 static void mdns_callback(DNSServiceRegistrationReplyErrorType err, void *d)
31 static sw_result howl_callback(sw_discovery discovery, sw_discovery_oid oid, sw_discovery_publish_status status, sw_opaque extra) {
33 const char *name = NULL;
35 for ( u = 0 ; u < pset_count( SERVICES( ps ) ) ; u++ ) {
37 struct service_config *scp;
39 sp = SP( pset_pointer( SERVICES( ps ), u ) ) ;
41 if( scp->mdns_state && (*(sw_discovery_oid *)scp->mdns_state == oid) ) {
46 msg(LOG_DEBUG, "howl_callback", "callback status: %d for service %s (oid: %d)", status, name, oid);
52 int xinetd_mdns_deregister(struct service_config *scp) {
53 if( (!scp) || (scp->mdns_state == NULL) )
57 msg(LOG_DEBUG, "xinetd_mdns_deregister", "Deregistering service: %s", SC_ID(scp));
59 #ifdef HAVE_DNSREGISTRATION
60 DNSServiceDiscoveryDeallocate( (dns_service_discovery_ref)scp->mdns_state );
65 if( !ps.rws.mdns_state ) return 0;
66 if( sw_discovery_cancel(*(sw_discovery *)ps.rws.mdns_state, *(sw_discovery_oid *)scp->mdns_state) != SW_OKAY )
72 int xinetd_mdns_register(struct service_config *scp) {
73 if( ps.rws.mdns_state == NULL )
75 xinetd_mdns_deregister(scp);
77 if( SC_MDNS_NAME(scp) )
78 free(SC_MDNS_NAME(scp));
79 if( asprintf(&SC_MDNS_NAME(scp), "_%s._%s", SC_NAME(scp), SC_PROTONAME(scp)) < 0 )
83 msg(LOG_DEBUG, "xinetd_mdns_register", "Registering service: %s (%s)", SC_MDNS_NAME(scp), SC_ID(scp));
85 #ifdef HAVE_DNSREGISTRATION
86 scp->mdns_state = DNSServiceRegistrationCreate("", SC_MDNS_NAME(scp), "", htons(SC_PORT(scp)), "", mdns_callback, NULL);
90 sw_discovery_publish(*(sw_discovery *)ps.rws.mdns_state, 0, SC_ID(scp), SC_MDNS_NAME(scp), NULL, NULL, SC_PORT(scp), NULL, 0, howl_callback, NULL, (sw_discovery_oid *)scp->mdns_state);
97 int xinetd_mdns_init(void) {
98 #ifdef HAVE_DNSREGISTRATION
99 ps.rws.mdns_state = (char *)1;
104 ps.rws.mdns_state = malloc(sizeof(sw_discovery));
105 if( !ps.rws.mdns_state )
107 if( sw_discovery_init(ps.rws.mdns_state) != SW_OKAY ) {
108 free(ps.rws.mdns_state);
109 ps.rws.mdns_state = NULL;
112 FD_SET( sw_discovery_socket(*(sw_discovery *)ps.rws.mdns_state), &ps.rws.socket_mask ) ;
117 int xinetd_mdns_svc_init(struct service_config *scp) {
118 #ifdef HAVE_DNSREGISTRATION
119 // scp->mdns_state = malloc(sizeof(dns_service_discovery_ref));
123 scp->mdns_state = malloc(sizeof(sw_discovery_oid));
126 if( !scp->mdns_state )
131 int xinetd_mdns_svc_free(struct service_config *scp) {
132 #ifndef HAVE_DNSREGISTRATION
134 free(scp->mdns_state);
135 scp->mdns_state = NULL;
140 int xinetd_mdns_poll(void) {
142 if( sw_discovery_read_socket(*(sw_discovery *)ps.rws.mdns_state) == SW_OKAY )
147 #endif /* HAVE_MDNS */