Use an unsigned integer for representing the PIN length

The value 0 is not allowed by the HCI spec so it can be used to denote
"not applicable" or "unknown". Also, the management interface will use
an unsigned integer for the PIN length so mirroring that in the core
daemon code makes sense. This patch also takes care of handling
previously stored -1 values and converts them to 0 whenever they are
detected.
diff --git a/plugins/hciops.c b/plugins/hciops.c
index 1efbbd2..5f3b48b 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
@@ -100,7 +100,7 @@
 
 	gboolean debug_keys;
 	GSList *keys;
-	int pin_length;
+	uint8_t pin_length;
 
 	GSList *uuids;
 } *devs = NULL;
@@ -117,7 +117,6 @@
 	memset(dev, 0, sizeof(*dev));
 
 	dev->sk = sk;
-	dev->pin_length = -1;
 	dev->cache_enable = TRUE;
 	dev->registered = registered;
 }
@@ -749,7 +748,7 @@
 	err = btd_event_link_key_notify(&dev->bdaddr, dba, evt->link_key,
 					evt->key_type, dev->pin_length,
 					old_key_type);
-	dev->pin_length = -1;
+	dev->pin_length = 0;
 
 	if (err == 0) {
 		dev->keys = g_slist_append(dev->keys, key_info);
@@ -2066,7 +2065,7 @@
 						io_security_event,
 						GINT_TO_POINTER(index), NULL);
 	dev->io = chan;
-	dev->pin_length = -1;
+	dev->pin_length = 0;
 
 }
 
diff --git a/src/adapter.c b/src/adapter.c
index ab4791c..3f12884 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1975,6 +1975,7 @@
 {
 	struct link_key_info *info;
 	char tmp[3];
+	long int l;
 	int i;
 
 	if (strlen(value) < 36) {
@@ -1997,7 +1998,10 @@
 	info->type = (uint8_t) strtol(tmp, NULL, 10);
 
 	memcpy(tmp, value + 35, 2);
-	info->pin_len = strtol(tmp, NULL, 10);
+	l = strtol(tmp, NULL, 10);
+	if (l < 0)
+		l = 0;
+	info->pin_len = l;
 
 	return info;
 }
diff --git a/src/adapter.h b/src/adapter.h
index b66be9a..8396569 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -69,7 +69,7 @@
 	bdaddr_t bdaddr;
 	unsigned char key[16];
 	uint8_t type;
-	int pin_len;
+	uint8_t pin_len;
 };
 
 struct remote_dev_info {
diff --git a/src/event.c b/src/event.c
index 5d0bf6d..00b9ad7 100644
--- a/src/event.c
+++ b/src/event.c
@@ -695,7 +695,7 @@
 
 int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer,
 				uint8_t *key, uint8_t key_type,
-				int pin_length, uint8_t old_key_type)
+				uint8_t pin_length, uint8_t old_key_type)
 {
 	struct btd_device *device;
 	struct btd_adapter *adapter;
diff --git a/src/event.h b/src/event.h
index 66dd279..941902a 100644
--- a/src/event.h
+++ b/src/event.h
@@ -45,4 +45,4 @@
 int btd_event_user_notify(bdaddr_t *sba, bdaddr_t *dba, uint32_t passkey);
 int btd_event_link_key_notify(bdaddr_t *local, bdaddr_t *peer,
 				uint8_t *key, uint8_t key_type,
-				int pin_length, uint8_t old_key_type);
+				uint8_t pin_length, uint8_t old_key_type);
diff --git a/src/storage.c b/src/storage.c
index 1c6ced4..35e1ba2 100644
--- a/src/storage.c
+++ b/src/storage.c
@@ -676,6 +676,8 @@
 	}
 
 	len = atoi(str + 35);
+	if (len < 0)
+		len = 0;
 
 	free(str);