X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-daemon%2Fdbus-protocol.c;h=b6a4e5d22473b00df66a2a723084d631037ec9af;hb=f17d2832301b0f2fcd50fdcc6fec77666178158f;hp=76111562d217d6864e4ab74bd72e5aada480ac06;hpb=6b391bb81f0dce0193a722254016b26c12a17643;p=catta diff --git a/avahi-daemon/dbus-protocol.c b/avahi-daemon/dbus-protocol.c index 7611156..b6a4e5d 100644 --- a/avahi-daemon/dbus-protocol.c +++ b/avahi-daemon/dbus-protocol.c @@ -25,6 +25,8 @@ #include #include +#include +#include #include #include #include @@ -66,7 +68,7 @@ typedef struct ServiceBrowserInfo ServiceBrowserInfo; typedef struct SyncServiceResolverInfo SyncServiceResolverInfo; typedef struct AsyncServiceResolverInfo AsyncServiceResolverInfo; -#define MAX_CLIENTS 20 +#define MAX_CLIENTS 256 #define MAX_OBJECTS_PER_CLIENT 50 #define MAX_ENTRIES_PER_ENTRY_GROUP 20 @@ -684,14 +686,27 @@ static void entry_group_callback(AvahiServer *s, AvahiSEntryGroup *g, AvahiEntry 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); @@ -1790,7 +1805,8 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, void } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_SERVER, "GetNetworkInterfaceNameByIndex")) { int32_t idx; int fd; - struct ifreq ifr; + char name[IF_NAMESIZE]; + if (!(dbus_message_get_args(m, &error, DBUS_TYPE_INT32, &idx, DBUS_TYPE_INVALID))) { avahi_log_warn("Error parsing Server::GetNetworkInterfaceNameByIndex message"); @@ -1808,10 +1824,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, void return respond_error(c, m, AVAHI_ERR_OS, txt); } - memset(&ifr, 0, sizeof(ifr)); - ifr.ifr_ifindex = idx; - - if (ioctl(fd, SIOCGIFNAME, &ifr) < 0) { + if ((!if_indextoname(idx, name))) { char txt[256]; snprintf(txt, sizeof(txt), "OS Error: %s", strerror(errno)); close(fd); @@ -1820,13 +1833,13 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, void close(fd); - return respond_string(c, m, ifr.ifr_name); + return respond_string(c, m, name); #endif } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_SERVER, "GetNetworkInterfaceIndexByName")) { char *n; int fd; - struct ifreq ifr; + int32_t idx; if (!(dbus_message_get_args(m, &error, DBUS_TYPE_STRING, &n, DBUS_TYPE_INVALID)) || !n) { avahi_log_warn("Error parsing Server::GetNetworkInterfaceIndexByName message"); @@ -1843,10 +1856,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, void return respond_error(c, m, AVAHI_ERR_OS, txt); } - memset(&ifr, 0, sizeof(ifr)); - snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", n); - - if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0) { + if (!(idx = if_nametoindex(n))) { char txt[256]; snprintf(txt, sizeof(txt), "OS Error: %s", strerror(errno)); close(fd); @@ -1855,7 +1865,7 @@ static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, void close(fd); - return respond_int32(c, m, ifr.ifr_ifindex); + return respond_int32(c, m, idx); #endif } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_SERVER, "GetAlternativeHostName")) { @@ -2414,12 +2424,21 @@ fail: 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; + + 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_INVALID); dbus_connection_send(server->bus, m, NULL); dbus_message_unref(m);