On close or commit, only update those directory entry fields that have an

SFT equivalent. The rest stays unmodified on disk.


git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1392 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2009-05-22 00:25:11 +00:00
parent ba75006b67
commit 7083b0a4fa
4 changed files with 26 additions and 6 deletions

View File

@ -145,6 +145,7 @@ BOOL checkdstart(struct dpb FAR *dpbp, struct dirent *dentry, CLUSTER value);
#define DIR_EXT FNAME_SIZE #define DIR_EXT FNAME_SIZE
#define DIR_ATTRIB (FNAME_SIZE+FEXT_SIZE) #define DIR_ATTRIB (FNAME_SIZE+FEXT_SIZE)
#define DIR_RESERVED (FNAME_SIZE+FEXT_SIZE+1) #define DIR_RESERVED (FNAME_SIZE+FEXT_SIZE+1)
#define DIR_START_HIGH (FNAME_SIZE+FEXT_SIZE+9)
#define DIR_TIME (FNAME_SIZE+FEXT_SIZE+11) #define DIR_TIME (FNAME_SIZE+FEXT_SIZE+11)
#define DIR_DATE (FNAME_SIZE+FEXT_SIZE+13) #define DIR_DATE (FNAME_SIZE+FEXT_SIZE+13)
#define DIR_START (FNAME_SIZE+FEXT_SIZE+15) #define DIR_START (FNAME_SIZE+FEXT_SIZE+15)

View File

@ -245,10 +245,10 @@ COUNT dir_read(REG f_node_ptr fnp)
* TRUE - all OK. * TRUE - all OK.
* FALSE - error occured (fnode is released). * FALSE - error occured (fnode is released).
*/ */
#ifndef IPL BOOL dir_write_update(REG f_node_ptr fnp, BOOL update)
BOOL dir_write(REG f_node_ptr fnp)
{ {
struct buffer FAR *bp; struct buffer FAR *bp;
UBYTE FAR *vp;
if (!(fnp->f_flags & F_DDIR)) if (!(fnp->f_flags & F_DDIR))
return FALSE; return FALSE;
@ -272,7 +272,26 @@ BOOL dir_write(REG f_node_ptr fnp)
swap_deleted(fnp->f_dir.dir_name); swap_deleted(fnp->f_dir.dir_name);
putdirent(&fnp->f_dir, &bp->b_buffer[fnp->f_diridx * DIRENT_SIZE]); vp = &bp->b_buffer[fnp->f_diridx * DIRENT_SIZE];
if (update)
{
/* only update fields that are also in the SFT, for dos_close/commit */
fmemcpy(&vp[DIR_NAME], fnp->f_dir.dir_name, FNAME_SIZE + FEXT_SIZE);
fputbyte(&vp[DIR_ATTRIB], fnp->f_dir.dir_attrib);
fputword(&vp[DIR_TIME], fnp->f_dir.dir_time);
fputword(&vp[DIR_DATE], fnp->f_dir.dir_date);
fputword(&vp[DIR_START], fnp->f_dir.dir_start);
#ifdef WITHFAT32
if (ISFAT32(fnp->f_dpb))
fputword(&vp[DIR_START_HIGH], fnp->f_dir.dir_start_high);
#endif
fputlong(&vp[DIR_SIZE], fnp->f_dir.dir_size);
}
else
{
putdirent(&fnp->f_dir, vp);
}
swap_deleted(fnp->f_dir.dir_name); swap_deleted(fnp->f_dir.dir_name);
@ -281,7 +300,6 @@ BOOL dir_write(REG f_node_ptr fnp)
} }
return TRUE; return TRUE;
} }
#endif
VOID dir_close(REG f_node_ptr fnp) VOID dir_close(REG f_node_ptr fnp)
{ {

View File

@ -279,7 +279,7 @@ COUNT dos_close(COUNT fd)
} }
fnp->f_flags |= F_DDIR; fnp->f_flags |= F_DDIR;
dir_write(fnp); dir_write_update(fnp, TRUE);
dir_close(fnp); dir_close(fnp);
return SUCCESS; return SUCCESS;
} }

View File

@ -140,7 +140,8 @@ VOID fatal(BYTE * err_msg);
VOID dir_init_fnode(f_node_ptr fnp, CLUSTER dirstart); VOID dir_init_fnode(f_node_ptr fnp, CLUSTER dirstart);
f_node_ptr dir_open(const char *dirname, f_node_ptr fnp); f_node_ptr dir_open(const char *dirname, f_node_ptr fnp);
COUNT dir_read(REG f_node_ptr fnp); COUNT dir_read(REG f_node_ptr fnp);
BOOL dir_write(REG f_node_ptr fnp); BOOL dir_write_update(REG f_node_ptr fnp, BOOL update);
#define dir_write(fnp) dir_write_update(fnp, FALSE)
VOID dir_close(REG f_node_ptr fnp); VOID dir_close(REG f_node_ptr fnp);
COUNT dos_findfirst(UCOUNT attr, BYTE * name); COUNT dos_findfirst(UCOUNT attr, BYTE * name);
COUNT dos_findnext(void); COUNT dos_findnext(void);