Skip to content

Commit 6319440

Browse files
committed
Fixed "empty" block logic.
1 parent d108ac6 commit 6319440

File tree

1 file changed

+48
-41
lines changed

1 file changed

+48
-41
lines changed

src/storage.c

Lines changed: 48 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ extern uint32_t _SPIFFS_start; //See spiffs_api.h
7676

7777
#define ACCESSORY_KEY_SIZE 64
7878

79-
#define STORAGE_DEBUG(message, ...) //printf("*** [Storage] %s: " message "\n", __func__, ##__VA_ARGS__)
79+
#define STORAGE_DEBUG(message, ...) printf("*** [Storage] %s: " message "\n", __func__, ##__VA_ARGS__)
8080

8181
const char hap_magic[] = "HAP";
8282

@@ -94,7 +94,7 @@ bool homekit_storage_magic_valid() {
9494
char magic_test[sizeof(hap_magic)];
9595
bzero(magic_test, sizeof(magic_test));
9696

97-
if (!spiflash_read(MAGIC_ADDR, (byte *)magic_test, sizeof(magic_test))) {
97+
if (!spiflash_read(MAGIC_ADDR, (uint32 *)magic_test, sizeof(magic_test))) {
9898
ERROR("Failed to read HomeKit storage magic");
9999
return false;
100100
}
@@ -105,7 +105,7 @@ bool homekit_storage_set_magic() {
105105
char magic[sizeof(hap_magic)];
106106
memcpy(magic, hap_magic, sizeof(magic));
107107

108-
if (!spiflash_write(MAGIC_ADDR, (byte *)magic, sizeof(magic))) {
108+
if (!spiflash_write(MAGIC_ADDR, (uint32 *)magic, sizeof(magic))) {
109109
ERROR("Failed to write HomeKit storage magic");
110110
return false;
111111
}
@@ -130,6 +130,21 @@ int homekit_storage_init() {
130130
}
131131
return 1; // Wasn't valid, is now
132132
}
133+
134+
pairing_data_t data;
135+
int paired = 0;
136+
for (int i=0; i<MAX_PAIRINGS; i++) {
137+
spiflash_read(PAIRINGS_ADDR + sizeof(data)*i, (uint32 *)&data, sizeof(data));
138+
if (memcmp(data.magic, hap_magic, sizeof(hap_magic)) == 0) {
139+
paired++;
140+
char device_id[DEVICE_ID_SIZE + 1];
141+
memset(device_id, 0, sizeof(device_id));
142+
memcpy(device_id, data.device_id, DEVICE_ID_SIZE);
143+
STORAGE_DEBUG("%spaired with %s", (data.permissions & pairing_permissions_admin) ? "[admin] " : "", device_id);
144+
}
145+
}
146+
STORAGE_DEBUG("%d paired devices", paired);
147+
133148
return 0; // Was valid
134149
}
135150

@@ -138,7 +153,7 @@ int homekit_storage_reset() {
138153
byte blank[sizeof(hap_magic)];
139154
bzero(blank, sizeof(blank));
140155

141-
if (!spiflash_write(MAGIC_ADDR, blank, sizeof(blank))) {
156+
if (!spiflash_write(MAGIC_ADDR, (uint32 *)blank, sizeof(blank))) {
142157
ERROR("Failed to reset HomeKit storage");
143158
return -1;
144159
}
@@ -147,20 +162,20 @@ int homekit_storage_reset() {
147162
}
148163

149164
int homekit_storage_reset_pairing_data() {
150-
165+
151166
byte blank[sizeof(pairing_data_t) * MAX_PAIRINGS];
152167
bzero(blank,sizeof(blank));
153168

154169
INFO("Formatting HomeKit storage at 0x%x", PAIRINGS_OFFSET);
155-
if (!spiflash_write(PAIRINGS_ADDR, blank, sizeof(blank))) {
170+
if (!spiflash_write(PAIRINGS_ADDR, (uint32 *)blank, sizeof(blank))) {
156171
ERROR("Failed to erase HomeKit pairing storage");
157172
return -1; // Fail case
158173
}
159174
return 0;
160175
}
161176

162177
void homekit_storage_save_accessory_id(const char *accessory_id) {
163-
if (!spiflash_write(ACCESSORY_ID_ADDR, (byte *)accessory_id, ACCESSORY_ID_SIZE)) {
178+
if (!spiflash_write(ACCESSORY_ID_ADDR, (uint32 *)accessory_id, ACCESSORY_ID_SIZE)) {
164179
ERROR("Failed to write accessory ID to HomeKit storage");
165180
}
166181
}
@@ -172,7 +187,7 @@ static char ishex(unsigned char c) {
172187
}
173188

174189
int homekit_storage_load_accessory_id(char *data) {
175-
if (!spiflash_read(ACCESSORY_ID_ADDR, (byte *)data, ACCESSORY_ID_SIZE)) {
190+
if (!spiflash_read(ACCESSORY_ID_ADDR, (uint32 *)data, ACCESSORY_ID_SIZE)) {
176191
ERROR("Failed to read accessory ID from HomeKit storage");
177192
return -1;
178193
}
@@ -200,15 +215,15 @@ void homekit_storage_save_accessory_key(const ed25519_key *key) {
200215
return;
201216
}
202217

203-
if (!spiflash_write(ACCESSORY_KEY_ADDR, key_data, key_data_size)) {
218+
if (!spiflash_write(ACCESSORY_KEY_ADDR, (uint32 *)key_data, key_data_size)) {
204219
ERROR("Failed to write accessory key to HomeKit storage");
205220
return;
206221
}
207222
}
208223

209224
int homekit_storage_load_accessory_key(ed25519_key *key) {
210225
byte key_data[ACCESSORY_KEY_SIZE];
211-
if (!spiflash_read(ACCESSORY_KEY_ADDR, key_data, sizeof(key_data))) {
226+
if (!spiflash_read(ACCESSORY_KEY_ADDR, (uint32 *)key_data, sizeof(key_data))) {
212227
ERROR("Failed to read accessory key from HomeKit storage");
213228
return -1;
214229
}
@@ -226,16 +241,28 @@ int homekit_storage_load_accessory_key(ed25519_key *key) {
226241
bool homekit_storage_can_add_pairing() {
227242
pairing_data_t data;
228243
for (int i=0; i<MAX_PAIRINGS; i++) {
229-
spiflash_read(PAIRINGS_ADDR + sizeof(data)*i, (byte *)&data, sizeof(data));
244+
spiflash_read(PAIRINGS_ADDR + sizeof(data)*i, (uint32 *)&data, sizeof(data));
230245
if (memcmp(data.magic, hap_magic, sizeof(hap_magic)))
231246
return true;
232247
}
233248
return false;
234249
}
235250

251+
static int find_empty_block() {
252+
pairing_data_t data;
253+
for (int i=0; i<MAX_PAIRINGS; i++) {
254+
spiflash_read(PAIRINGS_ADDR + sizeof(data)*i, (uint32 *)&data, sizeof(data));
255+
if (memcmp(data.magic, hap_magic, sizeof(hap_magic))) {
256+
INFO("empty block %d", i);
257+
return i;
258+
}
259+
}
260+
return -1;
261+
}
262+
236263
static int compact_data() {
237264
byte *data = malloc(SPI_FLASH_SECTOR_SIZE);
238-
if (!spiflash_read(STORAGE_BASE_ADDR, data, SPI_FLASH_SECTOR_SIZE)) {
265+
if (!spiflash_read(STORAGE_BASE_ADDR, (uint32 *)data, SPI_FLASH_SECTOR_SIZE)) {
239266
free(data);
240267
ERROR("Failed to compact HomeKit storage: sector data read error");
241268
return -1;
@@ -264,7 +291,7 @@ static int compact_data() {
264291
free(data);
265292
return -1;
266293
}
267-
if (!spiflash_write(STORAGE_BASE_ADDR, data, PAIRINGS_OFFSET + sizeof(pairing_data_t)*next_pairing_idx)) {
294+
if (!spiflash_write(STORAGE_BASE_ADDR, (uint32 *)data, PAIRINGS_OFFSET + sizeof(pairing_data_t)*next_pairing_idx)) {
268295
ERROR("Failed to compact HomeKit storage: error writing compacted data");
269296
free(data);
270297
return -1;
@@ -275,26 +302,6 @@ static int compact_data() {
275302
return 0;
276303
}
277304

278-
static int find_empty_block() {
279-
byte data[sizeof(pairing_data_t)];
280-
281-
for (int i=0; i<MAX_PAIRINGS; i++) {
282-
spiflash_read(PAIRINGS_ADDR + sizeof(data)*i, data, sizeof(data));
283-
284-
bool block_empty = true;
285-
for (int j=0; j<sizeof(data); j++)
286-
if (data[j] != 0xff) {
287-
block_empty = false;
288-
break;
289-
}
290-
291-
if (block_empty)
292-
return i;
293-
}
294-
295-
return -1;
296-
}
297-
298305
int homekit_storage_add_pairing(const char *device_id, const ed25519_key *device_key, byte permissions) {
299306
int next_block_idx = find_empty_block();
300307
if (next_block_idx == -1) {
@@ -322,7 +329,7 @@ int homekit_storage_add_pairing(const char *device_id, const ed25519_key *device
322329
return -1;
323330
}
324331

325-
if (!spiflash_write(PAIRINGS_ADDR + sizeof(data)*next_block_idx, (byte *)&data, sizeof(data))) {
332+
if (!spiflash_write(PAIRINGS_ADDR + sizeof(data)*next_block_idx, (uint32 *)&data, sizeof(data))) {
326333
ERROR("Failed to write pairing info to HomeKit storage");
327334
return -1;
328335
}
@@ -334,7 +341,7 @@ int homekit_storage_add_pairing(const char *device_id, const ed25519_key *device
334341
int homekit_storage_update_pairing(const char *device_id, byte permissions) {
335342
pairing_data_t data;
336343
for (int i=0; i<MAX_PAIRINGS; i++) {
337-
spiflash_read(PAIRINGS_ADDR + sizeof(data)*i, (byte *)&data, sizeof(data));
344+
spiflash_read(PAIRINGS_ADDR + sizeof(data)*i, (uint32 *)&data, sizeof(data));
338345
if (memcmp(data.magic, hap_magic, sizeof(data.magic)))
339346
continue;
340347

@@ -352,13 +359,13 @@ int homekit_storage_update_pairing(const char *device_id, byte permissions) {
352359

353360
data.permissions = permissions;
354361

355-
if (!spiflash_write(PAIRINGS_ADDR + sizeof(data)*next_block_idx, (byte *)&data, sizeof(data))) {
362+
if (!spiflash_write(PAIRINGS_ADDR + sizeof(data)*next_block_idx, (uint32 *)&data, sizeof(data))) {
356363
ERROR("Failed to write pairing info to HomeKit storage");
357364
return -1;
358365
}
359366

360367
bzero(&data, sizeof(data));
361-
if (!spiflash_write(PAIRINGS_ADDR + sizeof(data)*i, (byte *)&data, sizeof(data))) {
368+
if (!spiflash_write(PAIRINGS_ADDR + sizeof(data)*i, (uint32 *)&data, sizeof(data))) {
362369
ERROR("Failed to update pairing: error erasing old record from HomeKit storage");
363370
return -2;
364371
}
@@ -373,13 +380,13 @@ int homekit_storage_update_pairing(const char *device_id, byte permissions) {
373380
int homekit_storage_remove_pairing(const char *device_id) {
374381
pairing_data_t data;
375382
for (int i=0; i<MAX_PAIRINGS; i++) {
376-
spiflash_read(PAIRINGS_ADDR + sizeof(data)*i, (byte *)&data, sizeof(data));
383+
spiflash_read(PAIRINGS_ADDR + sizeof(data)*i, (uint32 *)&data, sizeof(data));
377384
if (memcmp(data.magic, hap_magic, sizeof(data.magic)))
378385
continue;
379386

380387
if (!memcmp(data.device_id, device_id, sizeof(data.device_id))) {
381388
bzero(&data, sizeof(data));
382-
if (!spiflash_write(PAIRINGS_ADDR + sizeof(data)*i, (byte *)&data, sizeof(data))) {
389+
if (!spiflash_write(PAIRINGS_ADDR + sizeof(data)*i, (uint32 *)&data, sizeof(data))) {
383390
ERROR("Failed to remove pairing from HomeKit storage");
384391
return -2;
385392
}
@@ -394,7 +401,7 @@ int homekit_storage_remove_pairing(const char *device_id) {
394401
int homekit_storage_find_pairing(const char *device_id, pairing_t *pairing) {
395402
pairing_data_t data;
396403
for (int i=0; i<MAX_PAIRINGS; i++) {
397-
spiflash_read(PAIRINGS_ADDR + sizeof(data)*i, (byte *)&data, sizeof(data));
404+
spiflash_read(PAIRINGS_ADDR + sizeof(data)*i, (uint32 *)&data, sizeof(data));
398405
if (memcmp(data.magic, hap_magic, sizeof(data.magic)))
399406
continue;
400407

@@ -433,7 +440,7 @@ int homekit_storage_next_pairing(pairing_iterator_t *it, pairing_t *pairing) {
433440
while(it->idx < MAX_PAIRINGS) {
434441
int id = it->idx++;
435442

436-
spiflash_read(PAIRINGS_ADDR + sizeof(data)*id, (byte *)&data, sizeof(data));
443+
spiflash_read(PAIRINGS_ADDR + sizeof(data)*id, (uint32 *)&data, sizeof(data));
437444
if (!memcmp(data.magic, hap_magic, sizeof(data.magic))) {
438445
crypto_ed25519_init(&pairing->device_key);
439446
int r = crypto_ed25519_import_public_key(&pairing->device_key, data.device_public_key, sizeof(data.device_public_key));

0 commit comments

Comments
 (0)