altos: Make ao_fat_readdir return real error values instead of 1/0
authorKeith Packard <keithp@keithp.com>
Sun, 31 Mar 2013 23:10:33 +0000 (16:10 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 31 Mar 2013 23:10:33 +0000 (16:10 -0700)
This way, we can distinguish between 'something bad happened' and
'you're at the end of the directory'.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/drivers/ao_fat.c
src/drivers/ao_fat.h

index 3e9c00b5e32e8f9fa80122d713b19749c9054976..ddf560cc0ffb50a37afbe4ce36ff3745de8cb923 100644 (file)
@@ -1153,17 +1153,17 @@ ao_fat_readdir(uint16_t *entry, struct ao_fat_dirent *dirent)
        for (;;) {
                dent = ao_fat_root_get(*entry);
                if (!dent)
-                       return 0;
+                       return -AO_FAT_EDIREOF;
 
                if (dent[0] == AO_FAT_DENT_END) {
                        ao_fat_root_put(dent, *entry, 0);
-                       return 0;
+                       return -AO_FAT_EDIREOF;
                }
                if (dent[0] != AO_FAT_DENT_EMPTY && (dent[0xb] & 0xf) != 0xf) {
                        ao_fat_dirent_init(dent, *entry, dirent);
                        ao_fat_root_put(dent, *entry, 0);
                        (*entry)++;
-                       return 1;
+                       return AO_FAT_SUCCESS;
                }
                ao_fat_root_put(dent, *entry, 0);
                (*entry)++;
@@ -1232,8 +1232,9 @@ ao_fat_list_cmd(void)
        uint16_t                entry = 0;
        struct ao_fat_dirent    dirent;
        int                     i;
+       int8_t                  status;
 
-       while (ao_fat_readdir(&entry, &dirent)) {
+       while ((status = ao_fat_readdir(&entry, &dirent)) == AO_FAT_SUCCESS) {
                for (i = 0; i < 8; i++)
                        putchar(dirent.name[i]);
                putchar('.');
@@ -1243,6 +1244,8 @@ ao_fat_list_cmd(void)
                        putchar (dirent.attr & ao_fat_attr[i].bit ? ao_fat_attr[i].label : ' ');
                printf (" @%08x %d\n", dirent.cluster, dirent.size);
        }
+       if (status != -AO_FAT_EDIREOF)
+               printf ("readdir failed: %d\n", status);
 }
 
 static uint8_t
index 36aec7dfded5bf299b5760f6364f5fce7e79ab39..fe154cdfd42043958c91b9dd930cb1b232d87952 100644 (file)
@@ -48,6 +48,7 @@ ao_fat_init(void);
 #define AO_FAT_EMFILE                  24
 #define AO_FAT_EFBIG                   27
 #define AO_FAT_ENOSPC                  28
+#define AO_FAT_EDIREOF                 29
 
 /* ao_fat_setup return values */
 #define AO_FAT_FILESYSTEM_SUCCESS                      0