#include <string.h>
#include <sys/ioctl.h>
+#include <sys/socket.h>
#include <netinet/in.h>
#include <net/if.h>
#include <errno.h>
typedef struct SyncServiceResolverInfo SyncServiceResolverInfo;
typedef struct AsyncServiceResolverInfo AsyncServiceResolverInfo;
-#define MAX_CLIENTS 20
-#define MAX_OBJECTS_PER_CLIENT 50
-#define MAX_ENTRIES_PER_ENTRY_GROUP 20
+#define CLIENTS_MAX 256
+#define OBJECTS_PER_CLIENT_MAX 50
+#define ENTRIES_PER_ENTRY_GROUP_MAX 20
/* #define VALGRIND_WORKAROUND 1 */
if (!create)
return NULL;
- if (server->n_clients >= MAX_CLIENTS)
+ if (server->n_clients >= CLIENTS_MAX)
return NULL;
/* If not existant yet, create a new entry */
}
-static DBusHandlerResult msg_signal_filter_impl(DBusConnection *c, DBusMessage *m, void *userdata) {
+static DBusHandlerResult msg_signal_filter_impl(AVAHI_GCC_UNUSED DBusConnection *c, DBusMessage *m, void *userdata) {
DBusError error;
dbus_error_init(&error);
EntryGroupInfo *i = userdata;
DBusMessage *m;
int32_t t;
+ const char *e;
assert(s);
assert(g);
assert(i);
m = dbus_message_new_signal(i->path, AVAHI_DBUS_INTERFACE_ENTRY_GROUP, "StateChanged");
+
t = (int32_t) state;
- dbus_message_append_args(m, DBUS_TYPE_INT32, &t, DBUS_TYPE_INVALID);
+ if (state == AVAHI_ENTRY_GROUP_FAILURE)
+ e = avahi_error_number_to_dbus(avahi_server_errno(s));
+ else if (state == AVAHI_ENTRY_GROUP_COLLISION)
+ e = AVAHI_DBUS_ERR_COLLISION;
+ else
+ e = AVAHI_DBUS_ERR_OK;
+
+ dbus_message_append_args(
+ m,
+ DBUS_TYPE_INT32, &t,
+ DBUS_TYPE_STRING, &e,
+ DBUS_TYPE_INVALID);
dbus_message_set_destination(m, i->client->name);
dbus_connection_send(server->bus, m, NULL);
dbus_message_unref(m);
goto fail;
}
- if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= MAX_ENTRIES_PER_ENTRY_GROUP) {
+ if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= ENTRIES_PER_ENTRY_GROUP_MAX) {
avahi_string_list_free(strlst);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL);
}
goto fail;
}
- if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= MAX_ENTRIES_PER_ENTRY_GROUP)
+ if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= ENTRIES_PER_ENTRY_GROUP_MAX)
return respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL);
if (domain && !*domain)
goto fail;
}
- if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= MAX_ENTRIES_PER_ENTRY_GROUP)
+ if (!(flags & AVAHI_PUBLISH_UPDATE) && i->n_entries >= ENTRIES_PER_ENTRY_GROUP_MAX)
return respond_error(c, m, AVAHI_ERR_TOO_MANY_ENTRIES, NULL);
if (!(avahi_address_parse(address, AVAHI_PROTO_UNSPEC, &a)))
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
-static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, void *userdata) {
+static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, AVAHI_GCC_UNUSED void *userdata) {
DBusError error;
dbus_error_init(&error);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
}
- if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
}
return respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
}
- if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
}
return respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
}
- if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
}
return respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
}
- if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
}
}
- if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
}
}
- if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
}
return respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
}
- if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
avahi_log_warn("Too many objects for client '%s', client request failed.", client->name);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
}
return respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
}
- if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
}
return respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
}
- if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
}
return respond_error(c, m, AVAHI_ERR_TOO_MANY_CLIENTS, NULL);
}
- if (client->n_objects >= MAX_OBJECTS_PER_CLIENT) {
+ if (client->n_objects >= OBJECTS_PER_CLIENT_MAX) {
avahi_log_warn(__FILE__": Too many objects for client '%s', client request failed.", client->name);
return respond_error(c, m, AVAHI_ERR_TOO_MANY_OBJECTS, NULL);
}
void dbus_protocol_server_state_changed(AvahiServerState state) {
DBusMessage *m;
int32_t t;
+ const char *e;
if (!server)
return;
m = dbus_message_new_signal(AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "StateChanged");
t = (int32_t) state;
- dbus_message_append_args(m, DBUS_TYPE_INT32, &t, DBUS_TYPE_INVALID);
+
+ if (state == AVAHI_SERVER_COLLISION)
+ e = AVAHI_DBUS_ERR_COLLISION;
+ else if (state == AVAHI_SERVER_FAILURE)
+ e = avahi_error_number_to_dbus(avahi_server_errno(avahi_server));
+ else
+ e = AVAHI_DBUS_ERR_OK;
+
+ dbus_message_append_args(m, DBUS_TYPE_INT32, &t, DBUS_TYPE_STRING, &e, DBUS_TYPE_INVALID);
dbus_connection_send(server->bus, m, NULL);
dbus_message_unref(m);
}