diff --git a/service.go b/service.go index c54e991..17fc545 100644 --- a/service.go +++ b/service.go @@ -32,6 +32,10 @@ type ResolveAddressResult struct { Addresses []string `json:"addresses"` } +type ReverseLookupResult struct { + Names []string `json:"names"` +} + type Service struct { mu sync.RWMutex records map[string]NameRecords @@ -355,6 +359,14 @@ func (service *Service) Health() map[string]any { } } +func (service *Service) ResolveReverseNames(ip string) (ReverseLookupResult, bool) { + names, ok := service.ResolveReverse(ip) + if !ok { + return ReverseLookupResult{}, false + } + return ReverseLookupResult{Names: names}, true +} + func (service *Service) findRecord(name string) (NameRecords, bool) { service.mu.RLock() defer service.mu.RUnlock() diff --git a/service_test.go b/service_test.go index 7328195..0bc09bf 100644 --- a/service_test.go +++ b/service_test.go @@ -140,6 +140,24 @@ func TestServiceResolveReverseUsesARecords(t *testing.T) { } } +func TestServiceResolveReverseNamesReturnsNamedField(t *testing.T) { + service := NewService(ServiceOptions{ + Records: map[string]NameRecords{ + "gateway.charon.lthn": { + A: []string{"10.10.10.10"}, + }, + }, + }) + + result, ok := service.ResolveReverseNames("10.10.10.10") + if !ok { + t.Fatal("expected named reverse result") + } + if len(result.Names) != 1 || result.Names[0] != "gateway.charon.lthn" { + t.Fatalf("unexpected reverse names result: %#v", result) + } +} + func TestServiceResolveReverseFallsBackToFalseWhenUnknown(t *testing.T) { service := NewService(ServiceOptions{ Records: map[string]NameRecords{