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); }
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); }