Avoid bitfields for fnodes, using flags instead.

Replaced droot field by checks for f_dirstart == 0.


git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@867 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2004-04-13 10:46:37 +00:00
parent 5c72b4a0e9
commit 5d712fc2a6
3 changed files with 53 additions and 80 deletions

View File

@ -39,13 +39,7 @@ struct f_node {
UWORD f_count; /* number of uses of this file */
COUNT f_mode; /* read, write, read-write, etc */
struct {
BITS f_dmod:1; /* directory has been modified */
BITS f_droot:1; /* directory is the root */
BITS f_dnew:1; /* fnode is new and needs fill */
BITS f_ddir:1; /* fnode is assigned to dir */
BITS f_ddate:1; /* date set using setdate */
} f_flags; /* file flags */
UWORD f_flags; /* file flags */
struct dirent f_dir; /* this file's dir entry image */
@ -59,6 +53,11 @@ struct f_node {
CLUSTER f_cluster; /* the cluster we are at */
};
#define F_DMOD 1 /* directory has been modified */
#define F_DNEW 2 /* fnode is new and needs fill */
#define F_DDIR 4 /* fnode is assigned to dir */
#define F_DDATE 8 /* date set using setdate */
typedef struct f_node *f_node_ptr;
struct lfn_inode {
@ -66,7 +65,7 @@ struct lfn_inode {
/* If the string is empty, */
/* then file has the 8.3 name */
struct dirent l_dir; /* Directory entry image */
ULONG l_diroff; /* Current directory entry offset */
UWORD l_diroff; /* Current directory entry offset */
};
typedef struct lfn_inode FAR * lfn_inode_ptr;

View File

@ -42,31 +42,18 @@ static BYTE *fatdirRcsId =
VOID dir_init_fnode(f_node_ptr fnp, CLUSTER dirstart)
{
/* reset the directory flags */
fnp->f_flags.f_dmod = FALSE;
fnp->f_flags.f_droot = FALSE;
fnp->f_flags.f_ddir = TRUE;
fnp->f_flags.f_dnew = TRUE;
fnp->f_flags = F_DDIR | F_DNEW;
fnp->f_diroff = 0;
fnp->f_offset = 0l;
fnp->f_cluster_offset = 0;
/* root directory */
if (dirstart == 0)
{
#ifdef WITHFAT32
if (dirstart == 0)
if (ISFAT32(fnp->f_dpb))
{
fnp->f_cluster = fnp->f_dirstart = fnp->f_dpb->dpb_xrootclst;
}
else
dirstart = fnp->f_dpb->dpb_xrootclst;
#endif
{
fnp->f_dirstart = 0;
fnp->f_flags.f_droot = TRUE;
}
}
else /* non-root */
fnp->f_cluster = fnp->f_dirstart = dirstart;
fnp->f_cluster = fnp->f_dirstart = dirstart;
}
f_node_ptr dir_open(register const char *dirname)
@ -216,7 +203,7 @@ COUNT dir_read(REG f_node_ptr fnp)
/* can't have more than 65535 directory entries
remove lfn entries may call us with new_diroff == -1
for root directories though */
if (!fnp->f_flags.f_droot && new_diroff >= 65535U)
if (fnp->f_dirstart != 0 && new_diroff >= 65535U)
return DE_SEEK;
/* Directories need to point to their current offset, not for */
@ -224,7 +211,7 @@ COUNT dir_read(REG f_node_ptr fnp)
/* directory entry, we will update the offset on entry rather */
/* than wait until exit. If it was new, clear the special new */
/* flag. */
if (!fnp->f_flags.f_dnew)
if (!(fnp->f_flags & F_DNEW))
new_diroff++;
/* Determine if we hit the end of the directory. If we have, */
@ -232,7 +219,7 @@ COUNT dir_read(REG f_node_ptr fnp)
/* dirent portion of the fnode, clear the f_dmod bit and leave, */
/* but only for root directories */
if (fnp->f_flags.f_droot)
if (fnp->f_dirstart == 0)
{
if (new_diroff >= fnp->f_dpb->dpb_dirents)
return DE_SEEK;
@ -277,8 +264,7 @@ COUNT dir_read(REG f_node_ptr fnp)
swap_deleted(fnp->f_dir.dir_name);
/* Update the fnode's directory info */
fnp->f_flags.f_dmod = FALSE;
fnp->f_flags.f_dnew = FALSE;
fnp->f_flags &= ~(F_DMOD | F_DNEW);
fnp->f_diroff = new_diroff;
/* and for efficiency, stop when we hit the first */
@ -291,8 +277,8 @@ COUNT dir_read(REG f_node_ptr fnp)
* Writes directory entry pointed by fnp to disk. In case of erroneous
* situation fnode is released.
* The caller should set
* 1. f_dmod flag if original directory entry was modified.
* 2. f_dmod & f_dnew flags if new directory entry is created. In this
* 1. F_DMOD flag if original directory entry was modified.
* 2. F_DMOD & F_DNEW flags if new directory entry is created. In this
* case the reserved fields is cleared, but only if new dentry isn't
* a LFN entry (has D_LFN attribute).
* Return value.
@ -305,15 +291,15 @@ BOOL dir_write(REG f_node_ptr fnp)
struct buffer FAR *bp;
REG UWORD secsize = fnp->f_dpb->dpb_secsize;
if (!fnp->f_flags.f_ddir)
if (!(fnp->f_flags & F_DDIR))
return FALSE;
/* Update the entry if it was modified by a write or create... */
if (fnp->f_flags.f_dmod)
if (fnp->f_flags & F_DMOD)
{
/* Root is a consecutive set of blocks, so handling is */
/* simple. */
if (fnp->f_flags.f_droot)
if (fnp->f_dirstart == 0)
{
bp = getblock(fnp->f_diroff / (secsize / DIRENT_SIZE)
+ fnp->f_dpb->dpb_dirstrt,
@ -362,7 +348,7 @@ BOOL dir_write(REG f_node_ptr fnp)
return FALSE;
}
if (fnp->f_flags.f_dnew && fnp->f_dir.dir_attrib != D_LFN)
if ((fnp->f_flags & F_DNEW) && fnp->f_dir.dir_attrib != D_LFN)
fmemset(&fnp->f_dir.dir_case, 0, 8);
swap_deleted(fnp->f_dir.dir_name);
@ -382,7 +368,7 @@ BOOL dir_write(REG f_node_ptr fnp)
VOID dir_close(REG f_node_ptr fnp)
{
/* Test for invalid f_nodes */
if (fnp == NULL || !fnp->f_flags.f_ddir)
if (fnp == NULL || !(fnp->f_flags & F_DDIR))
return;
#ifndef IPL
@ -479,10 +465,7 @@ COUNT dos_findfirst(UCOUNT attr, BYTE * name)
else
{
dmp->dm_entry = 0;
if (!fnp->f_flags.f_droot)
dmp->dm_dircluster = fnp->f_dirstart;
else
dmp->dm_dircluster = 0;
dmp->dm_dircluster = fnp->f_dirstart;
dir_close(fnp);
return dos_findnext();
}
@ -526,11 +509,11 @@ COUNT dos_findnext(void)
/* Search through the directory to find the entry, but do a */
/* seek first. */
fnp->f_flags.f_dnew = TRUE;
fnp->f_flags |= F_DNEW;
if (dmp->dm_entry > 0)
{
fnp->f_diroff = dmp->dm_entry - 1;
fnp->f_flags.f_dnew = FALSE;
fnp->f_flags &= ~F_DNEW;
}
/* Loop through the directory */

View File

@ -225,10 +225,7 @@ long dos_open(char *path, unsigned flags, unsigned attrib)
if (status != S_OPENED)
{
init_direntry(&fnp->f_dir, attrib, FREE);
fnp->f_flags.f_dmod = TRUE;
fnp->f_flags.f_ddate = FALSE;
fnp->f_flags.f_dnew = FALSE;
fnp->f_flags.f_ddir = TRUE;
fnp->f_flags = F_DMOD | F_DDIR;
if (!dir_write(fnp))
{
release_f_node(fnp);
@ -245,12 +242,11 @@ long dos_open(char *path, unsigned flags, unsigned attrib)
setdstart(fnp->f_dpb, &fnp->f_dir, FREE);
fnp->f_cluster_offset = 0;
}
fnp->f_flags.f_dmod = (status != S_OPENED);
fnp->f_flags.f_ddate = FALSE;
fnp->f_flags.f_dnew = FALSE;
fnp->f_flags.f_ddir = FALSE;
fnp->f_flags = 0;
if (status != S_OPENED)
fnp->f_flags = F_DMOD;
merge_file_changes(fnp, status == S_OPENED); /* /// Added - Ron Cemer */
/* /// Moved from above. - Ron Cemer */
fnp->f_cluster = getdstart(fnp->f_dpb, &fnp->f_dir);
@ -288,9 +284,9 @@ COUNT dos_close(COUNT fd)
if (fnp == (f_node_ptr) 0)
return DE_INVLDHNDL;
if (fnp->f_flags.f_dmod)
if (fnp->f_flags & F_DMOD)
{
if (fnp->f_flags.f_ddate == FALSE)
if (!(fnp->f_flags & F_DDATE))
{
fnp->f_dir.dir_time = dos_gettime();
fnp->f_dir.dir_date = dos_getdate();
@ -298,7 +294,7 @@ COUNT dos_close(COUNT fd)
merge_file_changes(fnp, FALSE); /* /// Added - Ron Cemer */
}
fnp->f_flags.f_ddir = TRUE;
fnp->f_flags |= F_DDIR;
dir_close(fnp);
return SUCCESS;
@ -443,7 +439,7 @@ COUNT remove_lfn_entries(f_node_ptr fnp)
if (fnp->f_dir.dir_attrib != D_LFN)
break;
fnp->f_dir.dir_name[0] = DELETED;
fnp->f_flags.f_dmod = TRUE;
fnp->f_flags |= F_DMOD;
if (!dir_write(fnp)) return DE_BLKINVLD;
}
fnp->f_diroff = original_diroff - 1;
@ -546,7 +542,7 @@ STATIC COUNT delete_dir_entry(f_node_ptr fnp)
/* The directory has been modified, so set the */
/* bit before closing it, allowing it to be */
/* updated */
fnp->f_flags.f_dmod = TRUE;
fnp->f_flags |= F_DMOD;
dir_close(fnp);
/* SUCCESSful completion, return it */
@ -631,7 +627,7 @@ COUNT dos_rmdir(BYTE * path)
/* Check that the directory is empty. Only the */
/* "." and ".." are permissable. */
fnp->f_flags.f_dmod = FALSE;
fnp->f_flags &= ~F_DMOD;
fnp1 = dir_open(path);
if (fnp1 == NULL)
{
@ -749,9 +745,7 @@ COUNT dos_rename(BYTE * path1, BYTE * path2, int attrib)
/* The directory has been modified, so set the bit before */
/* closing it, allowing it to be updated. */
fnp1->f_flags.f_dmod = fnp2->f_flags.f_dmod = TRUE;
fnp1->f_flags.f_dnew = fnp2->f_flags.f_dnew = FALSE;
fnp1->f_flags.f_ddir = fnp2->f_flags.f_ddir = TRUE;
fnp1->f_flags = fnp2->f_flags = F_DMOD | F_DDIR;
/* Ok, so we can delete this one. Save the file info. */
*(fnp1->f_dir.dir_name) = DELETED;
@ -833,7 +827,7 @@ STATIC BOOL find_free(f_node_ptr fnp)
/* available, tries to extend the directory. */
STATIC int alloc_find_free(f_node_ptr fnp, char *path, char *fcbname)
{
fnp->f_flags.f_dmod = FALSE;
fnp->f_flags &= ~F_DMOD;
dir_close(fnp);
fnp = split_path(path, fcbname);
@ -843,9 +837,9 @@ STATIC int alloc_find_free(f_node_ptr fnp, char *path, char *fcbname)
/* find an empty slot, we need to abort. */
if (find_free(fnp) == 0)
{
if (fnp->f_flags.f_droot)
if (fnp->f_dirstart == 0)
{
fnp->f_flags.f_dmod = FALSE;
fnp->f_flags &= ~F_DMOD;
dir_close(fnp);
return DE_TOOMANY;
}
@ -934,8 +928,8 @@ COUNT dos_setftime(COUNT fd, date dp, time tp)
/* Set the date and time from the fnode and return */
fnp->f_dir.dir_date = dp;
fnp->f_dir.dir_time = tp;
fnp->f_flags.f_dmod = TRUE; /* mark file as modified */
fnp->f_flags.f_ddate = TRUE; /* set this date upon closing */
/* mark file as modified and set this date upon closing */
fnp->f_flags |= F_DMOD | F_DDATE;
save_far_f_node(fnp);
return SUCCESS;
@ -1130,9 +1124,7 @@ COUNT dos_mkdir(BYTE * dir)
init_direntry(&fnp->f_dir, D_DIR, free_fat);
fnp->f_flags.f_dmod = TRUE;
fnp->f_flags.f_dnew = FALSE;
fnp->f_flags.f_ddir = TRUE;
fnp->f_flags = F_DMOD | F_DDIR;
fnp->f_offset = 0l;
@ -1205,7 +1197,7 @@ COUNT dos_mkdir(BYTE * dir)
flush_buffers(dpbp->dpb_unit);
/* Close the directory so that the entry is updated */
fnp->f_flags.f_dmod = TRUE;
fnp->f_flags |= F_DMOD;
dir_close(fnp);
return SUCCESS;
@ -1232,7 +1224,7 @@ STATIC CLUSTER extend(f_node_ptr fnp)
link_fat(fnp->f_dpb, free_fat, LONG_LAST_CLUSTER);
/* Mark the directory so that the entry is updated */
fnp->f_flags.f_dmod = TRUE;
fnp->f_flags |= F_DMOD;
return free_fat;
}
@ -1337,7 +1329,7 @@ COUNT map_cluster(REG f_node_ptr fnp, COUNT mode)
if (relcluster < fnp->f_cluster_offset)
{
/* Set internal index and cluster size. */
fnp->f_cluster = fnp->f_flags.f_ddir ? fnp->f_dirstart :
fnp->f_cluster = (fnp->f_flags & F_DDIR) ? fnp->f_dirstart :
getdstart(fnp->f_dpb, &fnp->f_dir);
fnp->f_cluster_offset = 0;
}
@ -1561,8 +1553,8 @@ long rwblock(COUNT fd, VOID FAR * buffer, UCOUNT count, int mode)
if (mode==XFR_WRITE)
{
fnp->f_dir.dir_attrib |= D_ARCHIVE;
fnp->f_flags.f_dmod = TRUE; /* mark file as modified */
fnp->f_flags.f_ddate = FALSE; /* set date not valid any more */
fnp->f_flags |= F_DMOD; /* mark file as modified */
fnp->f_flags &= ~F_DDATE; /* set date not valid any more */
if (dos_extend(fnp) != SUCCESS)
{
@ -1609,7 +1601,7 @@ long rwblock(COUNT fd, VOID FAR * buffer, UCOUNT count, int mode)
/* Do an EOF test and return whatever was transferred */
/* but only for regular files. */
if (mode == XFR_READ && !(fnp->f_flags.f_ddir) && (fnp->f_offset >= fnp->f_dir.dir_size))
if (mode == XFR_READ && !(fnp->f_flags & F_DDIR) && (fnp->f_offset >= fnp->f_dir.dir_size))
{
save_far_f_node(fnp);
return ret_cnt;
@ -1659,7 +1651,7 @@ long rwblock(COUNT fd, VOID FAR * buffer, UCOUNT count, int mode)
/* see comments above */
if (!fnp->f_flags.f_ddir && /* don't experiment with directories yet */
if (!(fnp->f_flags & F_DDIR) && /* don't experiment with directories yet */
boff == 0) /* complete sectors only */
{
static ULONG startoffset;
@ -1749,7 +1741,7 @@ long rwblock(COUNT fd, VOID FAR * buffer, UCOUNT count, int mode)
/* Then compare to what is left, since we can transfer */
/* a maximum of what is left. */
xfr_cnt = min(to_xfer, secsize - boff);
if (!fnp->f_flags.f_ddir && mode == XFR_READ)
if (!(fnp->f_flags & F_DDIR) && mode == XFR_READ)
xfr_cnt = (UWORD) min(xfr_cnt, fnp->f_dir.dir_size - fnp->f_offset);
/* transfer a block */
@ -2010,8 +2002,7 @@ COUNT dos_setfattr(BYTE * name, UWORD attrp)
/* set attributes that user requested */
fnp->f_dir.dir_attrib |= attrp; /* JPP */
fnp->f_flags.f_dmod = TRUE;
fnp->f_flags.f_ddate = TRUE;
fnp->f_flags |= F_DMOD | F_DDATE;
save_far_f_node(fnp);
dos_close(fd);
return SUCCESS;