mirror of
https://github.com/FDOS/kernel.git
synced 2025-04-08 17:15:17 +02:00
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:
parent
5c72b4a0e9
commit
5d712fc2a6
15
hdr/fnode.h
15
hdr/fnode.h
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user