#include <avahi-core/log.h>
#include <avahi-core/core.h>
+#ifdef ENABLE_CHROOT
+#include "chroot.h"
+#endif
+
#include "main.h"
#include "dbus-util.h"
abort();
}
-static char *file_get_contents(char *fname) {
+static char *file_get_contents(const char *fname) {
int fd = -1;
struct stat st;
ssize_t size;
char *buf = NULL;
-
+
assert(fname);
+
+#ifdef ENABLE_CHROOT
+ fd = avahi_chroot_helper_get_fd(fname);
+#else
+ fd = open(fname, O_RDONLY);
+#endif
- if (!(fd = open(fname, O_RDONLY))) {
+ if (fd < 0) {
avahi_log_error("Failed to open %s: %s", fname, strerror(errno));
goto fail;
}
buf[size] = 0;
close(fd);
+
return buf;
fail:
if (fd >= 0)
close(fd);
-
+
if (buf)
avahi_free(buf);
}
DBusHandlerResult avahi_dbus_handle_introspect(DBusConnection *c, DBusMessage *m, const char *fname) {
- char *path, *contents;
+ char *contents, *path;
DBusError error;
assert(c);
avahi_log_error("Error parsing Introspect message: %s", error.message);
goto fail;
}
-
+
path = avahi_strdup_printf("%s/%s", AVAHI_DBUS_INTROSPECTION_DIR, fname);
contents = file_get_contents(path);
avahi_free(path);
dbus_message_iter_recurse(&iter, &sub);
for (;;) {
- DBusMessageIter sub2;
int at, n;
- uint8_t *k;
+ const uint8_t *k;
+ DBusMessageIter sub2;
if ((at = dbus_message_iter_get_arg_type(&sub)) == DBUS_TYPE_INVALID)
break;
goto fail;
dbus_message_iter_recurse(&sub, &sub2);
- dbus_message_iter_get_fixed_array(&sub2, &k, &n);
+
+ if (dbus_message_iter_get_array_len(&sub2) > 0)
+ dbus_message_iter_get_fixed_array(&sub2, &k, &n);
+ else {
+ k = (const uint8_t*) "";
+ n = 0;
+ }
+
strlst = avahi_string_list_add_arbitrary(strlst, k, n);
dbus_message_iter_next(&sub);
return 0;
}
+int avahi_dbus_append_rdata(DBusMessage *message, const void *rdata, size_t size) {
+ DBusMessageIter iter, sub;
+
+ assert(message);
+
+ dbus_message_iter_init_append(message, &iter);
+
+ if (!(dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE_AS_STRING, &sub)) ||
+ !(dbus_message_iter_append_fixed_array(&sub, DBUS_TYPE_BYTE, &rdata, size)) ||
+ !(dbus_message_iter_close_container(&iter, &sub)))
+ return -1;
+
+ return 0;
+}