static void myTimerCallBack(void) { DNSServiceErrorType err = kDNSServiceErr_Unknown; switch (operation) { case 'A': { switch (addtest) { case 0: printf("Adding Test HINFO record\n"); err = DNSServiceAddRecord(client, &record, 0, kDNSServiceType_HINFO, sizeof(myhinfoW), &myhinfoW[0], 0); addtest = 1; break; case 1: printf("Updating Test HINFO record\n"); err = DNSServiceUpdateRecord(client, record, 0, sizeof(myhinfoX), &myhinfoX[0], 0); addtest = 2; break; case 2: printf("Removing Test HINFO record\n"); err = DNSServiceRemoveRecord(client, record, 0); addtest = 0; break; } } break; case 'U': { if (updatetest[1] != 'Z') updatetest[1]++; else updatetest[1] = 'A'; updatetest[0] = 3 - updatetest[0]; updatetest[2] = updatetest[1]; printf("Updating Test TXT record to %c\n", updatetest[1]); err = DNSServiceUpdateRecord(client, NULL, 0, 1+updatetest[0], &updatetest[0], 0); } break; case 'N': { printf("Adding big NULL record\n"); err = DNSServiceAddRecord(client, &record, 0, kDNSServiceType_NULL, sizeof(bigNULL), &bigNULL[0], 0); timeOut = LONG_TIME; } break; } if (err != kDNSServiceErr_NoError) { fprintf(stderr, "DNSService call failed %ld\n", (long int)err); stopNow = 1; } }
JNIEXPORT jint JNICALL Java_com_apple_dnssd_AppleDNSRecord_Update( JNIEnv *pEnv, jobject pThis, jint flags, jbyteArray rData, jint ttl) { jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis); jfieldID ownerField = (*pEnv)->GetFieldID( pEnv, cls, "fOwner", "Lcom/apple/dnssd/AppleService;"); jfieldID recField = (*pEnv)->GetFieldID( pEnv, cls, "fRecord", "J"); OpContext *pContext = NULL; DNSServiceErrorType err = kDNSServiceErr_NoError; jbyte *pBytes; jsize numBytes; DNSRecordRef recRef = NULL; if ( ownerField != 0) { jobject ownerObj = (*pEnv)->GetObjectField( pEnv, pThis, ownerField); jclass ownerClass = (*pEnv)->GetObjectClass( pEnv, ownerObj); jfieldID contextField = (*pEnv)->GetFieldID( pEnv, ownerClass, "fNativeContext", "J"); if ( contextField != 0) pContext = (OpContext*) (long) (*pEnv)->GetLongField(pEnv, ownerObj, contextField); } if ( recField != 0) recRef = (DNSRecordRef) (long) (*pEnv)->GetLongField(pEnv, pThis, recField); if ( pContext == NULL || pContext->ServiceRef == NULL) return kDNSServiceErr_BadParam; pBytes = (*pEnv)->GetByteArrayElements( pEnv, rData, NULL); numBytes = (*pEnv)->GetArrayLength( pEnv, rData); err = DNSServiceUpdateRecord( pContext->ServiceRef, recRef, flags, numBytes, pBytes, ttl); if ( pBytes != NULL) (*pEnv)->ReleaseByteArrayElements( pEnv, rData, pBytes, 0); return err; }
static VALUE dnssd_service_update_record(VALUE self, VALUE _record, VALUE _flags, VALUE _rdata, VALUE _ttl) { DNSServiceRef *client; DNSRecordRef primaryRec = NULL; DNSRecordRef *record; DNSServiceFlags flags; DNSServiceErrorType e; uint16_t rdlen; const void *rdata; uint32_t ttl; _rdata = rb_str_to_str(_rdata); flags = (DNSServiceFlags)NUM2ULONG(_flags); rdlen = RSTRING_LEN(_rdata); rdata = (void *)RSTRING_PTR(_rdata); ttl = (uint32_t)NUM2ULONG(_ttl); if (!NIL_P(_record)) { get(cDNSSDRecord, _record, DNSRecordRef, record); } else { record = &primaryRec; } get(cDNSSDService, self, DNSServiceRef, client); e = DNSServiceUpdateRecord(*client, *record, flags, rdlen, rdata, ttl); dnssd_check_error_code(e); return self; }
void updateRecord_() { if( !service_ ) return; TXTRecordRef record; createTXTRecord_( record ); const DNSServiceErrorType error = DNSServiceUpdateRecord( service_, 0, 0, TXTRecordGetLength( &record ), TXTRecordGetBytesPtr( &record ), -1 ); TXTRecordDeallocate( &record ); if( error != kDNSServiceErr_NoError ) LBWARN << "DNSServiceUpdateRecord error: " << error << std::endl; }
bool CZeroconfMDNS::doForceReAnnounceService(const std::string& fcr_identifier) { bool ret = false; CSingleLock lock(m_data_guard); tServiceMap::iterator it = m_services.find(fcr_identifier); if(it != m_services.end()) { // for force announcing a service with mdns we need // to change a txt record - so we diddle between // even and odd dummy records here if ( (it->second.updateNumber % 2) == 0) TXTRecordSetValue(&it->second.txtRecordRef, "xbmcdummy", strlen("evendummy"), "evendummy"); else TXTRecordSetValue(&it->second.txtRecordRef, "xbmcdummy", strlen("odddummy"), "odddummy"); it->second.updateNumber++; if (DNSServiceUpdateRecord(it->second.serviceRef, NULL, 0, TXTRecordGetLength(&it->second.txtRecordRef), TXTRecordGetBytesPtr(&it->second.txtRecordRef), 0) == kDNSServiceErr_NoError) ret = true; } return ret; }