clean up cached_get_file_info a little

This commit is contained in:
dschmenk 2013-09-07 09:10:26 -07:00
parent 2eaf496d05
commit b17af70266

View File

@ -641,9 +641,9 @@ static int prodos_map_errno(int perr)
static int cache_get_file_info(const char *path, int *access, int *type, int *aux, int *storage, int *numblks, int *size, int *mod, int *create) static int cache_get_file_info(const char *path, int *access, int *type, int *aux, int *storage, int *numblks, int *size, int *mod, int *create)
{ {
char dirpath[128], filename[32]; char dirpath[128], filename[32];
unsigned char *entry, prodos_name[65]; unsigned char *entry, prodos_name[65], data_buff[512];
int refnum, iblk, entrylen, entriesblk, filecnt, io_buff = 0; int refnum, iblk, entrylen, entriesblk, filecnt, io_buff = 0;
int i, dl, l = strlen(path); int iscached, i, dl, l = strlen(path);
for (dl = l - 1; dl; dl--) for (dl = l - 1; dl; dl--)
if (path[dl] == '/') if (path[dl] == '/')
@ -667,7 +667,8 @@ static int cache_get_file_info(const char *path, int *access, int *type, int *au
strncpy(dirpath, path, dl); strncpy(dirpath, path, dl);
dirpath[dl] = '\0'; dirpath[dl] = '\0';
//printf("Match path %s to cached dir %s\n", dirpath, cachepath); //printf("Match path %s to cached dir %s\n", dirpath, cachepath);
if (strcmp(dirpath, cachepath) == 0) iscached = (strcmp(dirpath, cachepath) == 0);
if (iscached || (refnum = prodos_open(prodos_path(dirpath, NULL, NULL, NULL), &io_buff)) > 0)
{ {
strcpy(filename, path + dl + 1); strcpy(filename, path + dl + 1);
l = l - dl - 1; l = l - dl - 1;
@ -678,46 +679,73 @@ static int cache_get_file_info(const char *path, int *access, int *type, int *au
} }
//printf("Match filename %s len %d\n", filename, l); //printf("Match filename %s len %d\n", filename, l);
iblk = 0; iblk = 0;
entrylen = cachedata[0][0x23];
entriesblk = cachedata[0][0x24];
filecnt = cachedata[0][0x25] + cachedata[0][0x26] * 256;
entry = &cachedata[0][4] + entrylen;
//printf("Cached entrylen = %d, filecnt = %d\n", entrylen, filecnt); //printf("Cached entrylen = %d, filecnt = %d\n", entrylen, filecnt);
do do
{ {
for (i = (iblk == 0) ? 1 : 0; i < entriesblk && filecnt; i++) if (iscached || prodos_read(refnum, data_buff, 512) == 512)
{ {
if (entry[0]) if (iscached)
{ {
entry[(entry[0] & 0x0F) + 1] = 0; if (iblk == 0)
//printf("Searching directory entry: %s len %d\n", entry + 1, entry[0] & 0x0F);
if ((entry[0] & 0x0F) == l)
{ {
//printf("Compare %s with %s\n", entry + 1, filename); entrylen = cachedata[0][0x23];
if (strncmp(entry + 1, filename, l) == 0) entriesblk = cachedata[0][0x24];
{ filecnt = cachedata[0][0x25] + cachedata[0][0x26] * 256;
*storage = entry[0x00] >> 4; entry = &cachedata[0][4] + entrylen;
*type = entry[0x10]; }
*access = entry[0x1E]; else
*aux = entry[0x1F] + entry[0x20] * 256; entry = &cachedata[0][4];
*numblks = entry[0x13] + entry[0x14] * 256; }
*size = entry[0x15] + entry[0x16] * 256 + entry[0x17] * 65536; else
*mod = entry[0x21] | (entry[0x22] << 8) {
| (entry[0x23] << 16) | (entry[0x24] << 24); if (iblk == 0)
*create = entry[0x18] | (entry[0x19] << 8) {
| (entry[0x1A] << 16) | (entry[0x1B] << 24); entrylen = data_buff[0x23];
//printf("Cache hit: %s access = $%02X, type = $%02X, aux = $%04X, storage = $%02X, size = %d\n", filename, *access, *type, *aux, *storage, *size); entriesblk = data_buff[0x24];
return 0; filecnt = data_buff[0x25] + data_buff[0x26] * 256;
} entry = &data_buff[4] + entrylen;
}
else
entry = &data_buff[4];
}
for (i = (iblk == 0) ? 1 : 0; i < entriesblk && filecnt; i++)
{
if (entry[0])
{
//entry[(entry[0] & 0x0F) + 1] = 0;
//printf("Searching directory entry: %s len %d\n", entry + 1, entry[0] & 0x0F);
if ((entry[0] & 0x0F) == l)
{
//printf("Compare %s with %s\n", entry + 1, filename);
if (strncmp(entry + 1, filename, l) == 0)
{
*storage = entry[0x00] >> 4;
*type = entry[0x10];
*access = entry[0x1E];
*aux = entry[0x1F] + entry[0x20] * 256;
*numblks = entry[0x13] + entry[0x14] * 256;
*size = entry[0x15] + entry[0x16] * 256 + entry[0x17] * 65536;
*mod = entry[0x21] | (entry[0x22] << 8)
| (entry[0x23] << 16) | (entry[0x24] << 24);
*create = entry[0x18] | (entry[0x19] << 8)
| (entry[0x1A] << 16) | (entry[0x1B] << 24);
//printf("Cache hit: %s access = $%02X, type = $%02X, aux = $%04X, storage = $%02X, size = %d\n", filename, *access, *type, *aux, *storage, *size);
if (!iscached)
prodos_close(refnum, &io_buff);
return 0;
}
}
entry += entrylen;
filecnt--;
} }
entry += entrylen;
filecnt--;
} }
} }
if (++iblk > CACHE_BLOCKS_MAX) else
break; filecnt = 0;
entry = &cachedata[iblk][4]; iblk++;
} while (filecnt != 0); } while (filecnt != 0);
if (!iscached)
prodos_close(refnum, &io_buff);
} }
if (prodos_get_file_info(prodos_path(path, NULL, NULL, prodos_name), access, type, aux, storage, numblks, mod, create) == 0) if (prodos_get_file_info(prodos_path(path, NULL, NULL, prodos_name), access, type, aux, storage, numblks, mod, create) == 0)
{ {
@ -857,7 +885,10 @@ static int a2pi_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
} }
} }
if (++iblk > CACHE_BLOCKS_MAX) if (++iblk > CACHE_BLOCKS_MAX)
{
cachepath[0] == '\0'; cachepath[0] == '\0';
iblk = 1;
}
} }
else else
filecnt = 0; filecnt = 0;