Пример #1
0
int start_sdp_server(uint16_t mtu, uint32_t flags)
{
	int compat = flags & SDP_SERVER_COMPAT;
	int master = flags & SDP_SERVER_MASTER;
	GIOChannel *io;

	info("Starting SDP server");

	if (init_server(mtu, master, compat) < 0) {
		error("Server initialization failed");
		return -1;
	}

	if (main_opts.did_source > 0)
		register_device_id();

	io = g_io_channel_unix_new(l2cap_sock);
	g_io_channel_set_close_on_unref(io, TRUE);

	l2cap_id = g_io_add_watch(io, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
					io_accept_event, &l2cap_sock);
	g_io_channel_unref(io);

	if (compat && unix_sock > fileno(stderr)) {
		io = g_io_channel_unix_new(unix_sock);
		g_io_channel_set_close_on_unref(io, TRUE);

		unix_id = g_io_add_watch(io,
					G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
					io_accept_event, &unix_sock);
		g_io_channel_unref(io);
	}

	return 0;
}
Пример #2
0
int start_sdp_server(uint16_t mtu, const char *did, uint32_t flags)
{
	int compat = flags & SDP_SERVER_COMPAT;
	int master = flags & SDP_SERVER_MASTER;
	GIOChannel *io;

	info("Starting SDP server");

	if (init_server(mtu, master, compat) < 0) {
		error("Server initialization failed");
		return -1;
	}

	if (did && strlen(did) > 0) {
		const char *ptr = did;
		uint16_t vid = 0x0000, pid = 0x0000, ver = 0x0000;

		vid = (uint16_t) strtol(ptr, NULL, 16);
		ptr = strchr(ptr, ':');
		if (ptr) {
			pid = (uint16_t) strtol(ptr + 1, NULL, 16);
			ptr = strchr(ptr + 1, ':');
			if (ptr)
				ver = (uint16_t) strtol(ptr + 1, NULL, 16);
			register_device_id(vid, pid, ver);
		}
	}

	io = g_io_channel_unix_new(l2cap_sock);
	g_io_channel_set_close_on_unref(io, TRUE);

	l2cap_id = g_io_add_watch(io, G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
					io_accept_event, &l2cap_sock);
	g_io_channel_unref(io);

	if (compat && unix_sock > fileno(stderr)) {
		io = g_io_channel_unix_new(unix_sock);
		g_io_channel_set_close_on_unref(io, TRUE);

		unix_id = g_io_add_watch(io,
					G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
					io_accept_event, &unix_sock);
		g_io_channel_unref(io);
	}

	return 0;
}
static device_id_t
get_device_id(bool do_regist)
{
  char device[PROP_VALUE_MAX];
  char build_id[PROP_VALUE_MAX];
  device_id_t device_id;
  const char *check_name;
  char name_buf[PROP_NAME_MAX];
  sqlite3_stmt *st;
  int rc;
  int i;

  if (!init_database()) {
    return DEVICE_NOT_SUPPORTED;
  }

  __system_property_get("ro.product.model", device);
  __system_property_get("ro.build.display.id", build_id);

  device_id = DEVICE_NOT_SUPPORTED;
  check_name = NULL;

  rc = sqlite3_prepare(db, SQL_QUERY_DEVICE, -1, &st, NULL);

  if (!IS_SQL_ERROR(rc)) {
    rc = sqlite3_reset(st);
  }

  if (!IS_SQL_ERROR(rc)) {
    rc = sqlite3_bind_text(st, 1, device, -1, SQLITE_STATIC);
  }

  if (!IS_SQL_ERROR(rc)) {
    rc = sqlite3_bind_text(st, 2, build_id, -1, SQLITE_STATIC);
  }

  if (!IS_SQL_ERROR(rc)) {
    for (rc = execute_sql(st); rc == SQLITE_ROW; rc = execute_sql(st)) {
      const char *check_value;

      device_id = sqlite3_column_int(st, 0);
      check_name = sqlite3_column_text(st, 1);
      check_value = sqlite3_column_text(st, 2);

      if (!check_name && !check_value) {
        break;
      }

      if (check_name && check_value) {
        char property_value[PROP_VALUE_MAX];

        __system_property_get(check_name, property_value);

        if (strcmp(property_value, check_value) == 0) {
          break;
        }

        strncpy(name_buf, check_name, sizeof (name_buf) - 1);
        name_buf[sizeof (name_buf) - 1] = '\0';

        check_name = name_buf;
      }

      device_id = DEVICE_NOT_SUPPORTED;
    }
  }

  if (IS_SQL_ERROR(rc)) {
    printf("%s(%d)\n", sqlite3_errmsg(db), sqlite3_errcode(db));

    sqlite3_finalize(st);

    return device_id;
  }

  sqlite3_finalize(st);

  if (!do_regist || device_id != DEVICE_NOT_SUPPORTED) {
    return device_id;
  }

  return register_device_id(check_name);
}