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_AppleRegistration_AddRecord( JNIEnv *pEnv, jobject pThis, jint flags, jint rrType, jbyteArray rData, jint ttl, jobject destObj) { jclass cls = (*pEnv)->GetObjectClass( pEnv, pThis); jfieldID contextField = (*pEnv)->GetFieldID( pEnv, cls, "fNativeContext", "J"); jclass destCls = (*pEnv)->GetObjectClass( pEnv, destObj); jfieldID recField = (*pEnv)->GetFieldID( pEnv, destCls, "fRecord", "J"); OpContext *pContext = NULL; DNSServiceErrorType err = kDNSServiceErr_NoError; jbyte *pBytes; jsize numBytes; DNSRecordRef recRef; if ( contextField != 0) pContext = (OpContext*) (long) (*pEnv)->GetLongField(pEnv, pThis, contextField); if ( pContext == NULL || pContext->ServiceRef == NULL) return kDNSServiceErr_BadParam; pBytes = (*pEnv)->GetByteArrayElements( pEnv, rData, NULL); numBytes = (*pEnv)->GetArrayLength( pEnv, rData); err = DNSServiceAddRecord( pContext->ServiceRef, &recRef, flags, rrType, numBytes, pBytes, ttl); if ( err == kDNSServiceErr_NoError) { (*pEnv)->SetLongField(pEnv, destObj, recField, (long) recRef); } if ( pBytes != NULL) (*pEnv)->ReleaseByteArrayElements( pEnv, rData, pBytes, 0); return err; }
static VALUE dnssd_service_add_record(VALUE self, VALUE _flags, VALUE _rrtype, VALUE _rdata, VALUE _ttl) { VALUE _record = Qnil; DNSServiceRef *client; DNSRecordRef *record; DNSServiceFlags flags; DNSServiceErrorType e; uint16_t rrtype; uint16_t rdlen; const void *rdata; uint32_t ttl; _rdata = rb_str_to_str(_rdata); flags = (DNSServiceFlags)NUM2ULONG(_flags); rrtype = NUM2UINT(_rrtype); rdlen = RSTRING_LEN(_rdata); rdata = (void *)RSTRING_PTR(_rdata); ttl = (uint32_t)NUM2ULONG(_ttl); get(cDNSSDService, self, DNSServiceRef, client); _record = rb_class_new_instance(0, NULL, cDNSSDRecord); get(cDNSSDRecord, _record, DNSRecordRef, record); e = DNSServiceAddRecord(*client, record, flags, rrtype, rdlen, rdata, ttl); dnssd_check_error_code(e); /* record will become invalid when this service is destroyed */ rb_ivar_set(_record, dnssd_iv_service, self); rb_ary_push(rb_ivar_get(self, dnssd_iv_records), _record); return _record; }