From dfd27a0731a7c5a71d0a2f5335441f2cb73565d1 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 18 Oct 2022 14:25:10 -0700 Subject: [PATCH] monitor/att: Detect cache changes This attempts to detect if the were any changes on cache files since they were last loaded and then attempt to reload them. Signed-off-by: Manika Shrivastava Signed-off-by: Ayush Garg --- monitor/att.c | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/monitor/att.c b/monitor/att.c index bf5089f..7cd9967 100644 --- a/monitor/att.c +++ b/monitor/att.c @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -2425,7 +2426,9 @@ struct att_read { struct att_conn_data { struct gatt_db *ldb; + struct timespec ldb_mtim; struct gatt_db *rdb; + struct timespec rdb_mtim; struct queue *reads; }; @@ -2439,6 +2442,28 @@ static void att_conn_data_free(void *data) free(att_data); } +static void gatt_load_db(struct gatt_db *db, const char *filename, + struct timespec *mtim) +{ + struct stat st; + + if (lstat(filename, &st)) + return; + + if (!gatt_db_isempty(db)) { + /* Check if file has been modified since last time */ + if (st.st_mtim.tv_sec == mtim->tv_sec && + st.st_mtim.tv_nsec == mtim->tv_nsec) + return; + /* Clear db before reloading */ + gatt_db_clear(db); + } + + *mtim = st.st_mtim; + + btd_settings_gatt_db_load(db, filename); +} + static void load_gatt_db(struct packet_conn_data *conn) { struct att_conn_data *data = conn->data; @@ -2454,22 +2479,14 @@ static void load_gatt_db(struct packet_conn_data *conn) conn->destroy = att_conn_data_free; } - if (!gatt_db_isempty(data->ldb) && !gatt_db_isempty(data->rdb)) - return; - ba2str((bdaddr_t *)conn->src, local); ba2str((bdaddr_t *)conn->dst, peer); - if (gatt_db_isempty(data->ldb)) { - create_filename(filename, PATH_MAX, "/%s/attributes", local); - btd_settings_gatt_db_load(data->ldb, filename); - } + create_filename(filename, PATH_MAX, "/%s/attributes", local); + gatt_load_db(data->ldb, filename, &data->ldb_mtim); - if (gatt_db_isempty(data->rdb)) { - create_filename(filename, PATH_MAX, "/%s/cache/%s", local, - peer); - btd_settings_gatt_db_load(data->rdb, filename); - } + create_filename(filename, PATH_MAX, "/%s/cache/%s", local, peer); + gatt_load_db(data->rdb, filename, &data->rdb_mtim); } static struct gatt_db_attribute *get_attribute(const struct l2cap_frame *frame, -- 2.7.4