static DBusMessage *activate_service(DBusConnection *conn,
				DBusMessage *msg, void *data)
{
	DBusMessage *reply;
	const char *pattern;
	struct service *service;
	const char *busname = "org.bluez";

	if (!dbus_message_get_args(msg, NULL,
				DBUS_TYPE_STRING, &pattern,
				DBUS_TYPE_INVALID))
		return invalid_args(msg);

	service = search_service(pattern);
	if (!service)
		return no_such_service(msg);

	reply = dbus_message_new_method_return(msg);
	if (!reply)
		return NULL;

	dbus_message_append_args(reply, DBUS_TYPE_STRING, &busname,
							DBUS_TYPE_INVALID);

	return reply;
}
static int
pack_block_info(int n, felica_block_info *info, int *service_num, uint8 *services, uint8 *data)
{
	int i, len, snum, s, slist[16] = {0};
	uint8 *blklist;

	snum = 0;
	len = 0;
	blklist = data;
	for (i = 0; i < n; i++) {
		if (len >= DATASIZE) return -1;

		s = search_service(snum, slist, info[i].service);
		if (s < 0) {
			if (snum >= (int) (sizeof(slist)/sizeof(*slist))) {
				return -1;
			}

			slist[snum] = info[i].service;
			services[snum * 2] = L8(info[i].service);
			services[snum *2 + 1] = H8(info[i].service);
			s = snum;
			snum++;
		}

		blklist[0] = ((info[i].mode << 4) & 0x07) + (s & 0x0f);
		if (info[i].block > 255) {
			blklist[1] = L8(info[i].block);
			blklist[2] = H8(info[i].block);
			blklist += 3;
			len += 3;
		} else {
			blklist[0] |= 0x80;		/* element size == 2 */
			blklist[1] = info[i].block;
			blklist += 2;
			len += 2;
		}
	}

	*service_num = snum;
	return len;
}