From 7ad5aedae37fb54d064844e30bc6c26ab626e869 Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Thu, 20 Jun 2002 04:28:23 +0000 Subject: Improved link key handling. More verbose logging. --- hcid/main.c | 5 ++--- hcid/security.c | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/hcid/main.c b/hcid/main.c index 8f6ec8bc..6b0a4067 100644 --- a/hcid/main.c +++ b/hcid/main.c @@ -249,15 +249,12 @@ static void init_defaults(void) static void sig_usr1(int sig) { - syslog(LOG_INFO, "Flushing link keys"); flush_link_keys(); } static void sig_term(int sig) { - syslog(LOG_INFO, "Terminating"); g_main_quit(event_loop); - save_link_keys(); } static void sig_hup(int sig) @@ -456,6 +453,8 @@ int main(int argc, char *argv[], char *env[]) /* Start event processor */ g_main_run(event_loop); + save_link_keys(); + syslog(LOG_INFO, "Exit."); return 0; } diff --git a/hcid/security.c b/hcid/security.c index bca27805..f87fca5f 100644 --- a/hcid/security.c +++ b/hcid/security.c @@ -57,6 +57,8 @@ void save_link_keys(void) { int n, f; + syslog(LOG_INFO, "Saving link key database"); + umask(0077); if (!(f = open(hcid.key_file, O_WRONLY | O_CREAT | O_TRUNC, 0))) { syslog(LOG_ERR, "Can't save key database %s. %s(%d)", @@ -78,6 +80,9 @@ void save_link_keys(void) void flush_link_keys(void) { int n; + + syslog(LOG_INFO, "Flushing link key database"); + for (n=0; n < hcid.key_num; n++) { if (hcid.link_key[n]) { free(hcid.link_key[n]); @@ -300,24 +305,42 @@ static void link_key_notify(int dev, bdaddr_t *sba, void *ptr) evt_link_key_notify *evt = ptr; bdaddr_t *dba = &evt->bdaddr; struct link_key *key; - time_t tm = time(0); - int n, k = -1; + time_t tm, td, ot; + int n, k = -1, ek = -1; - /* Find a slot */ + tm = time(0); ot = HCID_KEY_TTL; + + /* Find an empty slot or the oldest key */ for (n=0; n < hcid.key_num; n++) { key = hcid.link_key[n]; - if (!key || (!bacmp(&key->sba, sba) && !bacmp(&key->dba, dba)) || - (tm - key->time) > HCID_KEY_TTL) { + if (!key || (!bacmp(&key->sba, sba) && !bacmp(&key->dba, dba))) { k = n; break; } + + td = tm - key->time; + if (td > ot) { + ot = td; + ek = n; + } } + if (k == -1 && ek != -1) + k = ek; + if (k != -1) { + char sa[40], da[40]; + /* Update link key */ key = hcid.link_key[k]; - if (!key && !(key = malloc(sizeof(*key)))) + if (!key && !(key = malloc(sizeof(*key)))) { + syslog(LOG_ERR, "Can't allocate link key memory. %s(%d)", + strerror(errno), errno); return; + } + + ba2str(sba, sa); ba2str(dba, da); + syslog(LOG_INFO, "Storing link key %s %s", sa, da); bacpy(&key->sba, sba); bacpy(&key->dba, dba); @@ -326,7 +349,9 @@ static void link_key_notify(int dev, bdaddr_t *sba, void *ptr) key->time = tm; hcid.link_key[k] = key; - } + } else + syslog(LOG_ERR, "No slot available for a link key."); + } gboolean io_security_event(GIOChannel *chan, GIOCondition cond, gpointer data) -- cgit