#include <string.h>
+#include <avahi-common/domain.h>
#include "browse.h"
-#include "util.h"
+#include "timeval.h"
struct AvahiServiceResolver {
AvahiServer *server;
gchar *service_name;
gchar *service_type;
gchar *domain_name;
- guchar address_protocol;
+ AvahiProtocol address_protocol;
- gint interface;
- guchar protocol;
+ AvahiIfIndex interface;
+ AvahiProtocol protocol;
AvahiRecordBrowser *record_browser_srv;
AvahiRecordBrowser *record_browser_txt;
g_assert(FALSE);
}
- snprintf(sn, sizeof(sn), r->service_name);
- snprintf(st, sizeof(st), r->service_type);
+ g_snprintf(sn, sizeof(sn), r->service_name);
+ g_snprintf(st, sizeof(st), r->service_type);
if ((i = strlen(sn)) > 0 && sn[i-1] == '.')
sn[i-1] = 0;
}
}
-static void record_browser_callback(AvahiRecordBrowser*rr, gint interface, guchar protocol, AvahiBrowserEvent event, AvahiRecord *record, gpointer userdata) {
+static void record_browser_callback(AvahiRecordBrowser*rr, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, AvahiRecord *record, gpointer userdata) {
AvahiServiceResolver *r = userdata;
g_assert(rr);
finish(r, AVAHI_RESOLVER_TIMEOUT);
}
-AvahiServiceResolver *avahi_service_resolver_new(AvahiServer *server, gint interface, guchar protocol, const gchar *name, const gchar *type, const gchar *domain, guchar aprotocol, AvahiServiceResolverCallback callback, gpointer userdata) {
+AvahiServiceResolver *avahi_service_resolver_new(AvahiServer *server, AvahiIfIndex interface, AvahiProtocol protocol, const gchar *name, const gchar *type, const gchar *domain, AvahiProtocol aprotocol, AvahiServiceResolverCallback callback, gpointer userdata) {
AvahiServiceResolver *r;
AvahiKey *k;
- GTimeVal tv;
+ struct timeval tv;
gchar t[256], *n;
size_t l;
g_assert(aprotocol == AVAHI_PROTO_UNSPEC || aprotocol == AVAHI_PROTO_INET || aprotocol == AVAHI_PROTO_INET6);
+ if (!avahi_valid_service_name(name)) {
+ avahi_server_set_errno(server, AVAHI_ERR_INVALID_SERVICE_NAME);
+ return NULL;
+ }
+
+ if (!avahi_valid_service_type(type)) {
+ avahi_server_set_errno(server, AVAHI_ERR_INVALID_SERVICE_TYPE);
+ return NULL;
+ }
+
+ if (!avahi_valid_domain_name(domain)) {
+ avahi_server_set_errno(server, AVAHI_ERR_INVALID_DOMAIN_NAME);
+ return NULL;
+ }
+
r = g_new(AvahiServiceResolver, 1);
r->server = server;
- r->service_name = avahi_normalize_name(name);
+ r->service_name = g_strdup(name);
r->service_type = avahi_normalize_name(type);
r->domain_name = avahi_normalize_name(domain);
r->callback = callback;
n = t;
l = sizeof(t);
- avahi_escape_label((guint8*) name, strlen(name), &n, &l);
- snprintf(n, l, ".%s%s", r->service_type, r->domain_name);
+ avahi_escape_label((const guint8*) name, strlen(name), &n, &l);
+ g_snprintf(n, l, ".%s.%s", r->service_type, r->domain_name);
avahi_elapse_time(&tv, 1000, 0);
r->time_event = avahi_time_event_queue_add(server->time_event_queue, &tv, time_event_callback, r);
r->record_browser_srv = avahi_record_browser_new(server, interface, protocol, k, record_browser_callback, r);
avahi_key_unref(k);
+ if (!r->record_browser_srv) {
+ avahi_service_resolver_free(r);
+ return NULL;
+ }
+
k = avahi_key_new(t, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_TXT);
r->record_browser_txt = avahi_record_browser_new(server, interface, protocol, k, record_browser_callback, r);
avahi_key_unref(k);
-
+
+ if (!r->record_browser_txt) {
+ avahi_service_resolver_free(r);
+ return NULL;
+ }
+
return r;
}