Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
File: fsdb.c Project: engur/PUAE
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);
}
Example #4
0
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);
}