main.c (02.09.09)
exFAT file system checker.
- Copyright (C) 2011, 2012 Andrew Nayenko
+ Copyright (C) 2011-2013 Andrew Nayenko
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
uint64_t files_count, directories_count;
-static void nodeck(struct exfat* ef, struct exfat_node* node)
+static int nodeck(struct exfat* ef, struct exfat_node* node)
{
const cluster_t cluster_size = CLUSTER_SIZE(*ef->sb);
cluster_t clusters = (node->size + cluster_size - 1) / cluster_size;
cluster_t c = node->start_cluster;
-
+ int rc = 0;
+
while (clusters--)
{
if (CLUSTER_INVALID(c))
char name[EXFAT_NAME_MAX + 1];
exfat_get_name(node, name, EXFAT_NAME_MAX);
- exfat_error("file `%s' has invalid cluster", name);
- return;
+ exfat_error("file `%s' has invalid cluster 0x%x", name, c);
+ rc = 1;
+ break;
}
if (BMAP_GET(ef->cmap.chunk, c - EXFAT_FIRST_DATA_CLUSTER) == 0)
{
exfat_get_name(node, name, EXFAT_NAME_MAX);
exfat_error("cluster 0x%x of file `%s' is not allocated", c, name);
+ rc = 1;
}
c = exfat_next_cluster(ef, node, c);
}
+ return rc;
}
static void dirck(struct exfat* ef, const char* path)
exfat_bug("directory `%s' is not found", path);
if (!(parent->flags & EXFAT_ATTRIB_DIR))
exfat_bug("`%s' is not a directory (0x%x)", path, parent->flags);
+ if (nodeck(ef, parent) != 0)
+ return;
path_length = strlen(path);
entry_path = malloc(path_length + 1 + EXFAT_NAME_MAX);
dirck(ef, entry_path);
}
else
+ {
files_count++;
- nodeck(ef, node);
+ nodeck(ef, node);
+ }
exfat_put_node(ef, node);
}
exfat_closedir(ef, &it);
{
if (strcmp(*pp, "-v") == 0)
{
- puts("Copyright (C) 2011, 2012 Andrew Nayenko");
+ puts("Copyright (C) 2011-2013 Andrew Nayenko");
return 0;
}
else if (spec == NULL)