/* Sent back from Bounjour -- arbitrarily use it to set the Ref for Deallocation */ static void BrowseBack(DNSServiceRef s, DNSServiceFlags f, uint32_t i, DNSServiceErrorType e, const char *name, const char *type, const char *domain, void *context) { struct BrowseStruct *browse_struct; (void) context; LEVEL_DETAIL("ref=%ld flags=%d index=%d, error=%d name=%s type=%s domain=%s", (long int) s, f, i, e, name, type, domain); if (e != kDNSServiceErr_NoError) { return ; } browse_struct = Browse_Struct_Create( name, type, domain ) ; if (f & kDNSServiceFlagsAdd) { // Add DNSServiceRef sr; if (DNSServiceResolve(&sr, 0, 0, name, type, domain, ResolveBack, (void *)browse_struct) == kDNSServiceErr_NoError) { ResolveWait(sr) ; DNSServiceRefDeallocate(sr); } else { Browse_Struct_Destroy(browse_struct) ; } } else { // Remove Browse_Struct_Destroy(browse_struct) ; ZeroDel( name, type, domain ) ; } }
static void ResolveBack(DNSServiceRef s, DNSServiceFlags f, uint32_t i, DNSServiceErrorType e, const char *n, const char *host, uint16_t port, uint16_t tl, const unsigned char *t, void *c) { struct BrowseStruct *browse_struct = c; char service[11] ; int sn_ret ; (void) tl; (void) t; UCLIBCLOCK ; sn_ret = snprintf(service, 10, "%d", ntohs(port) ) ; UCLIBCUNLOCK ; LEVEL_DETAIL("ref=%d flags=%d index=%d, error=%d name=%s host=%s port=%d", (long int) s, f, i, e, n, host, ntohs(port)); /* remove trailing .local. */ if ( sn_ret >-1 ) { LEVEL_DETAIL("ref=%d flags=%d index=%d, error=%d name=%s host=%s port=%s", (long int) s, f, i, e, n, host, service); ZeroAdd( browse_struct->name, browse_struct->type, browse_struct->domain, host, service ) ; } else { LEVEL_DEBUG("Couldn't translate port %d",ntohs(port) ) ; } Browse_Struct_Destroy(browse_struct); }
// Standard Data via GET void ChangeData(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); ASCII *value_string = OWQ_buffer(owq); /* Do command processing and make changes to 1-wire devices */ LEVEL_DETAIL("New data path=%s value=%s", pn->path, value_string); switch (pn->selected_filetype->format) { case ft_binary: hex_only(value_string); OWQ_size(owq) = hex_convert(value_string); break; default: OWQ_size(owq) = strlen(value_string); break; } FS_write_postparse(owq); }
/* Sent back from Bonjour -- arbitrarily use it to set the Ref for Deallocation */ static void RegisterBack(DNSServiceRef s, DNSServiceFlags f, DNSServiceErrorType e, const char *name, const char *type, const char *domain, void *v) { struct connection_out * out = v ; LEVEL_DETAIL ("RegisterBack ref=%d flags=%d error=%d name=%s type=%s domain=%s", s, f, e, SAFESTRING(name), SAFESTRING(type), SAFESTRING(domain)); if (e != kDNSServiceErr_NoError) { return ; } out->sref0 = s; SAFEFREE( out->zero.name ) ; out->zero.name = owstrdup(name) ; SAFEFREE( out->zero.type ) ; out->zero.type = owstrdup(type) ; SAFEFREE( out->zero.domain ) ; out->zero.domain = owstrdup(domain) ; }
/* Check if device exists -- >=0 yes, -1 no */ INDEX_OR_ERROR CheckPresence(struct parsedname *pn) { INDEX_OR_ERROR bus_nr; if (NotRealDir(pn)) { return INDEX_DEFAULT; } if ((pn->selected_device == DeviceSimultaneous) || (pn->selected_device == DeviceThermostat)) { return INDEX_DEFAULT; } /* If set, already found bus. */ /* Use UnsetKnownBus to clear and allow a new search */ if (KnownBus(pn)) { return pn->known_bus->index; } if ( GOOD( Cache_Get_Device(&bus_nr, pn)) ) { LEVEL_DEBUG("Found device on bus %d",bus_nr); SetKnownBus(bus_nr, pn); return bus_nr; } LEVEL_DETAIL("Checking presence of %s", SAFESTRING(pn->path)); bus_nr = CheckPresence_low(pn); // check only allocated inbound connections if ( INDEX_VALID(bus_nr) ) { SetKnownBus(bus_nr, pn); Cache_Add_Device( bus_nr, pn->sn ) ; return bus_nr; } UnsetKnownBus(pn); return INDEX_BAD; }
// POST data -- a file upload void PostData(struct one_wire_query *owq) { /* Do command processing and make changes to 1-wire devices */ LEVEL_DETAIL("Uploaded Data path=%s size=%ld", PN(owq)->path, OWQ_size(owq)); FS_write_postparse(owq); }