diff options
| author | Lennart Poettering <lennart@poettering.net> | 2005-09-10 02:20:51 +0000 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2005-09-10 02:20:51 +0000 | 
| commit | 30f94fc47685900079f23c936668bf904beae05f (patch) | |
| tree | a4822de1c4774ab827f716e97871955731c23901 | |
| parent | 02e302dc116e359471aee1d9fb4f99fc0d442f24 (diff) | |
add new public function avahi_server_is_service_local()
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@561 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
| -rw-r--r-- | avahi-core/core.h | 3 | ||||
| -rw-r--r-- | avahi-core/server.c | 66 | 
2 files changed, 69 insertions, 0 deletions
diff --git a/avahi-core/core.h b/avahi-core/core.h index 427a09a..abc30c0 100644 --- a/avahi-core/core.h +++ b/avahi-core/core.h @@ -568,6 +568,9 @@ int avahi_server_errno(AvahiServer *s);  /** Return the local service cookie */  uint32_t avahi_server_get_local_service_cookie(AvahiServer *s); +/** Return 1 if there is a local service with the specified credentials registeresd. Return 0 if not, negative on failure */ +int avahi_server_is_service_local(AvahiServer *s, AvahiIfIndex, AvahiProtocol protocol, const char *name, const char *type,  const char*domain); +  #ifndef DOXYGEN_SHOULD_SKIP_THIS  AVAHI_C_DECL_END  #endif diff --git a/avahi-core/server.c b/avahi-core/server.c index 625af50..11deb24 100644 --- a/avahi-core/server.c +++ b/avahi-core/server.c @@ -2464,3 +2464,69 @@ uint32_t avahi_server_get_local_service_cookie(AvahiServer *s) {      return s->local_service_cookie;  } + +int avahi_server_is_service_local(AvahiServer *s, AvahiIfIndex interface, AvahiProtocol protocol, const char *name, const char *type, const char*domain) { +    AvahiKey *key = NULL; +    char *d, *t; +    char ename[64], n[256]; +    int ret; +    AvahiEntry *e; +     +    assert(s); +    assert(name); +    assert(type); +    assert(domain); + +    if (!avahi_is_valid_service_name(name)) +        return avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_NAME); + +    if (!avahi_is_valid_service_type(type)) +        return avahi_server_set_errno(s, AVAHI_ERR_INVALID_SERVICE_TYPE); + +    if (domain && !avahi_is_valid_domain_name(domain)) +        return avahi_server_set_errno(s, AVAHI_ERR_INVALID_DOMAIN_NAME); + +    escape_service_name(ename, sizeof(ename), name); +     +    if (!(d = avahi_normalize_name(domain)) || +        !(t = avahi_normalize_name(type))) { +        ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY); +        goto fail; +    } +    snprintf(n, sizeof(n), "%s.%s.%s", ename, t, d); +     +    if (!(key = avahi_key_new(n, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_SRV))) { +        ret = avahi_server_set_errno(s, AVAHI_ERR_NO_MEMORY); +        goto fail; +    } + +    ret = 0; +     +    for (e = avahi_hashmap_lookup(s->entries_by_key, key); e; e = e->by_key_next) { + +        if ((e->interface == interface || e->interface <= 0 || interface <= 0) && +            (e->protocol == protocol || e->protocol == AVAHI_PROTO_UNSPEC || protocol == AVAHI_PROTO_UNSPEC)) { +            ret = 1; +            break; +        } +    } +     +    avahi_key_unref(key); +     +    avahi_free(d); +    avahi_free(t); + +    return ret; +     +fail: +    if (d) +        avahi_free(d); + +    if (t) +        avahi_free(t); + +    if (key) +        avahi_key_unref(key); + +    return ret; +}  | 
