summaryrefslogtreecommitdiffstats
path: root/avahi-core/netlink.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-08-02 14:08:18 +0000
committerLennart Poettering <lennart@poettering.net>2005-08-02 14:08:18 +0000
commit66142b071a2497d7e3cf58d7bf5159bb1c970d84 (patch)
tree1e0125be0373b7201ec71275f4bd8e06aecc94a3 /avahi-core/netlink.c
parent98d4644e8f9445fa4cf7395b05a9f860b8f3cb9c (diff)
* allow caller to specifiy additional CFLAGS arguments to bootstrap.sh
* fix some warnings (and some real errors) found when compiling avahi with excessive GCC warnings git-svn-id: file:///home/lennart/svn/public/avahi/trunk@209 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
Diffstat (limited to 'avahi-core/netlink.c')
-rw-r--r--avahi-core/netlink.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/avahi-core/netlink.c b/avahi-core/netlink.c
index ff88b91..119e195 100644
--- a/avahi-core/netlink.c
+++ b/avahi-core/netlink.c
@@ -39,6 +39,8 @@ struct AvahiNetlink {
GSource *source;
void (*callback) (AvahiNetlink *nl, struct nlmsghdr *n, gpointer userdata);
gpointer userdata;
+ guint8* buffer;
+ guint buffer_length;
};
gboolean avahi_netlink_work(AvahiNetlink *nl, gboolean block) {
@@ -47,19 +49,22 @@ gboolean avahi_netlink_work(AvahiNetlink *nl, gboolean block) {
for (;;) {
ssize_t bytes;
struct nlmsghdr *p;
- guint8 buffer[64*1024];
- p = (struct nlmsghdr *) buffer;
+ for (;;) {
+ if ((bytes = recv(nl->fd, nl->buffer, nl->buffer_length, block ? 0 : MSG_DONTWAIT)) < 0) {
- if ((bytes = recv(nl->fd, buffer, sizeof(buffer), block ? 0 : MSG_DONTWAIT)) < 0) {
-
- if (errno == EAGAIN || errno == EINTR)
- break;
+ if (errno == EAGAIN || errno == EINTR)
+ return TRUE;
+
+ avahi_log_warn("NETLINK: recv() failed: %s", strerror(errno));
+ return FALSE;
+ }
- avahi_log_warn("NETLINK: recv() failed: %s", strerror(errno));
- return FALSE;
+ break;
}
+ p = (struct nlmsghdr *) nl->buffer;
+
if (nl->callback) {
for (; bytes > 0; p = NLMSG_NEXT(p, bytes)) {
if (!NLMSG_OK(p, (size_t) bytes)) {
@@ -72,10 +77,8 @@ gboolean avahi_netlink_work(AvahiNetlink *nl, gboolean block) {
}
if (block)
- break;
+ return TRUE;
}
-
- return TRUE;
}
static gboolean prepare_func(GSource *source, gint *timeout) {
@@ -144,6 +147,7 @@ AvahiNetlink *avahi_netlink_new(GMainContext *context, gint priority, guint32 gr
nl->seq = 0;
nl->callback = cb;
nl->userdata = userdata;
+ nl->buffer = g_new(guint8, nl->buffer_length = 64*1024);
nl->source = g_source_new(&source_funcs, sizeof(GSource) + sizeof(AvahiNetlink*));
*((AvahiNetlink**) (((guint8*) nl->source) + sizeof(GSource))) = nl;
@@ -167,6 +171,7 @@ void avahi_netlink_free(AvahiNetlink *nl) {
g_source_unref(nl->source);
g_main_context_unref(nl->context);
close(nl->fd);
+ g_free(nl->buffer);
g_free(nl);
}