void fsdb_dir_writeback (a_inode *dir) { FILE *f; int changes_needed = 0; int entries_needed = 0; a_inode *aino; /* First pass: clear dirty bits where unnecessary, and see if any work * needs to be done. */ for (aino = dir->child; aino; aino = aino->sibling) { int old_needs_dbentry = aino->needs_dbentry; aino->needs_dbentry = old_needs_dbentry; if (! aino->dirty) continue; aino->needs_dbentry = needs_dbentry (aino); entries_needed |= aino->needs_dbentry; if (! aino->needs_dbentry && ! old_needs_dbentry) aino->dirty = 0; else changes_needed = 1; } if (! entries_needed) { kill_fsdb (dir); return; } if (! changes_needed) return; f = get_fsdb (dir, "r+b"); if (f == 0) { f = get_fsdb (dir, "w+b"); if (f == 0) /* This shouldn't happen... */ return; } for (aino = dir->child; aino; aino = aino->sibling) { off_t pos; if (! aino->dirty) continue; aino->dirty = 0; if (! aino->has_dbentry) { aino->db_offset = fseek (f, 0, SEEK_END); aino->has_dbentry = 1; } else fseek (f, aino->db_offset, SEEK_SET); write_aino (f, aino); } fclose (f); }
/* Prune the db file the first time this directory is opened in a session. */ void fsdb_clean_dir (a_inode *dir) { uae_u8 buf[1 + 4 + 257 + 257 + 81]; TCHAR *n; FILE *f; off_t pos1 = 0, pos2; if (!dir->nname) return; n = build_nname (dir->nname, FSDB_FILE); f = _tfopen (n, _T("r+b")); if (f == 0) { xfree (n); return; } for (;;) { pos2 = ftell (f); if (fread (buf, 1, sizeof buf, f) < sizeof buf) break; fsdb_fixup (f, buf, sizeof buf, dir); if (buf[0] == 0) continue; if (pos1 != pos2) { fseek (f, pos1, SEEK_SET); size_t isWritten = fwrite (buf, 1, sizeof buf, f); if (isWritten < sizeof(buf)) write_log("%s:%d [%s] - Failed to write %ld bytes (%ld/%ld)", __FILE__, __LINE__, __FUNCTION__, sizeof(buf) - isWritten, isWritten, sizeof(buf)); fseek (f, pos2 + sizeof buf, SEEK_SET); } pos1 += sizeof buf; } fclose (f); if (pos1 == 0) { kill_fsdb (dir); } else { my_truncate (n, pos1); } xfree (n); }
/* Prune the db file the first time this directory is opened in a session. */ void fsdb_clean_dir (a_inode *dir) { uae_u8 buf[1 + 4 + 257 + 257 + 81]; TCHAR *n; FILE *f; off_t pos1 = 0, pos2; if (!dir->nname) return; n = build_nname (dir->nname, FSDB_FILE); f = _tfopen (n, _T("r+b")); if (f == 0) { xfree (n); return; } for (;;) { pos2 = ftell (f); if (fread (buf, 1, sizeof buf, f) < sizeof buf) break; fsdb_fixup (f, buf, sizeof buf, dir); if (buf[0] == 0) continue; if (pos1 != pos2) { fseek (f, pos1, SEEK_SET); fwrite (buf, 1, sizeof buf, f); fseek (f, pos2 + sizeof buf, SEEK_SET); } pos1 += sizeof buf; } fclose (f); if (pos1 == 0) { kill_fsdb (dir); } else { my_truncate (n, pos1); } xfree (n); }
void fsdb_dir_writeback (a_inode *dir) { FILE *f; int changes_needed = 0; int entries_needed = 0; a_inode *aino; uae_u8 *tmpbuf; int size, i; TRACE ((_T("fsdb writeback %s\n"), dir->aname)); /* First pass: clear dirty bits where unnecessary, and see if any work * needs to be done. */ for (aino = dir->child; aino; aino = aino->sibling) { int old_needs_dbentry = aino->has_dbentry; int need = needs_dbentry (aino); aino->needs_dbentry = need; entries_needed |= need; if (! aino->dirty) continue; if (! aino->needs_dbentry && ! old_needs_dbentry) aino->dirty = 0; else changes_needed = 1; } if (! entries_needed) { kill_fsdb (dir); TRACE ((_T("fsdb removed\n"))); return; } if (! changes_needed) { TRACE ((_T("not modified\n"))); return; } f = get_fsdb (dir, _T("r+b")); if (f == 0) { f = get_fsdb (dir, _T("w+b")); if (f == 0) { TRACE ((_T("failed\n"))); /* This shouldn't happen... */ return; } } fseek (f, 0, SEEK_END); size = ftell (f); fseek (f, 0, SEEK_SET); tmpbuf = 0; if (size > 0) { tmpbuf = (uae_u8 *)malloc (size); fread (tmpbuf, 1, size, f); } TRACE ((_T("**** updating '%s' %d\n"), dir->aname, size)); for (aino = dir->child; aino; aino = aino->sibling) { if (! aino->dirty) continue; aino->dirty = 0; i = 0; while (!aino->has_dbentry && i < size) { if (!strcmp ((const char *)(tmpbuf + i + 5), aino->aname)) { aino->has_dbentry = 1; aino->db_offset = i; } i += 1 + 4 + 257 + 257 + 81; } if (! aino->has_dbentry) { fseek (f, 0, SEEK_END); aino->has_dbentry = 1; } else { fseek (f, aino->db_offset, SEEK_SET); } write_aino (f, aino); } TRACE ((_T("end\n"))); fclose (f); xfree (tmpbuf); }
void fsdb_dir_writeback (a_inode *dir) { FILE *f; int changes_needed = 0; int entries_needed = 0; a_inode *aino; uae_u8 *tmpbuf; int size, i; TRACE ((_T("fsdb writeback %s\n"), dir->aname)); /* First pass: clear dirty bits where unnecessary, and see if any work * needs to be done. */ for (aino = dir->child; aino; aino = aino->sibling) { /* int old_needs_dbentry = aino->needs_dbentry || aino->has_dbentry; aino->needs_dbentry = needs_dbentry (aino); entries_needed |= aino->has_dbentry | aino->needs_dbentry; */ int old_needs_dbentry = aino->has_dbentry; int need = needs_dbentry (aino); aino->needs_dbentry = need; entries_needed |= need; if (! aino->dirty) continue; if (! aino->needs_dbentry && ! old_needs_dbentry) aino->dirty = 0; else changes_needed = 1; } if (! entries_needed) { kill_fsdb (dir); TRACE ((_T("fsdb removed\n"))); return; } if (! changes_needed) { TRACE ((_T("not modified\n"))); return; } f = get_fsdb (dir, _T("r+b")); if (f == 0) { if (/*(currprefs.filesys_custom_uaefsdb && (dir->volflags & MYVOLUMEINFO_STREAMS)) ||*/ currprefs.filesys_no_uaefsdb) { for (aino = dir->child; aino; aino = aino->sibling) { aino->dirty = 0; aino->has_dbentry = 0; aino->needs_dbentry = 0; } return; } f = get_fsdb (dir, _T("w+b")); if (f == 0) { TRACE ((_T("failed\n"))); /* This shouldn't happen... */ return; } } fseek (f, 0, SEEK_END); size = ftell (f); fseek (f, 0, SEEK_SET); tmpbuf = 0; if (size > 0) { tmpbuf = (uae_u8*)malloc (size); size_t isRead = fread (tmpbuf, 1, size, f); if (isRead < (size_t)size) write_log("%s:%d [%s] - Failed to read %ld bytes (%ld/%d)", __FILE__, __LINE__, __FUNCTION__, (size_t)size - isRead, isRead, size); } TRACE ((_T("**** updating '%s' %d\n"), dir->aname, size)); for (aino = dir->child; aino; aino = aino->sibling) { if (! aino->dirty) continue; aino->dirty = 0; i = 0; while (!aino->has_dbentry && i < size) { TCHAR *s = au ((char*)tmpbuf + i + 5); if (!_tcscmp (s, aino->aname)) { aino->has_dbentry = 1; aino->db_offset = i; } xfree (s); i += 1 + 4 + 257 + 257 + 81; } if (! aino->has_dbentry) { fseek (f, 0, SEEK_END); aino->has_dbentry = 1; } else { fseek (f, aino->db_offset, SEEK_SET); } write_aino (f, aino); } TRACE ((_T("end\n"))); fclose (f); xfree (tmpbuf); }
void fsdb_dir_writeback (a_inode *dir) { FILE *f; int changes_needed = 0; int entries_needed = 0; a_inode *aino; char *tmpbuf; int size, i; TRACE (("fsdb writeback %s\n", dir->aname)); /* First pass: clear dirty bits where unnecessary, and see if any work * needs to be done. */ for (aino = dir->child; aino; aino = aino->sibling) { /* int old_needs_dbentry = aino->needs_dbentry || aino->has_dbentry; aino->needs_dbentry = needs_dbentry (aino); entries_needed |= aino->has_dbentry | aino->needs_dbentry; */ int old_needs_dbentry = aino->has_dbentry; int need = needs_dbentry (aino); aino->needs_dbentry = need; entries_needed |= need; if (! aino->dirty) continue; if (! aino->needs_dbentry && ! old_needs_dbentry) aino->dirty = 0; else changes_needed = 1; } if (! entries_needed) { kill_fsdb (dir); TRACE (("fsdb removed\n")); return; } if (! changes_needed) { TRACE (("not modified\n")); return; } f = get_fsdb (dir, "r+b"); if (f == 0) { if (/*(currprefs.filesys_custom_uaefsdb && (dir->volflags & MYVOLUMEINFO_STREAMS)) || */ currprefs.filesys_no_uaefsdb) { for (aino = dir->child; aino; aino = aino->sibling) { aino->dirty = 0; aino->has_dbentry = 0; aino->needs_dbentry = 0; } return; } f = get_fsdb (dir, "w+b"); if (f == 0) { TRACE (("failed\n")); /* This shouldn't happen... */ return; } } fseek (f, 0, SEEK_END); size = ftell (f); fseek (f, 0, SEEK_SET); tmpbuf = 0; if (size > 0) { tmpbuf = malloc (size); fread (tmpbuf, 1, size, f); } TRACE (("**** updating '%s' %d\n", dir->aname, size)); for (aino = dir->child; aino; aino = aino->sibling) { if (! aino->dirty) continue; aino->dirty = 0; i = 0; while (!aino->has_dbentry && i < size) { if (!strcmp (tmpbuf + i + 5, aino->aname)) { aino->has_dbentry = 1; aino->db_offset = i; } i += 1 + 4 + 257 + 257 + 81; } if (! aino->has_dbentry) { fseek (f, 0, SEEK_END); aino->has_dbentry = 1; } else { fseek (f, aino->db_offset, SEEK_SET); } write_aino (f, aino); } TRACE (("end\n")); fclose (f); free (tmpbuf); }