diff --git a/plugins/adaptername.c b/plugins/adaptername.c
index c109b44..cd0ffb2 100644
--- a/plugins/adaptername.c
+++ b/plugins/adaptername.c
#include "log.h"
#include <sys/inotify.h>
-#define EVENT_SIZE (sizeof (struct inotify_event))
-#define EVENT_BUF_LEN (1024 * (EVENT_SIZE + 16))
#define MACHINE_INFO_DIR "/etc/"
#define MACHINE_INFO_FILE "machine-info"
static gboolean handle_inotify_cb(GIOChannel *channel, GIOCondition cond,
gpointer data)
{
- char buf[EVENT_BUF_LEN];
+ struct inotify_event event;
+ gsize len;
GIOStatus err;
- gsize len, i;
- gboolean changed;
+ char name[FILENAME_MAX + 1];
- changed = FALSE;
+ while ((err = g_io_channel_read_chars(channel, (gchar *) &event,
+ sizeof(event), &len, NULL)) != G_IO_STATUS_AGAIN) {
+ if (err != G_IO_STATUS_NORMAL || len != sizeof(event) ||
+ event.len > sizeof(name))
+ goto fail;
- err = g_io_channel_read_chars(channel, buf, EVENT_BUF_LEN, &len, NULL);
- if (err != G_IO_STATUS_NORMAL) {
- error("Error reading inotify event: %d\n", err);
- return FALSE;
- }
+ if (event.len == 0)
+ continue;
- i = 0;
- while (i < len) {
- struct inotify_event *pevent = (struct inotify_event *) &buf[i];
+ err = g_io_channel_read_chars(channel, name, event.len, &len,
+ NULL);
- /* check that it's ours */
- if (pevent->len && pevent->name != NULL &&
- strcmp(pevent->name, MACHINE_INFO_FILE) == 0)
- changed = TRUE;
+ if (err != G_IO_STATUS_NORMAL || len != event.len)
+ goto fail;
- i += EVENT_SIZE + pevent->len;
- }
+ if (strncmp(name, MACHINE_INFO_FILE, event.len) == 0) {
+ DBG(MACHINE_INFO_DIR MACHINE_INFO_FILE
+ " changed, updating adapters' names");
- if (changed != FALSE) {
- DBG(MACHINE_INFO_DIR MACHINE_INFO_FILE
- " changed, changing names for adapters");
- manager_foreach_adapter((adapter_cb) adaptername_probe, NULL);
+ manager_foreach_adapter((adapter_cb) adaptername_probe,
+ NULL);
+ break;
+ }
}
return TRUE;
+fail:
+ error("Error reading inotify event");
+ return FALSE;
}
static void adaptername_remove(struct btd_adapter *adapter)