mirror of
https://github.com/rvtr/twl_wrapsdk.git
synced 2025-06-18 14:25:43 -04:00
RTFSをver.44xからver.44zbへバージョンアップ
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@321 4ee2a332-4b2b-5046-8439-1ba90f034370
This commit is contained in:
parent
6751049144
commit
a7449d85df
@ -37,6 +37,8 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
extern変数
|
||||
*---------------------------------------------------------------------------*/
|
||||
extern void (*func_SDCARD_In)(void); /* カード挿入イベント用コールバック保存用 */
|
||||
extern void (*func_SDCARD_Out)(void); /* カード排出イベント用コールバック保存用 */
|
||||
extern int rtfs_first_stat_flag[26];
|
||||
|
||||
/*SDメモリカードのスペック構造体*/
|
||||
@ -306,7 +308,7 @@ int nandRtfsCtrl( int driveno, int opcode, void* pargs)
|
||||
case DEVCTL_WARMSTART: //attachのときしか呼ばれない
|
||||
PRINTDEBUG( "DEVCTL_WARMSTART\n");
|
||||
/*-- GoIdleセット --*/
|
||||
sdmcGoIdle( NULL, NULL); //カード初期化シーケンス TODO:1ポートだけにする
|
||||
sdmcGoIdle( func_SDCARD_In, func_SDCARD_Out); //カード初期化シーケンス TODO:1ポートだけにする
|
||||
/*------------------*/
|
||||
pdr->drive_flags |= (DRIVE_FLAGS_VALID | DRIVE_FLAGS_REMOVABLE | DRIVE_FLAGS_PARTITIONED);
|
||||
pdr->drive_flags |= DRIVE_FLAGS_INSERTED;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: CTR - SD driver
|
||||
Project: TWL - SD driver
|
||||
File: sdif_reg.h
|
||||
|
||||
Copyright 2006,2007 Nintendo. All rights reserved.
|
||||
|
@ -39,7 +39,7 @@ SRCS = apistat.c prfsapi.c rtlowl.c apickdsk.c apiwrite.c \
|
||||
apifilio.c csjis.c rtdevio.c rtvfat.c apifilmv.c csjistab.c \
|
||||
rtdrobj.c apifrmat.c csstrtab.c rtfat16.c apigetwd.c \
|
||||
rtfat32.c apigfrst.c csunicod.c rtfatxx.c apiinfo.c \
|
||||
portio.c apiinit.c portkern.c \
|
||||
portio.c apiinit.c portkern.c apifastmv.c \
|
||||
apimkdir.c apirealt.c \
|
||||
prapipro.c apiregrs.c prblock.c apisetwd.c \
|
||||
rtkernfn.c \
|
||||
|
@ -12,13 +12,13 @@
|
||||
*
|
||||
* Description - This routine traverses a subdirectory tree. It tests each
|
||||
* directory entry to see if it matches user supplied selection criteria.
|
||||
* if it does match the criteria a user supplied callback function is
|
||||
* if it does match the criteria a user supplied callback function is
|
||||
* called with the full path name of the directory entry and a pointer
|
||||
* to a DSTAT structure that contains detailed information about the
|
||||
* directory entry. (see the manual page for a detailed description of the
|
||||
* DSTAT structure.
|
||||
*
|
||||
* Selection criteria - Two arguments are used to determine the selection
|
||||
*
|
||||
* Selection criteria - Two arguments are used to determine the selection
|
||||
* criteria. On is a flags word that specifies attributes the other is
|
||||
* a pattern that specifies a wild card pattern.
|
||||
* The flags argument contains a bitwise or of one or more of the following:
|
||||
@ -29,10 +29,10 @@
|
||||
* MATCH_DOTDOT - Select the '..' entry MATCH_DIR must be true also
|
||||
*
|
||||
* The selection pattern is a standard wildcard pattern such as '*.*' or
|
||||
* *.txt.
|
||||
* *.txt.
|
||||
* Note: Patterns don't work the same for VFAT and DOS 8.3. If VFAT is
|
||||
* enable the pattern *.* will return any file name that has a '.' in it
|
||||
* in 8.3 systems it returns all files.
|
||||
* in 8.3 systems it returns all files.
|
||||
*
|
||||
* Note: pc_enumerate() requires a fair amount of buffer space to function.
|
||||
* Instead of allocating the space internally we require that the application
|
||||
@ -48,7 +48,7 @@
|
||||
* byte * root_search - Root of the search IE C:\ or C:\USR etc.
|
||||
* word match_flags - Selection flags (see above)
|
||||
* byte match_pattern - Match pattern (see above)
|
||||
* int maxdepth - Maximum depth of the traversal.
|
||||
* int maxdepth - Maximum depth of the traversal.
|
||||
* Note: to scan only one level set this to
|
||||
* 1. For all levels set it to 99
|
||||
* PENUMCALLBACK pcallback - User callback function. (see below)
|
||||
@ -66,44 +66,44 @@
|
||||
* About the callback.
|
||||
*
|
||||
* The callback function is a function that returns an integer and is passed
|
||||
* the fully qualified path to the current directory entry and a DSTAT
|
||||
* the fully qualified path to the current directory entry and a DSTAT
|
||||
* structure. The callback fuction must return 0 if it wishes the scan to
|
||||
* continue or any other integer value to stop the scan and return the
|
||||
* callback's return value to the application layer.
|
||||
* continue or any other integer value to stop the scan and return the
|
||||
* callback's return value to the application layer.
|
||||
*
|
||||
* Examples
|
||||
*
|
||||
* The next two function implement a multilevel directory scan.
|
||||
* int rdir_callback(byte *path, DSTAT *d) {printf("%s\n", path);return(0);}
|
||||
*
|
||||
*
|
||||
* rdir(byte *path, byte *pattern)
|
||||
* {
|
||||
* pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
* pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
* (MATCH_DIR|MATCH_VOL|MATCH_FILES), pattern, 99, rdir_callback);
|
||||
* }
|
||||
*
|
||||
* Poor mans deltree package
|
||||
*
|
||||
* Poor mans deltree package
|
||||
* int delfile_callback(byte *path, DSTAT *d) {
|
||||
* pc_unlink(path); return(0);
|
||||
* }
|
||||
* int deldir_callback(byte *path, DSTAT *d) {
|
||||
* pc_rmdir(path); return(0);
|
||||
* }
|
||||
*
|
||||
*
|
||||
*
|
||||
* deltree(byte *path)
|
||||
* {
|
||||
* int i;
|
||||
* ==> First delete all of the files
|
||||
* pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
* pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
* (MATCH_FILES), "*",99, delfile_callback);
|
||||
* i = 0;
|
||||
* ==> Now delete all of the dirs.. deleting path won't work until the
|
||||
* ==> tree is empty
|
||||
* ==> Now delete all of the dirs.. deleting path won't work until the
|
||||
* ==> tree is empty
|
||||
* while(!pc_rmdir(path) && i++ < 50)
|
||||
* pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
* pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
* (MATCH_DIR), "*", 99, deldir_callback);
|
||||
* }
|
||||
* }
|
||||
*
|
||||
*/
|
||||
|
||||
@ -172,24 +172,24 @@ int pc_enumerate( /* __apifn__ */
|
||||
for(i = 0; i < 8; i++) if (filepat[i]==' ') filepat[i]=0;
|
||||
for(i = 0; i < 3; i++) if (extpat[i]==' ') extpat[i]=0;
|
||||
#endif
|
||||
|
||||
|
||||
ret_val = 0;
|
||||
pc_str2upper((byte *)from_path_buffer, (byte *) root_search);
|
||||
|
||||
|
||||
depth = 0;
|
||||
|
||||
|
||||
pc_mpath(from_pattern_buffer, from_path_buffer, (byte *)ALL_FILES);
|
||||
|
||||
|
||||
dir_index[0] = 0;
|
||||
dir_block[0] = 0;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
step_into_dir:
|
||||
dodone = 0;
|
||||
|
||||
if (pc_gfirst(&statobj, (byte *)from_pattern_buffer))
|
||||
{
|
||||
|
||||
if (pc_gfirst(&statobj, (byte *)from_pattern_buffer))
|
||||
{
|
||||
dodone = 1;
|
||||
process_it = 0;
|
||||
do
|
||||
@ -204,30 +204,30 @@ step_into_dir:
|
||||
if (process_it)
|
||||
{
|
||||
call_back = 1;
|
||||
|
||||
/* Don't report directories if not requested */
|
||||
|
||||
/* Don't report directories if not requested */
|
||||
if ((statobj.fattribute & ADIRENT) &&
|
||||
!(match_flags & MATCH_DIR) )
|
||||
call_back = 0;
|
||||
|
||||
/* Don't report volumes if not requested */
|
||||
|
||||
/* Don't report volumes if not requested */
|
||||
if (call_back && (statobj.fattribute & AVOLUME) &&
|
||||
!(match_flags & MATCH_VOL) )
|
||||
call_back = 0;
|
||||
|
||||
/* Don't report plain files if not requested */
|
||||
|
||||
/* Don't report plain files if not requested */
|
||||
if (call_back && !(statobj.fattribute & (AVOLUME|ADIRENT)) &&
|
||||
!(match_flags & MATCH_FILES) )
|
||||
call_back = 0;
|
||||
|
||||
/* Don't report DOT if not requested */
|
||||
|
||||
/* Don't report DOT if not requested */
|
||||
if (call_back && dirscan_isdot(&statobj) && !(match_flags & MATCH_DOT))
|
||||
call_back = 0;
|
||||
|
||||
/* Don't report DOTDOT if not requested */
|
||||
|
||||
/* Don't report DOTDOT if not requested */
|
||||
if (call_back && dirscan_isdotdot(&statobj) && !(match_flags & MATCH_DOTDOT))
|
||||
call_back = 0;
|
||||
|
||||
|
||||
if (call_back)
|
||||
{
|
||||
/* Take it if the pattern match work */
|
||||
@ -240,7 +240,7 @@ step_into_dir:
|
||||
#else
|
||||
/* Non VFAT uses 8.3 matching conventions */
|
||||
pc_ascii_fileparse(filepat, extpat, (byte *)match_pattern);
|
||||
call_back =
|
||||
call_back =
|
||||
pc_patcmp_8((byte *)&statobj.fname[0], (byte *)&filepat[0] , TRUE);
|
||||
call_back = call_back &&
|
||||
pc_patcmp_3((byte *)&statobj.fext[0], (byte *)&extpat[0] , TRUE);
|
||||
@ -267,7 +267,7 @@ step_into_dir:
|
||||
{
|
||||
/* Construct the full path */
|
||||
pc_mpath(spath_buffer, from_path_buffer, (byte *)statobj.filename);
|
||||
|
||||
|
||||
if (statobj.fattribute & (AVOLUME | ADIRENT))
|
||||
{
|
||||
if (pc_gnext(&statobj))
|
||||
@ -277,7 +277,7 @@ step_into_dir:
|
||||
dir_index[depth] = ((DROBJ *) (statobj.pobj))->blkinfo.my_index;
|
||||
dodone = 0;
|
||||
pc_gdone(&statobj);
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -285,23 +285,23 @@ step_into_dir:
|
||||
pc_gdone(&statobj);
|
||||
dir_index[depth] = -1;
|
||||
}
|
||||
|
||||
|
||||
depth += 1;
|
||||
dir_block[depth] = 0;
|
||||
dir_index[depth] = 0;
|
||||
|
||||
|
||||
rtfs_cs_strcpy((byte *)from_path_buffer, (byte *)spath_buffer);
|
||||
pc_mpath(from_pattern_buffer, from_path_buffer, (byte *)ALL_FILES);
|
||||
|
||||
|
||||
goto step_into_dir;
|
||||
}
|
||||
}
|
||||
} while (pc_gnext(&statobj)); /* Get the next file in dir */
|
||||
|
||||
|
||||
if (dodone)
|
||||
pc_gdone(&statobj);
|
||||
}
|
||||
|
||||
|
||||
if (!get_parent_path(from_path_buffer, from_path_buffer))
|
||||
break;
|
||||
pc_mpath(from_pattern_buffer, from_path_buffer, (byte *)ALL_FILES);
|
||||
@ -309,7 +309,12 @@ step_into_dir:
|
||||
while (depth >= 0 && dir_index[depth] == -1)
|
||||
{
|
||||
if (!get_parent_path(from_path_buffer, from_path_buffer))
|
||||
break;
|
||||
{
|
||||
if(depth == 0) /* If we are at the root and have no more files, exit */
|
||||
goto ex_it;
|
||||
else
|
||||
break;
|
||||
}
|
||||
pc_mpath(from_pattern_buffer, from_path_buffer, (byte *)ALL_FILES);
|
||||
depth--;
|
||||
}
|
||||
@ -322,9 +327,9 @@ int get_parent_path(byte *parent, byte *path)
|
||||
{
|
||||
byte *last_backslash;
|
||||
int size;
|
||||
|
||||
|
||||
last_backslash = 0;
|
||||
|
||||
|
||||
size = 0;
|
||||
while (*path != '\0')
|
||||
{
|
||||
@ -336,11 +341,11 @@ int get_parent_path(byte *parent, byte *path)
|
||||
*(parent++) = *(path++);
|
||||
}
|
||||
/* This is to prevent catastrophie if caller ignores failure */
|
||||
*parent = '\0';
|
||||
|
||||
*parent = '\0';
|
||||
|
||||
if (size < 3)
|
||||
return (0);
|
||||
|
||||
|
||||
if (last_backslash)
|
||||
*last_backslash = '\0';
|
||||
return (1);
|
||||
@ -365,7 +370,7 @@ int dirscan_isdotdot(DSTAT *statobj)
|
||||
}
|
||||
|
||||
#ifdef NOTDEF
|
||||
/* The section from here to the bottom of the file contains code that
|
||||
/* The section from here to the bottom of the file contains code that
|
||||
shows via example how to use the enumerate function.
|
||||
*/
|
||||
|
||||
@ -401,21 +406,21 @@ int main(int argc,byte **argv)
|
||||
byte filter[20];
|
||||
byte op;
|
||||
rtfs_kernel_init();
|
||||
|
||||
|
||||
argc--;
|
||||
argv++;
|
||||
|
||||
|
||||
if (argc < 2)
|
||||
{
|
||||
goto usage;
|
||||
}
|
||||
op = *argv[0];
|
||||
rtfs_cs_strcpy((byte *)filter,FILTER);
|
||||
|
||||
|
||||
argc--; argv++;
|
||||
/* Process user options */
|
||||
rtfs_cs_strcpy(src_path,*argv);
|
||||
|
||||
|
||||
argc--; argv++;
|
||||
if (argc)
|
||||
{
|
||||
@ -425,7 +430,7 @@ int main(int argc,byte **argv)
|
||||
{
|
||||
rtfs_cs_strcpy((byte *)filter,FILTER);
|
||||
}
|
||||
|
||||
|
||||
if (op=='R')
|
||||
{
|
||||
rdir(src_path, filter);
|
||||
@ -439,9 +444,9 @@ int main(int argc,byte **argv)
|
||||
usage:
|
||||
RTFS_PRINTF("(R)dir or (D)eltree PATH [pattern]\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* treeprintnew (src_path, filter, be_verbose); */
|
||||
}
|
||||
|
||||
@ -459,7 +464,7 @@ int rdir_callback(byte *path, DSTAT *d)
|
||||
|
||||
rdir(byte *path, byte *pattern)
|
||||
{
|
||||
pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
(MATCH_DIR|MATCH_VOL|MATCH_FILES), pattern, 99, rdir_callback);
|
||||
}
|
||||
|
||||
@ -482,19 +487,18 @@ deltree(byte *path)
|
||||
{
|
||||
int i;
|
||||
/* First delete all of the files */
|
||||
pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
(MATCH_FILES), "*",99, delfile_callback);
|
||||
i = 0;
|
||||
/* Now delete all of the dirs.. deleting the root of the path won't
|
||||
work until the tree is empty */
|
||||
while(!pc_rmdir(path) && i++ < 50)
|
||||
{
|
||||
pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
pc_enumerate(from_path,from_pattern,spath,dpath,path,
|
||||
(MATCH_DIR), "*", 99, deldir_callback);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* (!INCLUDE_CS_UNICODE) BUGBUG - Not doing ENUM yet */
|
||||
|
||||
|
1096
build/libraries/fatfs/ARM7/apifastmv.c
Normal file
1096
build/libraries/fatfs/ARM7/apifastmv.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -776,27 +776,36 @@ BOOLEAN _po_ulseek(PC_FILE *pfile, dword offset, dword *new_offset, int origin)
|
||||
else if (origin == PSEEK_CUR_NEG) /* offset from current file pointer */
|
||||
{
|
||||
file_pointer = pfile->fptr;
|
||||
if (file_pointer > offset)
|
||||
if (file_pointer >= offset)
|
||||
file_pointer -= offset;
|
||||
else
|
||||
file_pointer = 0;
|
||||
|
||||
{ /* Seek before beginning of file is an error */
|
||||
p_errno = PEINVALIDPARMS;
|
||||
goto errex;
|
||||
}
|
||||
}
|
||||
else if (origin == PSEEK_END) /* offset from end of file */
|
||||
{
|
||||
file_pointer = pfile->pobj->finode->fsize;
|
||||
if (file_pointer > offset)
|
||||
if (file_pointer >= offset)
|
||||
file_pointer -= offset;
|
||||
else
|
||||
file_pointer = 0;
|
||||
{ /* Seek before beginning of file is an error */
|
||||
p_errno = PEINVALIDPARMS;
|
||||
goto errex;
|
||||
}
|
||||
}
|
||||
else /* Illegal origin */
|
||||
{
|
||||
p_errno = PEINVALIDPARMS;
|
||||
goto errex;
|
||||
}
|
||||
|
||||
if (file_pointer >= pfile->pobj->finode->fsize)
|
||||
if (file_pointer > pfile->pobj->finode->fsize)
|
||||
{ /* Seek past end of file is an error */
|
||||
p_errno = PEINVALIDPARMS;
|
||||
goto errex;
|
||||
}
|
||||
if (file_pointer == pfile->pobj->finode->fsize)
|
||||
{
|
||||
file_pointer = pfile->pobj->finode->fsize;
|
||||
|
||||
@ -942,29 +951,44 @@ long _po_lseek(PC_FILE *pfile, long offset, int origin) /*__fn__*/
|
||||
{
|
||||
long ret_val;
|
||||
int u_origin;
|
||||
dword new_offset/*, u_offset*/;
|
||||
dword new_offset, u_offset;
|
||||
|
||||
/*u_offset = offset;*/
|
||||
u_offset = (dword) offset;
|
||||
u_origin = origin;
|
||||
|
||||
if (origin == PSEEK_CUR) /* offset from current file pointer */
|
||||
if (origin == PSEEK_SET) /* offset from beginning of file */
|
||||
{
|
||||
if (offset < 0)
|
||||
{
|
||||
/* Negative seek from beginning is an error */
|
||||
rtfs_set_errno(PEINVALIDPARMS);
|
||||
return(-1L);
|
||||
}
|
||||
}
|
||||
else if (origin == PSEEK_CUR) /* offset from current file pointer */
|
||||
{
|
||||
if (offset < 0)
|
||||
{
|
||||
offset = -offset;
|
||||
/*u_offset = (dword) offset;*/
|
||||
u_offset = (dword) offset;
|
||||
u_origin = PSEEK_CUR_NEG;
|
||||
}
|
||||
}
|
||||
else if (origin == PSEEK_END) /* offset from end of file */
|
||||
{
|
||||
if (offset < 0)
|
||||
if (offset <= 0)
|
||||
{
|
||||
offset = -offset;
|
||||
/*u_offset = (dword) offset;*/
|
||||
u_offset = (dword) offset;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Positve seek from end is an error */
|
||||
rtfs_set_errno(PEINVALIDPARMS);
|
||||
return(-1L);
|
||||
}
|
||||
}
|
||||
if (!_po_ulseek(pfile, offset, &new_offset, u_origin))
|
||||
if (!_po_ulseek(pfile, u_offset, &new_offset, u_origin))
|
||||
ret_val = -1L;
|
||||
else
|
||||
ret_val = (long) new_offset;
|
||||
|
@ -137,7 +137,10 @@ BOOLEAN pc_mv(byte *old_name, byte *new_name) /*__apifn__*/
|
||||
/* Find the parent and make sure it is a directory */
|
||||
new_parent_obj = pc_fndnode(path);
|
||||
if (!new_parent_obj || !pc_isadir(new_parent_obj) || pc_isavol(new_parent_obj))
|
||||
{
|
||||
p_errno = PEINVALIDPATH;
|
||||
goto errex;
|
||||
}
|
||||
|
||||
|
||||
/* The cluster value old */
|
||||
|
@ -15,7 +15,7 @@
|
||||
/* */
|
||||
void get_format_parameters(dword nblocks, int *psector_p_alloc, int *pnum_root_entries);
|
||||
word pc_fat_size(word nreserved, word cluster_size, word n_fat_copies,
|
||||
word root_sectors, dword volume_size,
|
||||
word root_sectors, dword volume_size,
|
||||
int *nibs_per_entry);
|
||||
|
||||
|
||||
@ -71,13 +71,13 @@ void pc_calculate_chs(dword total, dword *cylinders, int *heads, int *secptrack)
|
||||
Description
|
||||
Queries the drive s associated device driver for a description of the
|
||||
installed media. This information is used by the pc_format_media,
|
||||
pc_partition_media and pc_format_volume routines. The application may
|
||||
use the results of this call to calculate how it wishes the media to
|
||||
pc_partition_media and pc_format_volume routines. The application may
|
||||
use the results of this call to calculate how it wishes the media to
|
||||
be partitioned.
|
||||
|
||||
Note that the floppy device driver uses a back door to communicate
|
||||
with the format routine through the geometry structure. This allows us
|
||||
to not have floppy specific code in the format routine but still use the
|
||||
with the format routine through the geometry structure. This allows us
|
||||
to not have floppy specific code in the format routine but still use the
|
||||
exact format parameters that DOS uses when it formats a floppy.
|
||||
|
||||
See the following definition of the pgeometry structure:
|
||||
@ -138,7 +138,7 @@ inval:
|
||||
|
||||
/* The geometry consists of cylinders, heads, and sectors
|
||||
per track.
|
||||
The ATA spec says that the maximum values for these are
|
||||
The ATA spec says that the maximum values for these are
|
||||
65536 cylinders, 16 heads, and 255 sectors per track.
|
||||
However, the MBR spec says the maximum values are
|
||||
1023 cylinders, 255 heads, and 63 sectors per track.
|
||||
@ -163,9 +163,9 @@ Returns
|
||||
Returns TRUE if it was able to perform the operation otherwise
|
||||
it returns FALSE.
|
||||
|
||||
Note: The the logical drive must be claimed before this routine is
|
||||
Note: The the logical drive must be claimed before this routine is
|
||||
called and later released by the caller.
|
||||
|
||||
|
||||
errno is set to one of the following
|
||||
0 - No error
|
||||
PEINVALIDDRIVEID- Drive component is invalid
|
||||
@ -213,7 +213,7 @@ inval:
|
||||
|
||||
Description
|
||||
A partition list is provided (a list of partition sizes
|
||||
in units of LBA s) by the user.
|
||||
in units of LBA s) by the user.
|
||||
|
||||
Returns
|
||||
Returns TRUE if it was able to perform the operation otherwise
|
||||
@ -224,7 +224,7 @@ Returns
|
||||
PEINVALIDDRIVEID- Drive component is invalid
|
||||
PEINVALIDPARMS - Inconsistent or missing parameters
|
||||
PEIOERRORWRITE - Error writing partition table
|
||||
An ERTFS system error
|
||||
An ERTFS system error
|
||||
****************************************************************************/
|
||||
|
||||
BOOLEAN pc_partition_media(byte *path, PDEV_GEOMETRY pgeometry, dword * partition_list) /* __apifn__*/
|
||||
@ -279,7 +279,7 @@ inval:
|
||||
/* 10-24-2000 - New code to support lba formatting */
|
||||
/* The first partition starts at cylinder=0, head=1, sector=1 */
|
||||
if (pgeometry->dev_geometry_lbas)
|
||||
starting_lba = (dword) pgeometry->dev_geometry_secptrack;
|
||||
starting_lba = (dword) pgeometry->dev_geometry_secptrack;
|
||||
else
|
||||
{
|
||||
starting_lba = 0; /* Not used */
|
||||
@ -302,9 +302,9 @@ inval:
|
||||
{
|
||||
/* 10-24-2000 - New code to support lba formatting */
|
||||
/* Apparently, we must still align to cylinders even in LBA mode */
|
||||
dwTemp = (dword) pgeometry->dev_geometry_heads;
|
||||
dwTemp = (dword) pgeometry->dev_geometry_heads;
|
||||
dwTemp *= (dword) pgeometry->dev_geometry_secptrack;
|
||||
partition_size = ((partition_size / dwTemp) * dwTemp) - (starting_lba % dwTemp);
|
||||
partition_size = ((partition_size / dwTemp) * dwTemp) - (starting_lba % dwTemp);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -351,13 +351,13 @@ inval:
|
||||
/* Load the starting CHS */
|
||||
part.ents[partition_number].s_head = head;
|
||||
utemp = (word)((cyl & 0xff) << 8); /* Low 8 bit to hi bite */
|
||||
utemp2 = (word)((cyl >> 2) & 0xc0); /* Hi 2 bits to bits 6 + 7 */
|
||||
utemp2 = (word)((cyl >> 2) & 0xc0); /* Hi 2 bits to bits 6 + 7 */
|
||||
utemp |= utemp2;
|
||||
utemp |= sec;
|
||||
fr_WORD((byte *)&(part.ents[partition_number].s_cyl), utemp);
|
||||
|
||||
/* Load the starting LBA */
|
||||
fr_DWORD((byte *)&(part.ents[partition_number].r_sec), starting_lba);
|
||||
fr_DWORD((byte *)&(part.ents[partition_number].r_sec), starting_lba);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -414,7 +414,7 @@ inval:
|
||||
/* Load the ending CHS */
|
||||
part.ents[partition_number].e_head = head;
|
||||
utemp = (word)((cyl & 0xff) << 8); /* Low 8 bit to hi bite */
|
||||
utemp2 = (word)((cyl >> 2) & 0xc0); /* Hi 2 bits to bits 6 + 7 */
|
||||
utemp2 = (word)((cyl >> 2) & 0xc0); /* Hi 2 bits to bits 6 + 7 */
|
||||
utemp |= utemp2;
|
||||
utemp |= sec;
|
||||
fr_WORD((byte *)&(part.ents[partition_number].e_cyl), utemp);
|
||||
@ -426,15 +426,15 @@ inval:
|
||||
part.ents[partition_number].e_head = (byte) (pgeometry->dev_geometry_heads-1);
|
||||
/* Ending cylinder is in the top ten bits, secptrack in lower 6 ?? */
|
||||
/* Relative sector starting */
|
||||
fr_DWORD((byte *)&(part.ents[partition_number].r_sec), (dword) pgeometry->dev_geometry_secptrack*starting_cylinder);
|
||||
fr_DWORD((byte *)&(part.ents[partition_number].r_sec), (dword) pgeometry->dev_geometry_secptrack*starting_cylinder);
|
||||
|
||||
/* Set up for the next partition and use new value to calculate ending cyl */
|
||||
starting_cylinder = (word)((word)starting_cylinder + (word) *(partition_list+partition_number));
|
||||
utemp = (word)(((starting_cylinder-1) & 0xff) << 8); /* Low 8 bit to hi bite */
|
||||
utemp2 = (word)(((starting_cylinder-1) >> 2) & 0xc0); /* Hi 2 bits to bits 6 + 7 */
|
||||
utemp2 = (word)(((starting_cylinder-1) >> 2) & 0xc0); /* Hi 2 bits to bits 6 + 7 */
|
||||
utemp |= utemp2;
|
||||
utemp |= (word) pgeometry->dev_geometry_secptrack;
|
||||
|
||||
|
||||
fr_WORD((byte *)&(part.ents[partition_number].e_cyl), utemp);
|
||||
/* And partition size */
|
||||
fr_DWORD((byte *)&(part.ents[partition_number].p_size), partition_size);
|
||||
@ -480,17 +480,17 @@ Description
|
||||
drive structure is queried to determine if the device is parttioned
|
||||
or not. If the device is partitioned then the partition table is read
|
||||
and the volume within the partition is formatted. If it is a non
|
||||
partitioned device the device is formatted according to the supplied
|
||||
partitioned device the device is formatted according to the supplied
|
||||
pgeometry parameters. The pgeometry parameter contains the the media
|
||||
size in HCN format. It also contains a
|
||||
size in HCN format. It also contains a
|
||||
|
||||
Note: The the logical drive must be claimed before this routine is
|
||||
Note: The the logical drive must be claimed before this routine is
|
||||
called and later released by the caller.
|
||||
|
||||
Returns
|
||||
Returns TRUE if it was able to perform the operation otherwise
|
||||
it returns FALSE.
|
||||
|
||||
|
||||
errno is set to one of the following
|
||||
0 - No error
|
||||
PEINVALIDDRIVEID- Drive component is invalid
|
||||
@ -498,8 +498,8 @@ Returns
|
||||
PEINVALIDMBR - Partitioned device has no master boot record
|
||||
PEINVALIDMBROFFSET - Requested partition has no entry in master boot record
|
||||
PEINVALIDPARMS - Inconsistent or missing parameters
|
||||
PEIOERRORWRITE - Error writing during format
|
||||
An ERTFS system error
|
||||
PEIOERRORWRITE - Error writing during format
|
||||
An ERTFS system error
|
||||
****************************************************************************/
|
||||
|
||||
BOOLEAN pc_format_volume(byte *path, PDEV_GEOMETRY pgeometry) /* __apifn__*/
|
||||
@ -541,9 +541,9 @@ int nibs_per_entry,partition_status;
|
||||
if (pgeometry->fmt_parms_valid)
|
||||
{
|
||||
if( ((pgeometry->fmt.numcyl * pgeometry->fmt.numhead * pgeometry->fmt.secptrk) / pgeometry->fmt.secpalloc) > 0xFFFF) {
|
||||
return(pc_mkfs32(driveno, &pgeometry->fmt, TRUE)); /* TRUE == RAW IO */ //ctr modified
|
||||
return(pc_mkfs32(driveno, &pgeometry->fmt, TRUE)); /* TRUE == RAW IO */
|
||||
}else{
|
||||
return(pc_mkfs16(driveno, &pgeometry->fmt, TRUE)); /* TRUE == RAW IO */
|
||||
return(pc_mkfs16(driveno, &pgeometry->fmt, TRUE)); /* TRUE == RAW IO */
|
||||
}
|
||||
}
|
||||
|
||||
@ -557,7 +557,7 @@ int nibs_per_entry,partition_status;
|
||||
if (partition_status == READ_PARTION_OK)
|
||||
{
|
||||
partition_size = pdr->partition_size;
|
||||
ltemp = partition_size /
|
||||
ltemp = partition_size /
|
||||
(dword)(pgeometry->dev_geometry_heads * pgeometry->dev_geometry_secptrack);
|
||||
n_cyls = (word) ltemp;
|
||||
raw_mode_io = FALSE;
|
||||
@ -611,15 +611,10 @@ int nibs_per_entry,partition_status;
|
||||
fmt.secreserved = (word) 32;
|
||||
if (pdr->drive_flags & DRIVE_FLAGS_PARTITIONED)
|
||||
{
|
||||
if (pgeometry->dev_geometry_lbas)
|
||||
/* 10-24-2000 - New code to support lba formatting */
|
||||
fmt.numhide = (unsigned long) 0; /*PS Does not work as fmt.secptrk here */
|
||||
else
|
||||
/* 10-24-2000 - This was the original code */
|
||||
fmt.numhide = (unsigned long) fmt.secptrk;
|
||||
fmt.numhide = pdr->partition_base;
|
||||
}
|
||||
else
|
||||
fmt.numhide = (unsigned long) pgeometry->fmt.numhide; //ctr modified
|
||||
fmt.numhide = (unsigned long) 0;
|
||||
fmt.secpfat = (word) 0;
|
||||
fmt.numroot = (word) 0;
|
||||
fmt.mediadesc = (byte) 0xF8;
|
||||
@ -627,8 +622,11 @@ int nibs_per_entry,partition_status;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pdr->drive_flags & DRIVE_FLAGS_PARTITIONED)
|
||||
fmt.numhide = pdr->partition_base;
|
||||
else
|
||||
fmt.numhide = 0;
|
||||
fmt.secreserved = (word) 1;
|
||||
fmt.numhide = pgeometry->fmt.numhide; //ctr modified
|
||||
fmt.secpfat = (word) secpfat;
|
||||
fmt.numroot = (word) root_entries;
|
||||
fmt.mediadesc = (byte) 0xF8;
|
||||
@ -644,15 +642,15 @@ int nibs_per_entry,partition_status;
|
||||
Given a drive number and a format parameter block. Put an MS-DOS
|
||||
file system on the drive:
|
||||
The disk MUST already have a low level format. All blocks on the drive
|
||||
should be intitialize with E5s or zeros.
|
||||
|
||||
should be intitialize with E5s or zeros.
|
||||
|
||||
see pcmkfs in the samples directory.
|
||||
|
||||
Some common parameters. Note: For other drive types use debug to get the
|
||||
parameters from block zero after FORMAT has been run.
|
||||
parameters from block zero after FORMAT has been run.
|
||||
|
||||
360 720 20M 80M (DRIVE SIZE)
|
||||
oemname ===== UP TO YOU. ONLY 8 Chars matter. Right filled with spaces
|
||||
oemname ===== UP TO YOU. ONLY 8 Chars matter. Right filled with spaces
|
||||
secpalloc 2 2 4 8
|
||||
secreserved 1 1 1 1
|
||||
numfats 2 2 2 2
|
||||
@ -674,14 +672,14 @@ See Also:
|
||||
|
||||
|
||||
word pc_fat_size(word nreserved, word cluster_size, word n_fat_copies,
|
||||
word root_sectors, dword volume_size,
|
||||
word root_sectors, dword volume_size,
|
||||
int *nibs_per_entry) /*__fn__*/
|
||||
{
|
||||
|
||||
dword fat_size;
|
||||
dword total_clusters;
|
||||
word entries_per_block;
|
||||
|
||||
|
||||
#if (FAT32)
|
||||
if ((root_sectors == 0) || ((volume_size>>11) >= 512))/* FAT32 Format */
|
||||
{
|
||||
@ -697,12 +695,12 @@ word pc_fat_size(word nreserved, word cluster_size, word n_fat_copies,
|
||||
total_clusters /= cluster_size;
|
||||
|
||||
/* Calculate the number of fat entries per block in the FAT. If
|
||||
< 4087 clusters total the fat entries are 12 bits hence 341
|
||||
< 4087 clusters total the fat entries are 12 bits hence 341
|
||||
will fit. else 256 will fit
|
||||
we add in n_fat_copies * 12 here since it take 12 blocks to represent
|
||||
4087 clusters in 3 nibble form. So we add in the worst case FAT size
|
||||
here to enhance the accuracy of our guess of the total clusters.
|
||||
*/
|
||||
*/
|
||||
|
||||
if (total_clusters <= (dword) (4087 + (n_fat_copies * 12)) )
|
||||
{
|
||||
@ -717,7 +715,7 @@ word pc_fat_size(word nreserved, word cluster_size, word n_fat_copies,
|
||||
|
||||
fat_size = (total_clusters + entries_per_block - 1)/entries_per_block;
|
||||
|
||||
return((word) fat_size);
|
||||
return((word) fat_size);
|
||||
}
|
||||
|
||||
/* Choose format parameters based on the number of blocks in the volume */
|
||||
@ -780,4 +778,3 @@ void get_format_parameters(dword nblocks, int *psectors_per_alloc, int *pnum_roo
|
||||
*pnum_root_entries = num_root_entries;
|
||||
}
|
||||
|
||||
|
||||
|
@ -9,16 +9,17 @@
|
||||
/* APIGFRST.C - Contains user api level source code.
|
||||
|
||||
The following routines are included:
|
||||
|
||||
|
||||
pc_gfirst - Get stats on the first file to match a pattern.
|
||||
pc_gnext - Get stats on the next file to match a pattern.
|
||||
pc_gdone - Free resources used by pc_gfirst/pc_gnext.
|
||||
pc_upstat - Copy directory entry info to a user s stat buffer
|
||||
pc_upstat - Copy directory entry info to a user s stat buffer
|
||||
|
||||
*/
|
||||
|
||||
#include <rtfs.h>
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
PC_GFIRST - Get first entry in a directory to match a pattern.
|
||||
|
||||
@ -43,10 +44,11 @@
|
||||
PEINVALIDDRIVEID- Drive component is invalid
|
||||
PEINVALIDPATH - Path specified badly formed.
|
||||
PENOENT - Not found, no match
|
||||
An ERTFS system error
|
||||
An ERTFS system error
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
void pc_upstat(DSTAT *statobj);
|
||||
|
||||
BOOLEAN pc_gfirst(DSTAT *statobj, byte *name) /*__apifn__*/
|
||||
@ -59,7 +61,6 @@ BOOLEAN pc_gfirst(DSTAT *statobj, byte *name) /*__apifn__*/
|
||||
CHECK_MEM(BOOLEAN, 0) /* Make sure memory is initted */
|
||||
|
||||
rtfs_set_errno(0); /* po_gfirst: clear error status */
|
||||
|
||||
rtfs_memset((byte *) statobj,0,sizeof(*statobj));
|
||||
/* statobj->pobj = 0; */
|
||||
/* statobj->pmom = 0; */
|
||||
@ -95,22 +96,24 @@ BOOLEAN pc_gfirst(DSTAT *statobj, byte *name) /*__apifn__*/
|
||||
if (statobj->pmom)
|
||||
/* Found it. Check access permissions */
|
||||
{
|
||||
if(pc_isadir((DROBJ *)(statobj->pmom)))
|
||||
if(pc_isadir((DROBJ *)(statobj->pmom)))
|
||||
{
|
||||
/* Now find pattern in the directory */
|
||||
statobj->pobj = (void *) pc_get_inode(0, (DROBJ *)(statobj->pmom), filename, (byte*) fileext, GET_INODE_WILD);
|
||||
if (statobj->pobj)
|
||||
{
|
||||
{
|
||||
/* And update the stat structure */
|
||||
pc_upstat(statobj);
|
||||
|
||||
/* remember the drive number. used by gnext et al. */
|
||||
statobj->driveno = driveno;
|
||||
/* 9-20-94 release the FINODE and allocate a dummy. This will keep everyone
|
||||
who expects the drobj to own a finode happy but will not leave the
|
||||
finode open which locks out unlink et al */
|
||||
/* 9-20-94 release the FINODE and allocate a dummy. This will keep everyone
|
||||
who expects the drobj to own a finode happy but will not leave the
|
||||
finode open which locks out unlink et al */
|
||||
pc_freei(((DROBJ *)(statobj->pobj))->finode); /* Release the current */
|
||||
((DROBJ *)(statobj->pobj))->finode = pc_alloci();
|
||||
/* 3-07-07 - Change: Remove additional call to pc_alloci(). Was not needed and caused a leak
|
||||
on a hot swap event when a gfirst is outstanding */
|
||||
((DROBJ *)(statobj->pobj))->finode = 0;
|
||||
/* END 9-20-94 */
|
||||
/* Remember the unique number associated with the drive
|
||||
mount. If the drive is closed before we call gnext or
|
||||
@ -121,8 +124,8 @@ BOOLEAN pc_gfirst(DSTAT *statobj, byte *name) /*__apifn__*/
|
||||
}
|
||||
else
|
||||
{
|
||||
/* pc_gfirst: if statobj->pobj is 0 pc_get_inode() has set errno to PENOENT or
|
||||
to an internal or IO error status
|
||||
/* pc_gfirst: if statobj->pobj is 0 pc_get_inode() has set errno to PENOENT or
|
||||
to an internal or IO error status
|
||||
if PENOENT set we will clear errno */
|
||||
if (get_errno() == PENOENT)
|
||||
rtfs_set_errno(0); /* pc_gfirst: file not found in directory
|
||||
@ -157,7 +160,7 @@ BOOLEAN pc_gfirst(DSTAT *statobj, byte *name) /*__apifn__*/
|
||||
0 - No error
|
||||
PEINVALIDPARMS - statobj argument is not valid
|
||||
PENOENT - Not found, no match (normal termination of scan)
|
||||
An ERTFS system error
|
||||
An ERTFS system error
|
||||
****************************************************************************/
|
||||
|
||||
BOOLEAN pc_gnext(DSTAT *statobj) /*__apifn__*/
|
||||
@ -165,7 +168,7 @@ BOOLEAN pc_gnext(DSTAT *statobj) /*__apifn__*/
|
||||
DROBJ *nextobj;
|
||||
DDRIVE *pdrive;
|
||||
CHECK_MEM(BOOLEAN, 0) /* Make sure memory is initted */
|
||||
/* see if the drive is still mounted. Do not use pmom et al. since they
|
||||
/* see if the drive is still mounted. Do not use pmom et al. since they
|
||||
may be purged */
|
||||
if (!statobj || !statobj->pmom)
|
||||
{
|
||||
@ -176,7 +179,7 @@ BOOLEAN pc_gnext(DSTAT *statobj) /*__apifn__*/
|
||||
return(FALSE);
|
||||
pdrive = pc_drno2dr(statobj->driveno);
|
||||
if (statobj->drive_opencounter != pdrive->drive_opencounter)
|
||||
{
|
||||
{ /* Card was removed and re-inserted since pc_gfirst() */
|
||||
rtfs_set_errno(PEINVALIDPARMS); /* pc_gnext: statobj is not valid */
|
||||
release_drive_mount(statobj->driveno);/* Release lock, unmount if aborted */
|
||||
return(FALSE);
|
||||
@ -192,11 +195,13 @@ BOOLEAN pc_gnext(DSTAT *statobj) /*__apifn__*/
|
||||
statobj->pobj = (void *)nextobj;
|
||||
/* And update the stat structure */
|
||||
pc_upstat(statobj);
|
||||
/* 9-20-94 release the FINODE and allocate a dummy. This will keep everyone
|
||||
who expects the drobj to own a finode happy but will not leave the
|
||||
finode open which locks out unlink et al */
|
||||
/* 9-20-94 release the FINODE and allocate a dummy. This will keep everyone
|
||||
who expects the drobj to own a finode happy but will not leave the
|
||||
finode open which locks out unlink et al */
|
||||
pc_freei(((DROBJ *)(statobj->pobj))->finode); /* Release the current */
|
||||
((DROBJ *)(statobj->pobj))->finode = pc_alloci();
|
||||
/* 3-07-07 - Change: Remove additional call to pc_alloci(). Was not needed and caused a leak
|
||||
on a hot swap event when a gfirst is outstanding */
|
||||
((DROBJ *)(statobj->pobj))->finode = 0;
|
||||
/* END 9-20-94 */
|
||||
release_drive_mount(statobj->driveno);/* Release lock, unmount if aborted */
|
||||
return(TRUE);
|
||||
@ -220,7 +225,7 @@ BOOLEAN pc_gnext(DSTAT *statobj) /*__apifn__*/
|
||||
Given a pointer to a DSTAT structure that has been set up by a call to
|
||||
pc_gfirst() free internal elements used by the statobj.
|
||||
|
||||
NOTE: You MUST call this function when done searching through a
|
||||
NOTE: You MUST call this function when done searching through a
|
||||
directory.
|
||||
|
||||
Returns
|
||||
@ -231,13 +236,14 @@ BOOLEAN pc_gnext(DSTAT *statobj) /*__apifn__*/
|
||||
PEINVALIDPARMS - statobj argument is not valid
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
void pc_gdone(DSTAT *statobj) /*__apifn__*/
|
||||
{
|
||||
DDRIVE *pdrive;
|
||||
VOID_CHECK_MEM() /* Make sure memory is initted */
|
||||
/* see if the drive is still mounted. Do not use pmom et al. since they
|
||||
/* see if the drive is still mounted. Do not use pmom et al. since they
|
||||
may be purged */
|
||||
/* see if the drive is still mounted. Do not use pmom et al. since they
|
||||
/* see if the drive is still mounted. Do not use pmom et al. since they
|
||||
may be purged */
|
||||
if (!statobj || !statobj->pmom)
|
||||
{
|
||||
@ -247,12 +253,14 @@ void pc_gdone(DSTAT *statobj) /*__apifn__*/
|
||||
return;
|
||||
pdrive = pc_drno2dr(statobj->driveno);
|
||||
if (statobj->drive_opencounter != pdrive->drive_opencounter)
|
||||
{
|
||||
{ /* Card was removed and re-inserted since pc_gfirst() */
|
||||
release_drive_mount(statobj->driveno);/* Release lock, unmount if aborted */
|
||||
return;
|
||||
}
|
||||
if (statobj->pobj)
|
||||
{
|
||||
pc_freeobj((DROBJ *)statobj->pobj);
|
||||
}
|
||||
if (statobj->pmom)
|
||||
pc_freeobj((DROBJ *)statobj->pmom);
|
||||
release_drive_mount(statobj->driveno);/* Release lock, unmount if aborted */
|
||||
@ -262,7 +270,7 @@ void pc_gdone(DSTAT *statobj) /*__apifn__*/
|
||||
PC_UPSTAT - Copy private information to public fields for a DSTAT struc.
|
||||
|
||||
Description
|
||||
Given a pointer to a DSTAT structure that contains a pointer to an
|
||||
Given a pointer to a DSTAT structure that contains a pointer to an
|
||||
initialized DROBJ structure, load the public elements of DSTAT with
|
||||
name filesize, date of modification et al. (Called by pc_gfirst &
|
||||
pc_gnext)
|
||||
@ -281,13 +289,13 @@ void pc_upstat(DSTAT *statobj) /*__fn__*/
|
||||
pobj = (DROBJ *)(statobj->pobj);
|
||||
|
||||
pi = pobj->finode;
|
||||
|
||||
|
||||
copybuff( statobj->fname, pi->fname, 8);
|
||||
statobj->fname[8] = CS_OP_ASCII('\0');
|
||||
copybuff( statobj->fext, pi->fext, 3);
|
||||
statobj->fext[3] = CS_OP_ASCII('\0');
|
||||
/* put null termed file.ext into statobj */
|
||||
pc_ascii_mfile((byte *)statobj->filename, (byte *)statobj->fname,
|
||||
pc_ascii_mfile((byte *)statobj->filename, (byte *)statobj->fname,
|
||||
(byte *)statobj->fext);
|
||||
|
||||
statobj->fattribute = pi->fattribute;
|
||||
@ -299,9 +307,7 @@ void pc_upstat(DSTAT *statobj) /*__fn__*/
|
||||
if (!pc_get_lfn_filename(pobj, (byte *)statobj->lfname))
|
||||
{
|
||||
statobj->lfname[0] = statobj->lfname[1] = 0;
|
||||
pc_cs_mfile((byte *)statobj->lfname, (byte *)statobj->fname,
|
||||
pc_cs_mfile((byte *)statobj->lfname, (byte *)statobj->fname,
|
||||
(byte *)statobj->fext);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -466,6 +466,10 @@ DEV_GEOMETRY geometry;
|
||||
if (!pc_format_media(drivename, &geometry))
|
||||
return(-1);
|
||||
|
||||
/* Get media parms again in case the format operation changed the parameters */
|
||||
if (!pc_get_media_parms(drivename, &geometry))
|
||||
return(-1);
|
||||
|
||||
if (!pc_format_volume(drivename, &geometry))
|
||||
return(-1);
|
||||
return (0);
|
||||
|
@ -176,7 +176,14 @@ int po_write(PCFD fd, byte *in_buff, int count) /*__apifn__*/
|
||||
n_clusters = FATOP(pdrive)->fatop_alloc_chain(pdrive, &(pfile->fptr_cluster), n_clusters, TRUE);
|
||||
if (!n_clusters)
|
||||
{ /* Allocchain will set errno to PENOSPC or an IO or internal error */
|
||||
break;
|
||||
/* Handle PENOSPC as a short write - otherwise it is an error that returns -1*/
|
||||
if (get_errno() == PENOSPC)
|
||||
break;
|
||||
else
|
||||
{
|
||||
ret_val = (int) -1;
|
||||
goto return_locked;
|
||||
}
|
||||
}
|
||||
|
||||
/* Calculate the last cluster in this chain. */
|
||||
|
@ -299,7 +299,6 @@ int index;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ******************************************************************** */
|
||||
/* THIS IS THE MAIN PROGRAM FOR THE TEST SHELL */
|
||||
/* ******************************************************************** */
|
||||
@ -457,13 +456,39 @@ int nprinted = 0;
|
||||
}
|
||||
|
||||
/* EJECT D: */
|
||||
BOOLEAN ide_eject_media(int driveno);
|
||||
|
||||
void eject_driveno(int driveno)
|
||||
{
|
||||
DDRIVE *pdr;
|
||||
|
||||
pdr = pc_drno_to_drive_struct(driveno);
|
||||
if (pdr)
|
||||
{
|
||||
pdr->dev_table_perform_device_ioctl(driveno, DEVCTL_REPORT_REMOVE, (void *) 0);
|
||||
}
|
||||
}
|
||||
void eject_drivename(byte *drivename)
|
||||
{
|
||||
int driveno;
|
||||
driveno = pc_parse_raw_drive(drivename);
|
||||
if (driveno != -1)
|
||||
eject_driveno(driveno);
|
||||
}
|
||||
|
||||
int doeject(int agc, byte **agv) /*__fn__*/
|
||||
{
|
||||
RTFS_ARGSUSED_INT(agc);
|
||||
RTFS_ARGSUSED_PVOID((void *)agv);
|
||||
RTFS_PRINT_STRING_1(USTRING_TSTSH_02,PRFLG_NL); /* "Not implemented. See ide ioctl... " */
|
||||
if (agc == 1)
|
||||
{
|
||||
if (!pc_set_default_drive(*agv))
|
||||
{
|
||||
RTFS_PRINT_STRING_1(USTRING_TSTSH_03,PRFLG_NL); /* "Set Default Drive Failed" */
|
||||
return(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
eject_drivename(*agv);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
@ -916,7 +941,6 @@ int pc_seedir(byte *path) /*__fn__*/
|
||||
fcount++;
|
||||
|
||||
rtfs_print_format_dir(display_buffer, &statobj);
|
||||
|
||||
/* Get the next */
|
||||
if (!pc_gnext(&statobj))
|
||||
break;
|
||||
@ -955,7 +979,6 @@ int docat(int agc, byte **agv) /*__fn__*/
|
||||
PCFD fd;
|
||||
int nread;
|
||||
|
||||
|
||||
if (agc == 1)
|
||||
{
|
||||
if ((fd = po_open(*agv, (word)(PO_BINARY|PO_RDONLY|PO_BUFFERED),(word) (PS_IWRITE | PS_IREAD) ) ) < 0)
|
||||
|
@ -506,7 +506,7 @@ BOOLEAN validate_filename(byte * filename, byte * ext)
|
||||
BOOLEAN pc_cs_malias(byte *alias, byte *input_file, int try) /*__fn__*/
|
||||
{
|
||||
int n,s;
|
||||
byte filename[9],fileext[4];
|
||||
byte filename[10],fileext[4];
|
||||
byte *p_in, *p_in_ext, *p_temp, *p_temp_2;
|
||||
int char_len, jis_ext_len;
|
||||
|
||||
@ -581,9 +581,11 @@ BOOLEAN pc_cs_malias(byte *alias, byte *input_file, int try) /*__fn__*/
|
||||
if (p_in_ext && p_temp>=p_in_ext) /* hit extension ? */
|
||||
break;
|
||||
char_len = jis_char_length(p_temp);
|
||||
/* break and use ' ' if 2 bite jis overflows 6 */
|
||||
if(s==5&&char_len==2)
|
||||
/* break and use ' ' if 2 bite jis overflows 8 character limit */
|
||||
/* Bug fix 2-1-07 , was if(s==5&&char_len==2) */
|
||||
if(s==7&&char_len==2)
|
||||
{
|
||||
filename[7] = ' '; /* shift-jis first bytes clear */
|
||||
break;
|
||||
}
|
||||
else if(*p_temp!=' ' && *p_temp !='.')
|
||||
@ -602,7 +604,9 @@ BOOLEAN pc_cs_malias(byte *alias, byte *input_file, int try) /*__fn__*/
|
||||
}
|
||||
}
|
||||
}
|
||||
filename[8]=0; /* null terminate filename[] */
|
||||
/* Null terminate the file at length 8, the alias digits will be right justified in
|
||||
file name and the result will be copied, stripping out spaces */
|
||||
filename[8]=0;
|
||||
|
||||
pc_ascii_str2upper(filename,filename);
|
||||
pc_ascii_str2upper(fileext,fileext);
|
||||
@ -620,41 +624,41 @@ BOOLEAN pc_cs_malias(byte *alias, byte *input_file, int try) /*__fn__*/
|
||||
filename[n]='~';
|
||||
}
|
||||
|
||||
p_temp_2 = alias;
|
||||
p_temp = filename;
|
||||
p_temp_2 = alias;
|
||||
p_temp = filename;
|
||||
|
||||
/* copy filename[] to alias[], filtering out spaces */
|
||||
s = 0;
|
||||
while(*p_temp)
|
||||
/* copy filename[] to alias[], filtering out spaces */
|
||||
s = 0;
|
||||
while(*p_temp)
|
||||
{
|
||||
char_len = jis_char_length(p_temp);
|
||||
|
||||
if (s == 7 && char_len == 2)
|
||||
{
|
||||
char_len = jis_char_length(p_temp);
|
||||
|
||||
if (s == 7 && char_len == 2)
|
||||
break;
|
||||
if(*p_temp!=' ')
|
||||
{
|
||||
break;
|
||||
}
|
||||
if(*p_temp!=' ')
|
||||
{
|
||||
*p_temp_2++=*p_temp++;
|
||||
if (char_len == 2)
|
||||
*p_temp_2++=*p_temp++;
|
||||
if (char_len == 2)
|
||||
*p_temp_2++=*p_temp++;
|
||||
s += char_len;
|
||||
if (s == 8)
|
||||
break;
|
||||
|
||||
}
|
||||
else
|
||||
p_temp++;
|
||||
|
||||
s += char_len;
|
||||
if (s == 8)
|
||||
break;
|
||||
}
|
||||
if(jis_ext_len != 0)
|
||||
else
|
||||
p_temp++;
|
||||
}
|
||||
if(jis_ext_len != 0)
|
||||
{
|
||||
*p_temp_2++='.'; /* insert separating period */
|
||||
|
||||
/* copy fileext[] to alias[] */
|
||||
for(s=0; s < jis_ext_len; s++)
|
||||
{
|
||||
*p_temp_2++='.'; /* insert separating period */
|
||||
|
||||
/* copy fileext[] to alias[] */
|
||||
for(s=0; s < jis_ext_len; s++)
|
||||
{
|
||||
*p_temp_2++ = fileext[s];
|
||||
}
|
||||
*p_temp_2++ = fileext[s];
|
||||
}
|
||||
}
|
||||
*p_temp_2=0; /* null terminate alias[] */
|
||||
return(TRUE);
|
||||
}
|
||||
@ -907,4 +911,3 @@ int l;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -18,10 +18,10 @@
|
||||
#define INCLUDE_TSTSH_STRINGS 1
|
||||
|
||||
|
||||
/* Set this value to 1 if strings are entered as ascii and we require
|
||||
the unicode layer to expand them to 16 bit character strings
|
||||
set it to zero if you replace the strrings in the table with
|
||||
true UNICODE
|
||||
/* Set this value to 1 if strings are entered as ascii and we require
|
||||
the unicode layer to expand them to 16 bit character strings
|
||||
set it to zero if you replace the strrings in the table with
|
||||
true UNICODE
|
||||
*/
|
||||
typedef struct rtfs_string_table {
|
||||
int string_id;
|
||||
@ -463,7 +463,7 @@ KS_CONSTANT RTFS_STRING_TABLE string_table[] = {
|
||||
{USTRING_RTFSDEM_14,(byte *)"regress_error was called with error" },
|
||||
{USTRING_RTFSDEM_15,(byte *)"Performing long file name test" },
|
||||
{USTRING_RTFSDEM_16,(byte *)"Performing buffered file io test" },
|
||||
{USTRING_RTFSDEM_17,(byte *)"Performing Large (4Gig)File io test" },
|
||||
{USTRING_RTFSDEM_17,(byte *)"Performing Large (4Gig)File io test" },
|
||||
#endif
|
||||
#endif /* (INCLUDE_RTFSDEM_STRINGS) */
|
||||
#if (INCLUDE_TSTSH_STRINGS)
|
||||
@ -636,7 +636,7 @@ KS_CONSTANT RTFS_STRING_TABLE string_table[] = {
|
||||
{USTRING_TSTSHHELP_19,(byte *)L"DIR PATH" },
|
||||
{USTRING_TSTSHHELP_20,(byte *)L"DSKSEL D:" },
|
||||
{USTRING_TSTSHHELP_21,(byte *)L"ECHO: [args]" },
|
||||
{USTRING_TSTSHHELP_22,(byte *)L"EJECT (ejects LS-120)" },
|
||||
{USTRING_TSTSHHELP_22,(byte *)L"EJECT (Trigger Remove Event)" },
|
||||
{USTRING_TSTSHHELP_23,(byte *)L"FILLFILE PATH PATTERN NTIMES" },
|
||||
{USTRING_TSTSHHELP_24,(byte *)L"FORMAT (routine will prompt for arguments)" },
|
||||
{USTRING_TSTSHHELP_25,(byte *)L"GETATTR FILE" },
|
||||
@ -880,7 +880,7 @@ KS_CONSTANT RTFS_STRING_TABLE string_table[] = {
|
||||
{USTRING_TSTSHHELP_19,(byte *)"DIR PATH" },
|
||||
{USTRING_TSTSHHELP_20,(byte *)"DSKSEL D:" },
|
||||
{USTRING_TSTSHHELP_21,(byte *)"ECHO: [args]" },
|
||||
{USTRING_TSTSHHELP_22,(byte *)"EJECT (ejects LS-120)" },
|
||||
{USTRING_TSTSHHELP_22,(byte *)"EJECT (Trigger Remove Event)" },
|
||||
{USTRING_TSTSHHELP_23,(byte *)"FILLFILE PATH PATTERN NTIMES" },
|
||||
{USTRING_TSTSHHELP_24,(byte *)"FORMAT (routine will prompt for arguments)" },
|
||||
{USTRING_TSTSHHELP_25,(byte *)"GETATTR FILE" },
|
||||
@ -964,13 +964,13 @@ KS_CONSTANT RTFS_STRING_TABLE string_table[] = {
|
||||
{0,(byte *)"Unkown User String" }
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
static byte *rtfs_strtab_string(KS_CONSTANT RTFS_STRING_TABLE *ptable, int string_id)
|
||||
{
|
||||
while (ptable->string_id != 0)
|
||||
{
|
||||
{
|
||||
if (ptable->string_id == string_id)
|
||||
break;
|
||||
ptable++;
|
||||
@ -988,4 +988,3 @@ byte *rtfs_strtab_user_string(int string_id)
|
||||
{
|
||||
return(rtfs_strtab_string(string_table, string_id));
|
||||
}
|
||||
|
||||
|
@ -10,19 +10,14 @@
|
||||
#include <rtfs.h>
|
||||
#include <rtfsconf.h>
|
||||
|
||||
#if (RTFS_DEBUG_PRINT_ON == 1)
|
||||
#if (CTR_DEF_ENVIRONMENT_DSEMU == 1)
|
||||
#define PRINTDEBUG osTPrintf
|
||||
#else
|
||||
#include <ctr/vlink.h>
|
||||
#define PRINTDEBUG vlink_dos_printf
|
||||
#endif
|
||||
#else
|
||||
#define PRINTDEBUG i_no_print
|
||||
static void i_no_print( const char *fmt, ... );
|
||||
static void i_no_print( const char *fmt, ... ){ return; }
|
||||
#endif
|
||||
|
||||
#if (RTFS_DEBUG_PRINT_ON == 1)
|
||||
// #define PRINTDEBUG OS_TPrintf
|
||||
#else
|
||||
// #define PRINTDEBUG( ...) ((void)0)
|
||||
#endif
|
||||
// #define PRINTDEBUG OS_TPrintf
|
||||
#define PRINTDEBUG( ...) ((void)0)
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
global•Ï<EFBFBD>”
|
||||
@ -191,6 +186,11 @@ static void file_get_CHS_params( u32 file_sector_num)
|
||||
mbytes = (file_sector_num >> 11);
|
||||
|
||||
while( 1) {
|
||||
// if( mbytes < 1) {
|
||||
// file_heads = 1;
|
||||
// file_secptrack = 8;
|
||||
// break;
|
||||
// }
|
||||
if( mbytes <= 2) {
|
||||
file_heads = 2;
|
||||
file_secptrack = 16;
|
||||
|
@ -11,7 +11,7 @@
|
||||
*
|
||||
* Description:
|
||||
* This file contains porting layer tuning constants for configuring RTFS.
|
||||
* It is included by rtfsconf.h.
|
||||
* It is included by pcconf.h.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
@ -25,26 +25,23 @@
|
||||
#define KS_CONSTANT const /* See porting reference guide for explanation */
|
||||
#define KS_FAR /* See porting reference guide for explanation */
|
||||
|
||||
/* Compile time constants to control device inclusion and includion of
|
||||
porting layer subroutines */
|
||||
|
||||
/* Compile time constants to control device inclusion
|
||||
See the reference guide for an explanation
|
||||
*/
|
||||
|
||||
|
||||
#define INCLUDE_SD 0
|
||||
#define INCLUDE_IDE 0 /* - Include the IDE driver */
|
||||
#define INCLUDE_PCMCIA 0 /* - Include the pcmcia driver */
|
||||
#define INCLUDE_PCMCIA_SRAM 0 /* - Include the pcmcia static ram card driver */
|
||||
#define INCLUDE_COMPACT_FLASH 0 /* - Support compact flash (requires IDE and PCMCIA) */
|
||||
#define INCLUDE_FLASH_FTL 0 /* - Include the linear flash driver */
|
||||
#define INCLUDE_ROMDISK 0 /* - Include the rom disk driver */
|
||||
#define INCLUDE_RAMDISK 0 /* - Include the rom disk driver */
|
||||
#define INCLUDE_MMCCARD 0 /* - Include the multi media flash card driver */
|
||||
#define INCLUDE_SMARTMEDIA 0 /* - Include the smart media flash card driver */
|
||||
#define INCLUDE_FLOPPY 0 /* - Include the floppy disk driver */
|
||||
#define INCLUDE_HOSTDISK 0 /* - Include the host disk disk simulator */
|
||||
#define INCLUDE_UDMA 0 /* - Include ultra dma support for the ide driver */
|
||||
#define INCLUDE_82365_PCMCTRL 0 /* - Include the 82365 pcmcia controller driver */
|
||||
|
||||
#define INCLUDE_IDE 0 /* - Include the IDE driver */
|
||||
#define INCLUDE_PCMCIA 0 /* - Include the pcmcia driver */
|
||||
#define INCLUDE_PCMCIA_SRAM 0 /* - Include the pcmcia static ram card driver */
|
||||
#define INCLUDE_COMPACT_FLASH 0 /* - Support compact flash (requires IDE and PCMCIA) */
|
||||
#define INCLUDE_CDROM 0 /* - Support ATAPI CD (requires IDE) */
|
||||
#define INCLUDE_FLASH_FTL 0 /* - Include the linear flash driver */
|
||||
#define INCLUDE_ROMDISK 0 /* - Include the rom disk driver */
|
||||
#define INCLUDE_RAMDISK 0 /* - Include the rom disk driver */
|
||||
#define INCLUDE_MMCCARD 0 /* - Include the multi media flash card driver */
|
||||
#define INCLUDE_SMARTMEDIA 0 /* - Include the smart media flash card driver */
|
||||
#define INCLUDE_FLOPPY 0 /* - Include the floppy disk driver */
|
||||
#define INCLUDE_HOSTDISK 0 /* - Include the host disk disk simulator */
|
||||
#define INCLUDE_WINDEV 0 /* - Include windows direct device access */
|
||||
#define INCLUDE_UDMA 0 /* - Include ultra dma support for the ide driver */
|
||||
#define INCLUDE_82365_PCMCTRL 0 /* - Include the 82365 pcmcia controller driver */
|
||||
|
||||
#endif /* __PORTCONF__ */
|
||||
|
@ -433,6 +433,7 @@ character (\n or \r).
|
||||
void rtfs_port_puts(byte *buffer)
|
||||
{
|
||||
PRINTDEBUG( "%s\n", buffer); //ctr modified
|
||||
OS_TPrintf( "%s\n", buffer); //ctr modified
|
||||
/* Use cputs or some other console output function. If you have no console
|
||||
output function then leave it blank */
|
||||
/* cputs(buffer); */
|
||||
|
@ -16,21 +16,22 @@ static void pc_release_blk(BLKBUFFCNTXT *pbuffcntxt, BLKBUFF *pinblk);
|
||||
static BLKBUFF *pc_allocate_blk(DDRIVE *pdrive, BLKBUFFCNTXT *pbuffcntxt);
|
||||
|
||||
|
||||
|
||||
/* Debugging tools to be removed in he final product */
|
||||
#define DEBUG_BLOCK_CODE 0
|
||||
#define DEBUG_FAT_CODE 0
|
||||
void debug_check_blocks(BLKBUFFCNTXT *pbuffcntxt, int numblocks, char *where);
|
||||
void debug_check_blocks(BLKBUFFCNTXT *pbuffcntxt, int numblocks, char *where, dword line);
|
||||
void debug_check_fat(FATBUFFCNTXT *pfatbuffcntxt, char *where);
|
||||
void debug_break(char *where, char *message);
|
||||
void debug_break(char *where, dword line, char *message);
|
||||
#if (DEBUG_BLOCK_CODE)
|
||||
#define DEBUG_CHECK_BLOCKS(X,Y,Z) debug_check_blocks(X,Y,X);
|
||||
#define DEBUG_CHECK_BLOCKS(X,Y,Z) debug_check_blocks(X,Y,Z,0);
|
||||
#else
|
||||
#define DEBUG_CHECK_BLOCKS(X,Y,Z)
|
||||
#define DEBUG_CHECK_BLOCKS(X,Y,Z)
|
||||
#endif
|
||||
#if (DEBUG_FAT_CODE)
|
||||
#define DEBUG_CHECK_FAT(X,Y) debug_check_fat(X,Y);
|
||||
#else
|
||||
#define DEBUG_CHECK_FAT(X,Y)
|
||||
#define DEBUG_CHECK_FAT(X,Y)
|
||||
#endif
|
||||
|
||||
#if (!INCLUDE_FAILSAFE_CODE)
|
||||
@ -45,7 +46,7 @@ BOOLEAN block_devio_write(BLKBUFF *pblk)
|
||||
/* dword blockno;
|
||||
blockno = pblk->blockno;*/
|
||||
return(devio_write(pblk->pdrive->driveno,pblk->blockno, pblk->data, (int) 1, FALSE));
|
||||
}
|
||||
}
|
||||
|
||||
BOOLEAN fat_devio_write(DDRIVE *pdrive, FATBUFF *pblk, int fatnumber)
|
||||
{
|
||||
@ -73,9 +74,9 @@ BOOLEAN fat_devio_read(DDRIVE *pdrive, dword blockno, byte *fat_data);
|
||||
|
||||
Description
|
||||
Give back a buffer to the system buffer pool so that it may
|
||||
be re-used. If was_err is TRUE this means that the data in the
|
||||
be re-used. If was_err is TRUE this means that the data in the
|
||||
buffer is invalid so discard the buffer from the buffer pool.
|
||||
|
||||
|
||||
Returns
|
||||
Nothing
|
||||
|
||||
@ -88,9 +89,9 @@ void pc_release_buf(BLKBUFF *pblk)
|
||||
DEBUG_CHECK_BLOCKS(pblk->pdrive->pbuffcntxt, pblk->pdrive->pbuffcntxt->num_blocks, "Release")
|
||||
#if (DEBUG_BLOCK_CODE)
|
||||
if (!pblk->pdrive->mount_valid)
|
||||
debug_break("release buf", "Mount not valid");
|
||||
debug_break("release buf", __LINE__, "Mount not valid");
|
||||
if (pblk->block_state != DIRBLOCK_COMMITTED && pblk->block_state != DIRBLOCK_UNCOMMITTED)
|
||||
debug_break("release buf", "releasing buffer not in use list");
|
||||
debug_break("release buf", __LINE__,"releasing buffer not in use list");
|
||||
#endif
|
||||
|
||||
if (pblk->block_state != DIRBLOCK_COMMITTED && pblk->block_state != DIRBLOCK_UNCOMMITTED)
|
||||
@ -99,8 +100,7 @@ void pc_release_buf(BLKBUFF *pblk)
|
||||
if (pblk->use_count)
|
||||
{
|
||||
pblk->use_count -= 1;
|
||||
if (!pblk->use_count)
|
||||
pblk->pdrive->pbuffcntxt->num_free += 1;
|
||||
/* 03-07-07 Changed. No longer increment num_free if usecount goes to zero */
|
||||
}
|
||||
OS_RELEASE_FSCRITICAL()
|
||||
}
|
||||
@ -109,10 +109,10 @@ void pc_release_buf(BLKBUFF *pblk)
|
||||
pc_discard_buf - Put a buffer back on the free list.
|
||||
|
||||
Description
|
||||
Check if a buffer is in the buffer pool, unlink it from the
|
||||
Check if a buffer is in the buffer pool, unlink it from the
|
||||
buffer pool if it is.
|
||||
Put the buffer on the free list.
|
||||
|
||||
|
||||
Returns
|
||||
Nothing
|
||||
|
||||
@ -137,7 +137,7 @@ BLKBUFFCNTXT *pbuffcntxt;
|
||||
#endif
|
||||
if (pblk->block_state == DIRBLOCK_FREE)
|
||||
return;
|
||||
|
||||
|
||||
OS_CLAIM_FSCRITICAL()
|
||||
pbuffcntxt = pblk->pdrive->pbuffcntxt;
|
||||
DEBUG_CHECK_BLOCKS(pbuffcntxt, pbuffcntxt->num_blocks, "Discard 1")
|
||||
@ -147,9 +147,9 @@ BLKBUFFCNTXT *pbuffcntxt;
|
||||
pc_release_blk(pbuffcntxt, pblk);
|
||||
#if (DEBUG_BLOCK_CODE)
|
||||
if (pblk->pnext && pblk->pnext->pprev != pblk)
|
||||
debug_break("discard buf", "Buffer and populated pool inconsistent");
|
||||
debug_break("discard buf", __LINE__,"Buffer and populated pool inconsistent");
|
||||
if (pblk->pprev && pblk->pprev->pnext != pblk)
|
||||
debug_break("discard buf", "Buffer and populated pool inconsistent");
|
||||
debug_break("discard buf", __LINE__,"Buffer and populated pool inconsistent");
|
||||
#endif
|
||||
/* Unlink it from the populated pool double check link integrity */
|
||||
if (pblk->pnext && pblk->pnext->pprev == pblk)
|
||||
@ -175,7 +175,7 @@ Description
|
||||
or get it from the buffer pool and return the buffer.
|
||||
|
||||
Note: After reading, you own the buffer. You must release it by
|
||||
calling pc_release_buff() or pc_discard_buff() before it may be
|
||||
calling pc_release_buff() or pc_discard_buff() before it may be
|
||||
used for other blocks.
|
||||
|
||||
Returns
|
||||
@ -183,6 +183,8 @@ Description
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
|
||||
BLKBUFF *pc_read_blk(DDRIVE *pdrive, dword blockno) /*__fn__*/
|
||||
{
|
||||
BLKBUFF *pblk;
|
||||
@ -228,7 +230,7 @@ BLKBUFFCNTXT *pbuffcntxt;
|
||||
OS_RELEASE_FSCRITICAL()
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
/* set errno to IO error unless devio set PEDEVICE */
|
||||
if (!get_errno())
|
||||
rtfs_set_errno(PEIOERRORREADBLOCK); /* pc_read_blk device read error */
|
||||
@ -256,6 +258,8 @@ BLKBUFF *pc_scratch_blk(void) /*__fn__*/
|
||||
BLKBUFF *pblk;
|
||||
OS_CLAIM_FSCRITICAL()
|
||||
pblk = pc_allocate_blk(0, &prtfs_cfg->buffcntxt);
|
||||
if (pblk)
|
||||
prtfs_cfg->buffcntxt.scratch_alloc_count += 1;
|
||||
OS_RELEASE_FSCRITICAL()
|
||||
return (pblk);
|
||||
}
|
||||
@ -270,6 +274,7 @@ void pc_free_scratch_blk(BLKBUFF *pblk)
|
||||
pbuffcntxt->pfree_blocks = pblk;
|
||||
pblk->block_state = DIRBLOCK_FREE;
|
||||
pbuffcntxt->num_free += 1;
|
||||
pbuffcntxt->scratch_alloc_count -= 1;
|
||||
OS_RELEASE_FSCRITICAL()
|
||||
}
|
||||
|
||||
@ -280,7 +285,7 @@ Description
|
||||
Allocate and zero a BLKBUFF and add it to the to the buffer pool.
|
||||
|
||||
Note: After initializing you own the buffer. You must release it by
|
||||
calling pc_release_buff() or pc_discard_buf() before it may be used
|
||||
calling pc_release_buff() or pc_discard_buf() before it may be used
|
||||
for other blocks.
|
||||
|
||||
Returns
|
||||
@ -357,7 +362,7 @@ BOOLEAN deleting;
|
||||
return;
|
||||
pbuffcntxt = pdrive->pbuffcntxt;
|
||||
DEBUG_CHECK_BLOCKS(pbuffcntxt, pbuffcntxt->num_blocks, "Free all 1")
|
||||
do
|
||||
do
|
||||
{
|
||||
deleting = FALSE;
|
||||
OS_CLAIM_FSCRITICAL()
|
||||
@ -423,7 +428,7 @@ BLKBUFF *pblk;
|
||||
if (pblk == pinblk)
|
||||
*(pbuffcntxt->blk_hash_tbl+hash_index) = pinblk->pnext2;
|
||||
else
|
||||
{
|
||||
{
|
||||
while (pblk)
|
||||
{
|
||||
if (pblk->pnext2==pinblk)
|
||||
@ -473,67 +478,87 @@ BLKBUFF *pblk;
|
||||
/* Allocate a block or re-use an un-committed one */
|
||||
static BLKBUFF *pc_allocate_blk(DDRIVE *pdrive, BLKBUFFCNTXT *pbuffcntxt)
|
||||
{
|
||||
BLKBUFF *pblk, *pblkscan;
|
||||
int num_free;
|
||||
/* Note: pdrive may be NULL, do not dereference the pointer */
|
||||
pblk = 0;
|
||||
BLKBUFF *pfreeblk,*puncommitedblk, *pfoundblk, *pblkscan;
|
||||
int populated_but_uncommited;
|
||||
|
||||
/* Note: pdrive may be NULL, do not dereference the pointer */
|
||||
pfreeblk = pfoundblk = puncommitedblk = 0;
|
||||
populated_but_uncommited = 0;
|
||||
|
||||
/* Use blocks that are on the freelist first */
|
||||
if (pbuffcntxt->pfree_blocks)
|
||||
{
|
||||
pblk = pbuffcntxt->pfree_blocks;
|
||||
pbuffcntxt->pfree_blocks = pblk->pnext;
|
||||
pfreeblk = pbuffcntxt->pfree_blocks;
|
||||
pbuffcntxt->pfree_blocks = pfreeblk->pnext;
|
||||
pbuffcntxt->num_free -= 1;
|
||||
}
|
||||
else if (pbuffcntxt->ppopulated_blocks)
|
||||
|
||||
/* Scan the populated list. Count the number of uncommited blocks to set low water marks
|
||||
and, if we haven't already allocated a block from the free list, select a replacement block. */
|
||||
if (pbuffcntxt->ppopulated_blocks)
|
||||
{
|
||||
/* Find the oldest UNCOMMITED block (deepest into the list) */
|
||||
int loop_guard = 0;
|
||||
/* Count UNCOMMITED blocks and find the oldest UNCOMMITED block in the list */
|
||||
pblkscan = pbuffcntxt->ppopulated_blocks;
|
||||
num_free = 0;
|
||||
while (pblkscan)
|
||||
{
|
||||
if (pblkscan->block_state == DIRBLOCK_UNCOMMITTED && !pblkscan->use_count)
|
||||
{
|
||||
pblk = pblkscan;
|
||||
num_free += 1;
|
||||
}
|
||||
pblkscan = pblkscan->pnext;
|
||||
if (pblkscan->block_state == DIRBLOCK_UNCOMMITTED && !pblkscan->use_count)
|
||||
{
|
||||
puncommitedblk = pblkscan;
|
||||
populated_but_uncommited += 1;
|
||||
}
|
||||
pblkscan = pblkscan->pnext;
|
||||
/* Guard against endless loop */
|
||||
if (loop_guard++ > pbuffcntxt->num_blocks)
|
||||
{
|
||||
rtfs_set_errno(PEINTERNAL); /* pc_allocate_blk: Internal error*/
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
pbuffcntxt->num_free = num_free;
|
||||
if (pblk)
|
||||
/* If we don't already have a free block we'll reuse the oldest uncommitted block so release it */
|
||||
if (!pfreeblk && puncommitedblk)
|
||||
{
|
||||
pc_release_blk(pbuffcntxt, pblk); /* Remove it from buffer pool */
|
||||
pc_release_blk(pbuffcntxt, puncommitedblk); /* Remove it from buffer pool */
|
||||
/* Unlink it from the populated pool */
|
||||
if (pblk->pnext)
|
||||
pblk->pnext->pprev = pblk->pprev;
|
||||
if (pblk->pprev)
|
||||
pblk->pprev->pnext = pblk->pnext;
|
||||
if (pbuffcntxt->ppopulated_blocks == pblk)
|
||||
pbuffcntxt->ppopulated_blocks = pblk->pnext;
|
||||
if (puncommitedblk->pnext)
|
||||
puncommitedblk->pnext->pprev = puncommitedblk->pprev;
|
||||
if (puncommitedblk->pprev)
|
||||
puncommitedblk->pprev->pnext = puncommitedblk->pnext;
|
||||
if (pbuffcntxt->ppopulated_blocks == puncommitedblk)
|
||||
pbuffcntxt->ppopulated_blocks = puncommitedblk->pnext;
|
||||
}
|
||||
}
|
||||
if (pblk)
|
||||
if (pfreeblk)
|
||||
pfoundblk = pfreeblk;
|
||||
else
|
||||
pfoundblk = puncommitedblk;
|
||||
|
||||
if (pfoundblk)
|
||||
{ /* Put in a known state */
|
||||
pbuffcntxt->num_free -= 1;
|
||||
if (pbuffcntxt->num_free < pbuffcntxt->low_water)
|
||||
pbuffcntxt->low_water = pbuffcntxt->num_free;
|
||||
pblk->use_count = 0;
|
||||
pblk->block_state = DIRBLOCK_ALLOCATED;
|
||||
pblk->pdrive = pdrive;
|
||||
/* 03-07-2007 using a different method to calculate low water mark. Previous method
|
||||
undercounted the worst case buffer allocation requirements */
|
||||
if (pbuffcntxt->num_free + populated_but_uncommited < pbuffcntxt->low_water)
|
||||
pbuffcntxt->low_water = pbuffcntxt->num_free + populated_but_uncommited;
|
||||
pfoundblk->use_count = 0;
|
||||
pfoundblk->block_state = DIRBLOCK_ALLOCATED;
|
||||
pfoundblk->pdrive = pdrive;
|
||||
}
|
||||
else
|
||||
{
|
||||
pbuffcntxt->num_alloc_failures += 1;
|
||||
rtfs_set_errno(PERESOURCEBLOCK); /* pc_allocate_blk out of resources */
|
||||
}
|
||||
return(pblk);
|
||||
return(pfoundblk);
|
||||
}
|
||||
/* Tomo */
|
||||
/* Traverse a cluster chain and make sure that all blocks in the cluster
|
||||
chain are flushed from the buffer pool. This is required when deleting
|
||||
/* Traverse a cluster chain and make sure that all blocks in the cluster
|
||||
chain are flushed from the buffer pool. This is required when deleting
|
||||
a directory since it is possible, although unlikely, that blocks used in
|
||||
the directory may be used in a file. This may cause the buffered
|
||||
block to be different from on-disk block.
|
||||
Called by pc_rmnode
|
||||
*/
|
||||
void pc_flush_chain_blk(DDRIVE *pdrive, CLUSTERTYPE cluster)
|
||||
void pc_flush_chain_blk(DDRIVE *pdrive, CLUSTERTYPE cluster)
|
||||
{
|
||||
int i;
|
||||
dword blockno;
|
||||
@ -565,7 +590,7 @@ BLKBUFF *pblk;
|
||||
if (cluster == 0) /* clnext detected error */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize and populate a block buffer context structure */
|
||||
BOOLEAN pc_initialize_block_pool(BLKBUFFCNTXT *pbuffcntxt, int nblkbuffs,
|
||||
@ -582,7 +607,7 @@ BLKBUFF *pblk;
|
||||
rtfs_memset(pblk,(byte) 0, sizeof(BLKBUFF));
|
||||
pblk->pnext = pblk+1;
|
||||
}
|
||||
rtfs_memset(pblk,(byte) 0, sizeof(BLKBUFF));
|
||||
rtfs_memset(pblk,(byte) 0, sizeof(BLKBUFF));
|
||||
/* pblk->pnext = 0; accomplished by memset */
|
||||
pbuffcntxt->pfree_blocks = pmem_block_pool;
|
||||
pbuffcntxt->hash_size = blk_hashtble_size;
|
||||
@ -602,7 +627,7 @@ static void pc_commit_fat_blk(FATBUFFCNTXT *pfatbuffcntxt, FATBUFF *pblk);
|
||||
void pc_commit_fat_table(FATBUFFCNTXT *pfatbuffcntxt);
|
||||
void pc_sort_committed_blocks(FATBUFFCNTXT *pfatbuffcntxt);
|
||||
|
||||
|
||||
|
||||
BOOLEAN pc_flush_fat_blocks(DDRIVE *pdrive)
|
||||
{
|
||||
FATBUFFCNTXT *pfatbuffcntxt;
|
||||
@ -697,12 +722,12 @@ dword b;
|
||||
#if (INCLUDE_FAILSAFE_CODE)
|
||||
/* If in the primary cache and the new flag is write but the old
|
||||
flag was not write then we will need to journal the block */
|
||||
if ((usage_flags & 0x80000000ul) && (!(b & 0x80000000ul)))
|
||||
if ((usage_flags & 0x80000000ul) && (!(b & 0x80000000ul)))
|
||||
if (pro_failsafe_journal_full(pdrive))
|
||||
return(0); /* Failsafe sets errno */
|
||||
#endif
|
||||
if (usage_flags) /* bit 31 0x80000000ul is write bit 29 0x20000000ul is lock */
|
||||
*(pfatbuffcntxt->mapped_blocks+hash_index) |= usage_flags;
|
||||
*(pfatbuffcntxt->mapped_blocks+hash_index) |= usage_flags;
|
||||
return (*(pfatbuffcntxt->mapped_data+hash_index));
|
||||
}
|
||||
else
|
||||
@ -729,7 +754,7 @@ dword b;
|
||||
#if (INCLUDE_FAILSAFE_CODE)
|
||||
else
|
||||
{
|
||||
/* If in the primary cache but uncommitted, if it will
|
||||
/* If in the primary cache but uncommitted, if it will
|
||||
switch to committed now then we will have to journal the block */
|
||||
if (usage_flags & 0x80000000ul)
|
||||
{
|
||||
@ -815,7 +840,7 @@ swap_write_error:
|
||||
if (pblk == *(pfatbuffcntxt->fat_blk_hash_tbl+temp_hash_index))
|
||||
*(pfatbuffcntxt->fat_blk_hash_tbl+temp_hash_index) = pblk->pnext2;
|
||||
else
|
||||
{
|
||||
{
|
||||
pblkscan = *(pfatbuffcntxt->fat_blk_hash_tbl+temp_hash_index);
|
||||
while (pblkscan)
|
||||
{
|
||||
@ -833,14 +858,14 @@ swap_write_error:
|
||||
DEBUG_CHECK_FAT(pfatbuffcntxt, "Map 5")
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
{ /* the free list already had a block available for us */
|
||||
pfatbuffcntxt->stat_secondary_cache_loads += 1;
|
||||
}
|
||||
pblk = pfatbuffcntxt->pfree_blocks;
|
||||
if (!pblk)
|
||||
{
|
||||
/* No blocks available. We tried to flush the secondary and
|
||||
/* No blocks available. We tried to flush the secondary and
|
||||
that didn't come up with any so we're completely out */
|
||||
rtfs_set_errno(PERESOURCEFATBLOCK);
|
||||
return(0);
|
||||
@ -867,7 +892,7 @@ swap_write_error:
|
||||
*(pfatbuffcntxt->mapped_data+hash_index) = pblk->fat_data;
|
||||
DEBUG_CHECK_FAT(pfatbuffcntxt, "Map 7")
|
||||
#if (INCLUDE_FAILSAFE_CODE)
|
||||
/* We are coming from the FREE state, but write is
|
||||
/* We are coming from the FREE state, but write is
|
||||
set so journal the buffer */
|
||||
if (usage_flags & 0x80000000ul)
|
||||
{
|
||||
@ -888,7 +913,7 @@ swap_write_error:
|
||||
|
||||
BOOLEAN pc_initialize_fat_block_pool(FATBUFFCNTXT *pfatbuffcntxt,
|
||||
int fat_buffer_size, FATBUFF *pfat_buffers,
|
||||
int fat_hashtbl_size, FATBUFF **pfat_hash_table,
|
||||
int fat_hashtbl_size, FATBUFF **pfat_hash_table,
|
||||
byte **pfat_primary_cache, dword *pfat_primary_index)
|
||||
{
|
||||
dword t;
|
||||
@ -959,7 +984,7 @@ static void pc_commit_fat_blk(FATBUFFCNTXT *pfatbuffcntxt, FATBUFF *pblk)
|
||||
{
|
||||
#if (DEBUG_FAT_CODE)
|
||||
if (pblk->fat_block_state != FATBLOCK_UNCOMMITTED)
|
||||
debug_break("commit fat block", "Not un-committed");
|
||||
debug_break("commit fat block", __LINE__,"Not un-committed");
|
||||
#endif
|
||||
/* Remove from the uncommitted list */
|
||||
if (pblk->pnext)
|
||||
@ -991,7 +1016,7 @@ FATBUFF *pblk;
|
||||
/* Move from uncommitted list to committed list */
|
||||
pblk = pc_find_fat_blk(pfatbuffcntxt, (b & 0x0ffffffful));
|
||||
if (pblk) /* This should not fail */
|
||||
pc_commit_fat_blk(pfatbuffcntxt, pblk);
|
||||
pc_commit_fat_blk(pfatbuffcntxt, pblk);
|
||||
b |= 0x40000000ul; /* set commited flag in primary */
|
||||
*(pfatbuffcntxt->mapped_blocks+i) = b;
|
||||
}
|
||||
@ -1001,7 +1026,7 @@ void pc_sort_committed_blocks(FATBUFFCNTXT *pfatbuffcntxt)
|
||||
{
|
||||
FATBUFF *pblk, *pprev, *psorted_list, *psort, *pblk_source_scan;
|
||||
|
||||
/* The first element is the root of the sorted list, we begin from the
|
||||
/* The first element is the root of the sorted list, we begin from the
|
||||
next element scanning foreward and inserting in sorted order */
|
||||
psorted_list = pfatbuffcntxt->pcommitted_blocks; /* pfatbuffcntxt->pcommitted_blocks is guaranteed not null */
|
||||
|
||||
@ -1048,9 +1073,12 @@ FATBUFF *pblk, *pprev, *psorted_list, *psort, *pblk_source_scan;
|
||||
}
|
||||
|
||||
#if (DEBUG_BLOCK_CODE || DEBUG_FAT_CODE)
|
||||
void debug_break(char *where, char *message)
|
||||
void debug_break(char *where, dword line, char *message)
|
||||
{
|
||||
printf("%s: %s\n", where, message);
|
||||
if (line)
|
||||
printf("%s (%d): %s\n", where, line, message);
|
||||
else
|
||||
printf("%s: %s\n", where, message);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1127,32 +1155,41 @@ int numblocks;
|
||||
#endif /* DEBUG_FAT_CODE */
|
||||
|
||||
#if (DEBUG_BLOCK_CODE)
|
||||
void debug_check_blocks(BLKBUFFCNTXT *pbuffcntxt, int numblocks, char *where)
|
||||
void debug_check_blocks(BLKBUFFCNTXT *pbuffcntxt, int numblocks, char *where, dword line)
|
||||
{
|
||||
BLKBUFF *pblk;
|
||||
BLKBUFF *pblk_prev;
|
||||
int nb = 0;
|
||||
int nfreelist = 0;
|
||||
int npopulatedlist = 0;
|
||||
|
||||
int i;
|
||||
pblk = pbuffcntxt->pfree_blocks;
|
||||
while (pblk)
|
||||
{
|
||||
nb += 1;
|
||||
if (nb > numblocks)
|
||||
debug_break(where, "Bad freelist");
|
||||
debug_break(where,line, "Bad freelist");
|
||||
pblk = pblk->pnext;
|
||||
}
|
||||
nfreelist = nb;
|
||||
pblk = pbuffcntxt->ppopulated_blocks;
|
||||
if (pblk && pblk->pprev)
|
||||
debug_break(where, "Bad populated root");
|
||||
debug_break(where,line, "Bad populated root");
|
||||
while (pblk)
|
||||
{
|
||||
npopulatedlist += 1;
|
||||
nb += 1;
|
||||
if (nb > numblocks)
|
||||
debug_break(where, "Bad populated list");
|
||||
debug_break(where, line, "Bad populated list");
|
||||
pblk = pblk->pnext;
|
||||
}
|
||||
|
||||
/* Add in outstanding scratch allocates */
|
||||
nb += pbuffcntxt->scratch_alloc_count;
|
||||
|
||||
if (nb != numblocks)
|
||||
debug_break(where, "Leak");
|
||||
debug_break(where, line, "Leak");
|
||||
|
||||
if (pbuffcntxt->ppopulated_blocks)
|
||||
{
|
||||
@ -1161,7 +1198,7 @@ int i;
|
||||
while (pblk)
|
||||
{
|
||||
if (pblk->pprev != pblk_prev)
|
||||
debug_break(where, "Bad link in populated list");
|
||||
debug_break(where, line, "Bad link in populated list");
|
||||
pblk_prev = pblk;
|
||||
pblk = pblk->pnext;
|
||||
}
|
||||
@ -1173,16 +1210,111 @@ int i;
|
||||
while (pblk)
|
||||
{
|
||||
if (i != (int) (pblk->blockno&pbuffcntxt->hash_mask))
|
||||
debug_break(where, "Block in wrong hash slot");
|
||||
debug_break(where, line, "Block in wrong hash slot");
|
||||
|
||||
nb += 1;
|
||||
if (nb > numblocks)
|
||||
debug_break(where, "Loop in hash table");
|
||||
debug_break(where, line, "Loop in hash table");
|
||||
pblk = pblk->pnext2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Diagnostic to display list list contents for FINODE and DROBJ pools.
|
||||
|
||||
display_free_lists(char *in_where)
|
||||
|
||||
Prints:
|
||||
FINODES on FREE list, FINODES on in use list.
|
||||
Drobj structures on freelist,
|
||||
drob structure count marked free by scanning the drobj pool sequentially
|
||||
BLKBUFF buffer free count, and low water count
|
||||
BLKBUFF buffers counted on populated list
|
||||
BLKBUFF buffers counted on free list
|
||||
|
||||
|
||||
If populated count and free list don't add up the remainder will be scratch
|
||||
buffers.
|
||||
|
||||
To Do: Add counters for scratch buffer allocation and frees.
|
||||
|
||||
Useful for validating that no leaks are occuring.
|
||||
|
||||
Requires printf
|
||||
|
||||
|
||||
*/
|
||||
|
||||
void display_free_lists(char *in_where)
|
||||
{
|
||||
FINODE *pfi;
|
||||
DROBJ *pobj;
|
||||
struct blkbuff *pblk;
|
||||
int j, i, objcount, finodecount,populated_block_count,free_list_count;
|
||||
objcount = finodecount = i = populated_block_count = free_list_count = 0;
|
||||
|
||||
pfi = prtfs_cfg->mem_finode_freelist;
|
||||
while (pfi)
|
||||
{
|
||||
i++;
|
||||
pfi = pfi->pnext;
|
||||
}
|
||||
finodecount = 0;
|
||||
pfi = prtfs_cfg->inoroot;
|
||||
while (pfi)
|
||||
{
|
||||
finodecount++;
|
||||
pfi = pfi->pnext;
|
||||
}
|
||||
printf("%-10.10s:INODES free:%4.4d in-use:%4.4d total:%4.4d \n", in_where, i,finodecount,prtfs_cfg->cfg_NFINODES);
|
||||
i = 0;
|
||||
pobj = prtfs_cfg->mem_drobj_freelist;
|
||||
while (pobj)
|
||||
{
|
||||
i++;
|
||||
pobj = (DROBJ *) pobj->pdrive;
|
||||
}
|
||||
pobj = prtfs_cfg->mem_drobj_pool;
|
||||
objcount = 0;
|
||||
for (j = 0; j < prtfs_cfg->cfg_NDROBJS; j++, pobj++)
|
||||
{
|
||||
if (!pobj->is_free)
|
||||
objcount += 1;
|
||||
}
|
||||
printf("%-10.10s:DROBJS free:%4.4d in-use:%4.4d total:%4.4d \n", in_where, i,objcount, prtfs_cfg->cfg_NDROBJS);
|
||||
|
||||
pblk = prtfs_cfg->buffcntxt.ppopulated_blocks; /* uses pnext/pprev */
|
||||
populated_block_count = 0;
|
||||
while (pblk)
|
||||
{
|
||||
populated_block_count += 1;
|
||||
pblk = pblk->pnext;
|
||||
}
|
||||
printf("%-10.10s:BLKBUFS free:%4.4d in-use:%4.4d low w:%4.4d scratch:%4.4d total:%4.4d \n",in_where,
|
||||
prtfs_cfg->buffcntxt.num_free,
|
||||
populated_block_count,
|
||||
prtfs_cfg->buffcntxt.low_water,
|
||||
prtfs_cfg->buffcntxt.scratch_alloc_count,
|
||||
prtfs_cfg->buffcntxt.num_blocks);
|
||||
|
||||
pblk = prtfs_cfg->buffcntxt.pfree_blocks;
|
||||
free_list_count = 0;
|
||||
while (pblk)
|
||||
{
|
||||
free_list_count += 1;
|
||||
pblk = pblk->pnext;
|
||||
}
|
||||
|
||||
if (free_list_count != prtfs_cfg->buffcntxt.num_free)
|
||||
{
|
||||
printf("%-10.10s:Error num_freelist == %d but %d elements on the freelist\n",in_where, prtfs_cfg->buffcntxt.num_free, free_list_count);
|
||||
}
|
||||
}
|
||||
|
||||
/* May be called to detect buffer pool leaks */
|
||||
void check_blocks(DDRIVE *pdrive, char *prompt, dword line)
|
||||
{
|
||||
debug_check_blocks(pdrive->pbuffcntxt, pdrive->pbuffcntxt->num_blocks, prompt, line);
|
||||
}
|
||||
|
||||
#endif /* (DEBUG_BLOCK_CODE) */
|
||||
|
||||
|
||||
|
||||
|
@ -899,6 +899,7 @@ struct fsblockmap *newpbm;
|
||||
if (!pfscntxt->blockmap_freelist)
|
||||
{
|
||||
error = 0;
|
||||
|
||||
replacement_block = fs_block_map_scan(pfscntxt,blockno,&error);
|
||||
if (error) /* fs_block_map_scan set errno */
|
||||
return(0);
|
||||
|
@ -166,10 +166,11 @@ int fs_test(byte *path)
|
||||
}
|
||||
|
||||
#if (DO_INDEX_TEST)
|
||||
#define BIG_TEST_SIZE (4 * (CFG_NUM_INDEX_BUFFERS * 128))
|
||||
/* #define BIG_TEST_SIZE (4 * (CFG_NUM_INDEX_BUFFERS * 128)) */
|
||||
#define BIG_TEST_SIZE 4096
|
||||
dword map_check[BIG_TEST_SIZE];
|
||||
static BOOLEAN fs_test_map_cache(dword num_to_map);
|
||||
static BOOLEAN _fs_test_map_cache(dword num_to_map, BOOLEAN random_fill);
|
||||
static BOOLEAN _fs_test_map_cache(dword num_to_map, int fill_op);
|
||||
static BOOLEAN fs_test_index_errors(void);
|
||||
|
||||
BOOLEAN fs_test_indexing_main(byte *path)
|
||||
@ -179,6 +180,11 @@ struct fsblockmap *save_freelist;
|
||||
fs_test_nvio_delete_fsfile(path);
|
||||
if (!open_index_test(path, FS_MODE_AUTORECOVER, TEST_BLOCKMAPSIZE, 0))
|
||||
return(FALSE);
|
||||
if (test_fscontext.num_remap_blocks > BIG_TEST_SIZE)
|
||||
{
|
||||
FSDEBUG("INDEX TEST: BIG_TEST_SIZE too small to run index test. recompile")
|
||||
return(FALSE);
|
||||
}
|
||||
/* Test mapping with all fitting in cache */
|
||||
FSDEBUG("INDEX TEST: Test mapping with cache > # journaled blocks")
|
||||
if (!fs_test_map_cache(test_fscontext.blockmap_size-1))
|
||||
@ -1614,7 +1620,10 @@ return_error:
|
||||
fs_test_rm_file(path, filename);
|
||||
return(0);
|
||||
}
|
||||
if (pc_get_file_extents(fd, 1, &seginfo, FALSE) != 1)
|
||||
/* if (pc_get_file_extents(fd, 1, &seginfo, FALSE) != 1)
|
||||
Use raw block numbers since we are comparing with the partition base
|
||||
*/
|
||||
if (pc_get_file_extents(fd, 1, &seginfo, TRUE) != 1)
|
||||
goto return_error;
|
||||
po_close(fd);
|
||||
return(seginfo.block);
|
||||
|
@ -1,6 +1,162 @@
|
||||
=================================================================
|
||||
Functional changes between version 4.4zb versus version 4.4za (March 16, 2007)
|
||||
=================================================================
|
||||
|
||||
|
||||
Bug fixes:
|
||||
Fixed a finode structure memory leak that could occur if a removal event occured
|
||||
under certain conditions. The bug has been present since 1994.
|
||||
|
||||
Fixed a bug that was under reporting block buffer freelist low water mark values.
|
||||
The bug was only in the calculation of the low water mark and did not cause any
|
||||
runtime errors.
|
||||
|
||||
Fixed a problem with FAT32 info block access routines that ran unnecessarily
|
||||
slowly and could read beyond the end of a buffer.
|
||||
|
||||
Features enhancements:
|
||||
|
||||
Implemented a shell command to simulate a card removal
|
||||
|
||||
Added a new display_free_lists() diagnostic routine to print current usage
|
||||
stats. This routine may be called to monitor buffer usage.
|
||||
|
||||
Changes by file:
|
||||
|
||||
|
||||
apigfrst.c - Fixed a bug that caused a leak of one finode structure if a card removal
|
||||
event occured with an outstanding call to pc_gfirst() without a completed call
|
||||
pc_gdone().
|
||||
|
||||
prblock.c - Fixed a bug that was causing an error in the calculation that produced incorrect
|
||||
block buffer freelist low water mark values. The bug was only in the calculation of
|
||||
the low water mark and did not cause any runtime errors.
|
||||
|
||||
rtfs.h - Modified the blkbuffcntxt structure to maintain a count of outstanding scratch
|
||||
buffer allocations. This is used to correctly calculate low water usage and
|
||||
for diagnostics.
|
||||
|
||||
prblock.c - Modified block diagnostic routines that is enabled by compiling with DEBUG_BLOCK_CODE
|
||||
enabled in prblock.c
|
||||
.. Include line numbers in diagnostics
|
||||
.. Added a new dignostic
|
||||
display_free_lists(char *comment_string)
|
||||
this routine prints usage stats about DROBJ, FINODE and BLKBUFF structures.
|
||||
It can be called to display snapshot of resource usage and to detect leaks.
|
||||
|
||||
rtfat32.c - Modified code that accesses the on disk FAT32 info structure. The structure is now
|
||||
accessed at byte offset 484 in the info block. Prvious code was wasting cycles and
|
||||
scanning the info block for the info block signature.
|
||||
|
||||
appcmdsh.c - Reprogrammed the shell's EJECT command to send a media removal event to
|
||||
the specified drive id's device handler. This will trigger a remove event
|
||||
for removable media device drivers.
|
||||
|
||||
appcmdsh.c - Implemented a callable routine named eject_driveno() that software can call to simulate
|
||||
simulate a card removal. Useful for measuring the affects of card removals at specific
|
||||
times
|
||||
|
||||
apiinit.c - Configure the host disk device driver as removable so it can process EJECT commands
|
||||
from the command shell.
|
||||
|
||||
|
||||
=================================================================
|
||||
Functional changes between version 4.4za versus version 4.4y (February 16, 2007)
|
||||
=================================================================
|
||||
|
||||
Note Version 44z was an unpublished interim release.
|
||||
|
||||
Bug Fixes:
|
||||
|
||||
.. rtfatxx.c - Changed fatxx_clnext() detect chain termination if the cluster value
|
||||
is greater than xff7, xfff7 or xffffff7 for fat12, 16 , 32 respectively.
|
||||
The current code detected only xfff, xffff and xfffffff as terminators.
|
||||
|
||||
.. rtkernfn.c Fixed a bug in rtfs_get_system_user(). If NUMUSERS is greater than
|
||||
one and we are reclaiming the default user (0), because not enough
|
||||
user structures are avaliable, make sure the current working directory objects are
|
||||
freed and the finode access counts are reduced
|
||||
|
||||
.. rtfat32.c Added defensive code to check for a valid start hint from the info block.
|
||||
if it is out of range set it to the first cluster in the FAT. Eliminates a possible
|
||||
error trap if start hint in the info block is incorrect.
|
||||
|
||||
.. rtfat32.c Modified the info block flush routine to update the infoblock start hint with the
|
||||
previous start hint read from the info block. This forces the start hint to be 3 always on
|
||||
volume that have been formatted and written to by RTFS only.
|
||||
|
||||
.. prfstest.c - Minor bug fixes
|
||||
|
||||
|
||||
.. csjis.c Fixed bug in JIS version of pc_cs_malias(). Was causing an error if the 8th character in the
|
||||
filename was a 2 byte character sequence.
|
||||
|
||||
.. Bug in pc_emumerate - Added test to eliminate possible endless loop
|
||||
|
||||
.. po_write - Fixed error processing on cluster allocation failure. The code was always returning
|
||||
a short write status, the number of bytes written, when the cluster allocation failed. This was
|
||||
assuming that the underlying code failed because it detected disk full, not because of some other
|
||||
error. The change tests the value of errno and if it is not set to PENOSPC, it return -1.
|
||||
|
||||
apifilmv.c - Fixed an error that was in some cases leaving errno at zero and returning an error status.
|
||||
Now this condition sets ERRNO to PEINVALIDPATH;
|
||||
|
||||
|
||||
.. Changed how hidden sectors are handled by the format utilities. Previous support
|
||||
for hidden sectors was incorrect. The new method is correct. Hidden sectors are
|
||||
ignored completely except during the format procedure when the bpb hidden sector
|
||||
fields are set to the starting block of the partition.
|
||||
|
||||
apifrmat.c pc_format_volume changed the logic to set set numhide in the format
|
||||
control structure to be the starting block number of the current partition.
|
||||
|
||||
apifrmat.c Obscure change that allows device drivers to specify format parameters for
|
||||
32 bit formats. Previously supported only fat16/fat12 because the feature
|
||||
was intended for floppy disks, to match IBM PC formats.
|
||||
|
||||
rtfat16.c - Changed the way hidden sectors are used in format
|
||||
rtfat32.c - Changed the way hidden sectors are used in format
|
||||
rtlowl.c - Fixed bug that was only initializig the low 16 bits of the
|
||||
pdr->numhide, information field. This field is not used by RTFS.
|
||||
|
||||
|
||||
|
||||
New features:
|
||||
|
||||
.. Added a new device driver to Rtfs. The windev device is only available for the
|
||||
windows emulation environment. The windev driver accesses block devices directly on
|
||||
a windows platform using raw block accesses.
|
||||
|
||||
portconf.h - Added INCLUDE_WINDEV conditional constant.
|
||||
drwindev.c - Source code for the direct block access driver
|
||||
apiinit.c - Added code to mount a windev device if INCLUDE_WINDEV is
|
||||
enabled in portconf.h
|
||||
|
||||
.. Include a new special purpose fast file move function.
|
||||
|
||||
apifastmv.c - New file containing pc_fast_mv().
|
||||
|
||||
pc_fast_mv - Move a file to a filename in another subdirectoy when you know
|
||||
the destination filename does not already exist in that directory.
|
||||
(designed for moving multiple files from one subdirectory to another
|
||||
subdirectory that is initially empty.)
|
||||
|
||||
=================================================================
|
||||
Functional changes between version 4.4y versus version 4.4x (November 3, 2006)
|
||||
=================================================================
|
||||
apifilio.c
|
||||
Fixed parameter passing in seek functions to fix changes in beginning of
|
||||
file and end of file processing that was introduced with po_ulseek in version
|
||||
44v.
|
||||
apiint.c
|
||||
winhdisk.c
|
||||
Added minor changes to these files forcing routines to query the device drive
|
||||
again for media parms after a low level format. This was done in order to
|
||||
support device drivers that may change media parameters during a low level format.
|
||||
|
||||
Functional changes between version 4.4x versus version 4.4ws (August 25, 2006)
|
||||
=================================================================
|
||||
winhdisk,c - Removed some unreferenced performance diagnostic code that was
|
||||
winhdisk.c - Removed some unreferenced performance diagnostic code that was
|
||||
inadverdantly placed in the file.
|
||||
appcmdsh.c - Modified optional macro DISPLAY_ERRNO() to use RTFS print
|
||||
routines instead of printf.
|
||||
|
@ -1205,6 +1205,7 @@ Returns
|
||||
Nothing
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
void pc_free_all_i( DDRIVE *pdrive) /*__fn__*/
|
||||
{
|
||||
FINODE *pfi;
|
||||
|
@ -137,7 +137,6 @@ BOOLEAN pc_mkfs16(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
ltotsecs = pfmt->numcyl;
|
||||
ltotsecs *= pfmt->secptrk;
|
||||
ltotsecs *= pfmt->numhead;
|
||||
ltotsecs -= pfmt->numhide; //ctr modified
|
||||
|
||||
if (ltotsecs > 0xffffL)
|
||||
{
|
||||
@ -157,7 +156,7 @@ BOOLEAN pc_mkfs16(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
/* number heads */
|
||||
fr_WORD ( &(b[26]), pfmt->numhead); /*X*/
|
||||
/* number hidden sectors */
|
||||
fr_WORD ( &(b[28]), pfmt->numhide); /*X*/ //ctr modified
|
||||
fr_DWORD ( &(b[28]), pfmt->numhide);
|
||||
/* number of duplicate fats */
|
||||
b[16] = pfmt->numfats;
|
||||
fr_WORD ( &(b[22]), (word)pfmt->secpfat); /*X*/
|
||||
@ -231,7 +230,7 @@ BOOLEAN pc_mkfs16(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
}
|
||||
|
||||
|
||||
if (!devio_write_format(driveno, (dword) 0 + pfmt->numhide, &(b[0]), 1, use_raw) )
|
||||
if (!devio_write_format(driveno, 0 , &(b[0]), 1, use_raw) )
|
||||
{
|
||||
goto errex;
|
||||
}
|
||||
@ -246,7 +245,7 @@ BOOLEAN pc_mkfs16(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
if (fausize == 4)
|
||||
b[3] = (byte) 0xff;
|
||||
|
||||
blockno = pfmt->numhide + pfmt->secreserved + (i * pfmt->secpfat); //ctr modified
|
||||
blockno = pfmt->secreserved + (i * pfmt->secpfat);
|
||||
for ( j = 0; j < pfmt->secpfat; j++)
|
||||
{
|
||||
/* WRITE */
|
||||
@ -260,7 +259,7 @@ BOOLEAN pc_mkfs16(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
}
|
||||
|
||||
/* Now write the root sectors */
|
||||
blockno = pfmt->numhide + pfmt->secreserved + pfmt->numfats * pfmt->secpfat; //ctr modified
|
||||
blockno = pfmt->secreserved + pfmt->numfats * pfmt->secpfat;
|
||||
rtfs_memset(&b[0], 0, 512);
|
||||
for ( j = 0; j < (pfmt->numroot/INOPBLOCK) ; j++)
|
||||
{
|
||||
|
@ -13,7 +13,7 @@
|
||||
CLUSTERTYPE fatxx_clalloc(DDRIVE *pdr, CLUSTERTYPE clhint);
|
||||
CLUSTERTYPE fatxx_clgrow(DDRIVE *pdr, CLUSTERTYPE clno);
|
||||
|
||||
#if (FAT32)
|
||||
#if (FAT32)
|
||||
|
||||
struct fat32_info {
|
||||
dword fs_sig; /* Signature of FAT32 (0x61417272) */
|
||||
@ -31,21 +31,21 @@ BOOLEAN pc_init_drv_fat_info(DDRIVE *pdr, struct pcblk0 *pbl0)
|
||||
pdr->numfats = pbl0->numfats; /* Number of fat copies */
|
||||
if (pdr->secpfat == 0L)
|
||||
pdr->secpfat = pbl0->secpfat2;
|
||||
|
||||
|
||||
if (pbl0->flags & NOFATMIRROR)
|
||||
{
|
||||
pdr->fatblock = (BLOCKT) pbl0->secreserved +
|
||||
{
|
||||
pdr->fatblock = (BLOCKT) pbl0->secreserved +
|
||||
((pbl0->flags & ACTIVEFAT) * pdr->secpfat);
|
||||
pdr->numfats = 1;
|
||||
}
|
||||
else
|
||||
}
|
||||
else
|
||||
pdr->fatblock = (BLOCKT) pbl0->secreserved;
|
||||
/* The first block of the root is just past the fat copies */
|
||||
pdr->firstclblock = pdr->fatblock + pdr->secpfat * pdr->numfats;
|
||||
/* DM: 7-6-99: BUG FIX: */
|
||||
pdr->rootblock = (pbl0->rootbegin-2) * pdr->secpalloc + pdr->firstclblock;
|
||||
/* WRONG: pdr->rootblock = pbl0->rootbegin-2 + pdr->firstclblock; */
|
||||
|
||||
|
||||
/* Calculate the largest index in the file allocation table.
|
||||
Total # block in the cluster area)/Blockpercluster == s total
|
||||
Number of clusters. Entries 0 & 1 are reserved so the highest
|
||||
@ -55,7 +55,7 @@ BOOLEAN pc_init_drv_fat_info(DDRIVE *pdr, struct pcblk0 *pbl0)
|
||||
{
|
||||
/* Make sure the calculated index doesn't overflow the fat sectors */
|
||||
dword max_index;
|
||||
/* For FAT32 Each block of the fat holds 128 entries so the maximum index is
|
||||
/* For FAT32 Each block of the fat holds 128 entries so the maximum index is
|
||||
(pdr->secpfat * 128)-1; */
|
||||
max_index = (dword) pdr->secpfat;
|
||||
max_index *= 128;
|
||||
@ -63,15 +63,20 @@ BOOLEAN pc_init_drv_fat_info(DDRIVE *pdr, struct pcblk0 *pbl0)
|
||||
if (pdr->maxfindex > max_index)
|
||||
pdr->maxfindex = max_index;
|
||||
}
|
||||
|
||||
/* Create a hint for where we should write file data. We do this
|
||||
|
||||
/* Create a hint for where we should write file data. We do this
|
||||
because directories are allocated in one cluster chunks while
|
||||
file may allocate larger chunks. We Try to put directory
|
||||
file may allocate larger chunks. We Try to put directory
|
||||
data at the beginning of the disk in a seperate region so we
|
||||
do not break the contiguous space further out */
|
||||
|
||||
pdr->known_free_clusters = pbl0->free_alloc;
|
||||
pdr->free_contig_base = pbl0->next_alloc;
|
||||
/* 2-10-2007 - Added defensive code to check for a valid start hint. If it is out of range set it to
|
||||
the first cluster in the FAT */
|
||||
if (pdr->free_contig_base < 2 || pdr->free_contig_base >= pdr->maxfindex)
|
||||
pdr->free_contig_base = 2;
|
||||
|
||||
pdr->free_contig_pointer = pdr->free_contig_base;
|
||||
pdr->infosec = pbl0->infosec;
|
||||
pdr->fasize = 8;
|
||||
@ -79,21 +84,21 @@ BOOLEAN pc_init_drv_fat_info(DDRIVE *pdr, struct pcblk0 *pbl0)
|
||||
}
|
||||
CLUSTERTYPE pc_get_parent_cluster(DDRIVE *pdrive, DROBJ *pobj) /* __fatfn__ */
|
||||
{
|
||||
if ((pdrive->fasize == 8) &&
|
||||
if ((pdrive->fasize == 8) &&
|
||||
(pobj->blkinfo.my_frstblock == pdrive->rootblock))
|
||||
return(0);
|
||||
else
|
||||
return(pc_sec2cluster(pdrive,pobj->blkinfo.my_frstblock));
|
||||
}
|
||||
|
||||
/* Grab a cluster for a new directory entry.
|
||||
To minimize fragmentation give a hint where to start looking for new
|
||||
/* Grab a cluster for a new directory entry.
|
||||
To minimize fragmentation give a hint where to start looking for new
|
||||
clusters based on the position of the parent directory */
|
||||
|
||||
CLUSTERTYPE pc_alloc_dir(DDRIVE *pdrive, DROBJ *pmom) /* __fatfn__ */
|
||||
{
|
||||
CLUSTERTYPE clbase,cluster;
|
||||
if ( pdrive->fasize != 8 && pc_isroot(pmom))
|
||||
if ( pdrive->fasize != 8 && pc_isroot(pmom))
|
||||
clbase = 0;
|
||||
else
|
||||
clbase = pc_finode_cluster(pmom->pdrive,pmom->finode);
|
||||
@ -105,7 +110,7 @@ CLUSTERTYPE clbase,cluster;
|
||||
CLUSTERTYPE pc_grow_dir(DDRIVE *pdrive, DROBJ *pobj) /* __fatfn__ */
|
||||
{
|
||||
CLUSTERTYPE tmpcl, cluster;
|
||||
if ( pdrive->fasize != 8 && pc_isroot(pobj))
|
||||
if ( pdrive->fasize != 8 && pc_isroot(pobj))
|
||||
{
|
||||
rtfs_set_errno(PENOSPC);
|
||||
cluster = 0;
|
||||
@ -129,7 +134,7 @@ void pc_truncate_dir(DDRIVE *pdrive, DROBJ *pobj, CLUSTERTYPE cluster) /* __fatf
|
||||
tmpcl = pc_sec2cluster(pdrive, pdrive->rootblock);
|
||||
FATOP(pdrive)->fatop_cl_truncate_dir(pdrive, tmpcl, cluster);
|
||||
}
|
||||
else
|
||||
else
|
||||
FATOP(pdrive)->fatop_cl_truncate_dir(pdrive, pc_finode_cluster(pdrive,pobj->finode), cluster);
|
||||
}
|
||||
|
||||
@ -161,18 +166,18 @@ BOOLEAN pc_mkfs32(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
for (i=0;i<pfmt->secreserved;i++)
|
||||
{
|
||||
/* WRITE */
|
||||
if (!devio_write_format(driveno, pfmt->numhide + (dword) i, &(b[0]), 1, use_raw) ) //ctr modified
|
||||
if (!devio_write_format(driveno, (dword) i, &(b[0]), 1, use_raw) )
|
||||
{
|
||||
goto errex;
|
||||
}
|
||||
}
|
||||
#if (INCLUDE_FAT32_BOOT_CODE)
|
||||
copybuff(&b[0],&FAT32_BOOT_CODE[512],512);
|
||||
if (!devio_write_format(driveno, pfmt->numhide + (dword) 8, &(b[0]), 1, use_raw) ) //ctr modified
|
||||
if (!devio_write_format(driveno, (dword) 8, &(b[0]), 1, use_raw) )
|
||||
{
|
||||
goto errex;
|
||||
}
|
||||
if (!devio_write_format(driveno, pfmt->numhide + (dword) 2, &(b[0]), 1, use_raw) ) //ctr modified
|
||||
if (!devio_write_format(driveno, (dword) 2, &(b[0]), 1, use_raw) )
|
||||
{
|
||||
goto errex;
|
||||
}
|
||||
@ -204,14 +209,14 @@ BOOLEAN pc_mkfs32(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
fr_WORD ( &(b[17]), pfmt->numroot); /*X*/
|
||||
/* total sectors in the volume */
|
||||
|
||||
/* Set totsecs to 0 if size > 64k. This triggers sensing huge 4.0
|
||||
/* Set totsecs to 0 if size > 64k. This triggers sensing huge 4.0
|
||||
partitions. */
|
||||
|
||||
ltotsecs = pfmt->numcyl;
|
||||
ltotsecs *= pfmt->secptrk;
|
||||
ltotsecs *= pfmt->numhead;
|
||||
ltotsecs -= pfmt->numhide;
|
||||
|
||||
|
||||
|
||||
if (ltotsecs > 0xffffL)
|
||||
{
|
||||
/* HUGE partition the 3.xx totsecs field is zeroed */
|
||||
@ -253,7 +258,7 @@ BOOLEAN pc_mkfs32(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
/* HUGE partition */
|
||||
fr_DWORD ( &(b[32]), ltotsecs); /*X*/
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
fr_DWORD ( &(b[32]), 0L); /*X*/
|
||||
}
|
||||
@ -261,13 +266,13 @@ BOOLEAN pc_mkfs32(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
fr_DWORD( &(b[0x43]), pfmt->binary_volume_label);
|
||||
pc_cppad( &(b[0x47]), (byte*)pfmt->text_volume_label, 11);
|
||||
pc_cppad( &(b[0x52]), (byte*)"FAT32",8);
|
||||
fr_WORD(&(b[0x01fe]), (word)0xaa55);
|
||||
fr_WORD(&(b[0x01fe]), (word)0xaa55);
|
||||
|
||||
/* Count the size of the area managed by the fat. */
|
||||
ldata_area = ltotsecs;
|
||||
ldata_area -= pfmt->numfats * pfmt->secpfat;
|
||||
ldata_area -= pfmt->secreserved;
|
||||
|
||||
|
||||
/* Note: numroot must be an even multiple op INOPBLOCK */
|
||||
ldata_area -= pfmt->numroot/INOPBLOCK;
|
||||
|
||||
@ -275,7 +280,7 @@ BOOLEAN pc_mkfs32(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
lnclusters = ldata_area/pfmt->secpalloc;
|
||||
fausize = 8;
|
||||
|
||||
/* Check the FAT.
|
||||
/* Check the FAT.
|
||||
if ( (nibbles needed) > (nibbles if fatblocks)
|
||||
trouble;
|
||||
*/
|
||||
@ -303,8 +308,8 @@ BOOLEAN pc_mkfs32(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
rtfs_set_errno(PEINVALIDPARMS);
|
||||
goto errex;
|
||||
}
|
||||
|
||||
if (!devio_write_format(driveno, (dword) 0 + pfmt->numhide, &(b[0]), 1, use_raw) )
|
||||
|
||||
if (!devio_write_format(driveno, 0, &(b[0]), 1, use_raw) )
|
||||
{
|
||||
goto errex;
|
||||
}
|
||||
@ -316,11 +321,11 @@ BOOLEAN pc_mkfs32(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
fr_DWORD( &(b[0x01ec]), (dword)0x00000003);
|
||||
fr_WORD( &(b[0x01fe]), (word)0xaa55);
|
||||
|
||||
if (!devio_write_format(driveno, pfmt->numhide + (dword) 7, &(b[0]), 1, use_raw) ) //ctr modified
|
||||
if (!devio_write_format(driveno, (dword) 7, &(b[0]), 1, use_raw) )
|
||||
{
|
||||
goto errex;
|
||||
}
|
||||
if (!devio_write_format(driveno, pfmt->numhide + (dword) 1, &(b[0]), 1, use_raw) ) //ctr modified
|
||||
if (!devio_write_format(driveno, (dword) 1, &(b[0]), 1, use_raw) )
|
||||
{
|
||||
goto errex;
|
||||
}
|
||||
@ -334,7 +339,7 @@ BOOLEAN pc_mkfs32(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
b[2] = (byte) 0xff;
|
||||
j = (word) fausize;
|
||||
if (j==8) j=12;
|
||||
while(j > 3)
|
||||
while(j > 3)
|
||||
{
|
||||
if (j%4 == 0 && fausize == 8)
|
||||
b[--j] = (byte) 0x0f;
|
||||
@ -342,7 +347,7 @@ BOOLEAN pc_mkfs32(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
b[--j] = (byte) 0xff;
|
||||
}
|
||||
|
||||
blockno = pfmt->numhide + pfmt->secreserved + (i * pfmt->secpfat); //ctr modified
|
||||
blockno = pfmt->secreserved + (i * pfmt->secpfat);
|
||||
for ( j = 0; j < pfmt->secpfat; j++)
|
||||
{
|
||||
/* WRITE */
|
||||
@ -354,9 +359,9 @@ BOOLEAN pc_mkfs32(int driveno, FMTPARMS *pfmt, BOOLEAN use_raw)
|
||||
rtfs_memset(&b[0], 0, 512);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Now write the root sectors */
|
||||
blockno = pfmt->numhide + pfmt->secreserved + pfmt->numfats * pfmt->secpfat; //ctr modified
|
||||
blockno = pfmt->secreserved + pfmt->numfats * pfmt->secpfat;
|
||||
rtfs_memset(&b[0], 0, 512);
|
||||
/* Bug fix 11-22-99 use <pfmt->secpalloc instead of 8 */
|
||||
for(k=0;k<pfmt->secpalloc;k++) /* Is 8 blocks per cluster? */
|
||||
@ -387,10 +392,9 @@ void pc_pfinode_cluster(DDRIVE *pdr, FINODE *finode, CLUSTERTYPE value) /*__fatf
|
||||
}
|
||||
BOOLEAN pc_gblk0_32(word driveno, struct pcblk0 *pbl0, byte *b) /*__fn__*/
|
||||
{
|
||||
word i;
|
||||
if (pbl0->numroot == 0)
|
||||
{
|
||||
pbl0->secpfat2 = to_DWORD(b+0x24);
|
||||
pbl0->secpfat2 = to_DWORD(b+0x24);
|
||||
pbl0->flags = to_WORD(b+0x28);
|
||||
pbl0->fs_version = to_WORD(b+0x2a);
|
||||
pbl0->rootbegin = to_DWORD(b+0x2c);
|
||||
@ -401,8 +405,9 @@ BOOLEAN pc_gblk0_32(word driveno, struct pcblk0 *pbl0, byte *b)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
for (i=0; to_DWORD((void *)b) != FSINFOSIG && i<512; b++,i++);
|
||||
pbl0->free_alloc = to_DWORD((void *)&((struct fat32_info *)b)->free_alloc);
|
||||
/* 3-07-02 - Remove scan to find INFOSIG. Access at offset 484. */
|
||||
b += 484;
|
||||
pbl0->free_alloc = to_DWORD((void *)&((struct fat32_info *)b)->free_alloc);
|
||||
pbl0->next_alloc = to_DWORD((void *)&((struct fat32_info *)b)->next_alloc);
|
||||
}
|
||||
return(TRUE);
|
||||
@ -422,7 +427,6 @@ BOOLEAN pc_validate_partition_type(byte p_type)
|
||||
BOOLEAN fat_flushinfo(DDRIVE *pdr) /*__fn__*/
|
||||
{
|
||||
byte *pf;
|
||||
int j;
|
||||
BLKBUFF *buf;
|
||||
|
||||
if (pdr->fasize == 8)
|
||||
@ -436,9 +440,14 @@ BOOLEAN fat_flushinfo(DDRIVE *pdr) /*__fn__
|
||||
}
|
||||
/* Merge in the new values */
|
||||
pf = buf->data; /* Now we do not have to use the stack */
|
||||
for (j=0; to_DWORD(pf)!=FSINFOSIG && j<512; pf++,j++);
|
||||
/* 3-07-02 - Remove scan to find INFOSIG. Access at offset 484. */
|
||||
pf += 484;
|
||||
fr_DWORD((byte *) (&((struct fat32_info *)pf)->free_alloc), pdr->known_free_clusters );
|
||||
fr_DWORD((byte *) (&((struct fat32_info *)pf)->next_alloc), pdr->free_contig_pointer );
|
||||
/* fr_DWORD((byte *) (&((struct fat32_info *)pf)->next_alloc), pdr->free_contig_pointer ); */
|
||||
/* 2-10-2007 - put free_contig_base in allocation hint field. This forces cluster
|
||||
allocations to initially scan from the base of the FAT for free clusters rather
|
||||
than from the previous "most likely" location */
|
||||
fr_DWORD((byte *) (&((struct fat32_info *)pf)->next_alloc), pdr->free_contig_base );
|
||||
/* Use write_blk, to take advantage of the failsafe cache */
|
||||
if (!pc_write_blk(buf))
|
||||
{
|
||||
@ -462,7 +471,7 @@ byte * fatxx_pfswap(DDRIVE *pdr, CLUSTERTYPE index, BOOLEAN for_write);
|
||||
BOOLEAN fatxx_pfpdword(DDRIVE *pdr, dword index, dword *pvalue) /*__fatfn__*/
|
||||
{
|
||||
dword *ppage;
|
||||
dword offset;
|
||||
dword offset;
|
||||
/* Make sure we have access to the page. Mark it for writing */
|
||||
ppage = (dword *)fatxx_pfswap(pdr,index,TRUE);
|
||||
|
||||
@ -482,7 +491,7 @@ BOOLEAN fatxx_pfpdword(DDRIVE *pdr, dword index, dword *pvalue) /*__fat
|
||||
BOOLEAN fatxx_pfgdword(DDRIVE *pdr, dword index, dword *value) /*__fatfn__*/
|
||||
{
|
||||
dword *ppage;
|
||||
dword offset;
|
||||
dword offset;
|
||||
/* Make sure we have access to the page. Do not Mark it for writing */
|
||||
ppage = (dword *)fatxx_pfswap(pdr,index,FALSE);
|
||||
|
||||
@ -499,4 +508,3 @@ BOOLEAN fatxx_pfgdword(DDRIVE *pdr, dword index, dword *value) /*__fatf
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
* This code may not be redistributed in source or linkable object form
|
||||
* without the consent of its author.
|
||||
*/
|
||||
/* RTFATXX.C - Low level File allocation table management functions.
|
||||
/* RTFATXX.C - Low level File allocation table management functions.
|
||||
|
||||
Routines in this file include:
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
fatxx_pfaxx - Put a value to the FAT.
|
||||
fatxx_pfswap - Swap a block of the FAT into the cache.
|
||||
fatxx_fword - Get or put a value from the swap cache.
|
||||
*/
|
||||
*/
|
||||
|
||||
|
||||
|
||||
@ -53,7 +53,7 @@ BOOLEAN fatxx_pfgdword(DDRIVE *pdr, dword index, dword *value);
|
||||
return the number of contiguous clusters reserved.
|
||||
If pstart_cluster points to a valid cluster and dolink is true
|
||||
then link the new chain to it.
|
||||
|
||||
|
||||
Returns
|
||||
Returns the number of contiguous clusters found. Or zero on an error.
|
||||
pstart_cluster contains the address of the start of the chain on
|
||||
@ -74,7 +74,7 @@ CLUSTERTYPE fatxx_alloc_chain(DDRIVE *pdr, CLUSTERTYPE *pstart_cluster, CLUSTERT
|
||||
|
||||
is_error = 0;
|
||||
start_cluster = *pstart_cluster;
|
||||
if (start_cluster &&
|
||||
if (start_cluster &&
|
||||
( (start_cluster < 2) || (start_cluster > pdr->maxfindex) ) )
|
||||
{
|
||||
rtfs_set_errno(PEINVALIDCLUSTER); /* fatxx_alloc_chain: bad cluster value internal error */
|
||||
@ -82,7 +82,7 @@ CLUSTERTYPE fatxx_alloc_chain(DDRIVE *pdr, CLUSTERTYPE *pstart_cluster, CLUSTERT
|
||||
}
|
||||
|
||||
/* If the user provided a cluster we find the next cluster beyond that
|
||||
one. Otherwise we look at the disk structure and find the next
|
||||
one. Otherwise we look at the disk structure and find the next
|
||||
free cluster in the free cluster region after the current best guess
|
||||
of the region. If that fails we look to the beginning of the region
|
||||
and if that fails we look in the non-contiguous region. */
|
||||
@ -108,9 +108,9 @@ CLUSTERTYPE fatxx_alloc_chain(DDRIVE *pdr, CLUSTERTYPE *pstart_cluster, CLUSTERT
|
||||
if (!clno)
|
||||
{
|
||||
/* NEW */
|
||||
if (!start_cluster || start_cluster >= pdr->free_contig_pointer)
|
||||
if (!start_cluster || start_cluster >= pdr->free_contig_pointer)
|
||||
{
|
||||
/* search from free_contig_pointer to start_cluster or maxfindex whichever
|
||||
/* search from free_contig_pointer to start_cluster or maxfindex whichever
|
||||
is less */
|
||||
clno = fatxx_find_free_cluster(pdr, pdr->free_contig_pointer, last_cluster, &is_error);
|
||||
if (is_error) /* Error reading fat */
|
||||
@ -124,7 +124,7 @@ CLUSTERTYPE fatxx_alloc_chain(DDRIVE *pdr, CLUSTERTYPE *pstart_cluster, CLUSTERT
|
||||
{
|
||||
/* NEW */
|
||||
if (!start_cluster || start_cluster > pdr->free_contig_base)
|
||||
/* search from free_contig_base to start_cluster or free_contig_pointer whichever
|
||||
/* search from free_contig_base to start_cluster or free_contig_pointer whichever
|
||||
is less */
|
||||
clno = fatxx_find_free_cluster(pdr, pdr->free_contig_base, last_cluster, &is_error);
|
||||
if (is_error) /* Error reading fat */
|
||||
@ -206,7 +206,7 @@ CLUSTERTYPE value;
|
||||
*is_error = 0;
|
||||
for (i = startpt; i < endpt; i++)
|
||||
{
|
||||
if ( !fatxx_faxx(pdr, i, &value) )
|
||||
if ( !fatxx_faxx(pdr, i, &value) )
|
||||
{
|
||||
*is_error = 1;
|
||||
return(0);
|
||||
@ -224,9 +224,9 @@ CLUSTERTYPE value;
|
||||
PC_CLALLOC - Reserve and return the next free cluster on a drive
|
||||
|
||||
Description
|
||||
Given a DDRIVE, mark the next available cluster in the file allocation
|
||||
Given a DDRIVE, mark the next available cluster in the file allocation
|
||||
table as used and return the associated cluster number. Clhint provides
|
||||
a means of selecting clusters that are near eachother. This should
|
||||
a means of selecting clusters that are near eachother. This should
|
||||
reduce fragmentation.
|
||||
|
||||
NOTE: This routine is used to allocate single cluster chunks for
|
||||
@ -234,9 +234,9 @@ CLUSTERTYPE value;
|
||||
two regions. The first region is where single clusters chunks
|
||||
used in directory files come from. These are allocated by this
|
||||
routine only. Data file clusters are allocated by fatxx_alloc_chain.
|
||||
|
||||
|
||||
THE DISK IS NOT REALLY PARTITIONED. If this routine runs out of
|
||||
space in the first region it grabs a cluster from the second
|
||||
space in the first region it grabs a cluster from the second
|
||||
region.
|
||||
Returns
|
||||
Return a new cluster number or 0 if the disk is full.
|
||||
@ -295,7 +295,7 @@ CLUSTERTYPE fatxx_clalloc(DDRIVE *pdr, CLUSTERTYPE clhint) /
|
||||
by allocating a new cluster and linking clno to it. If clno is zero
|
||||
assume it is the start of a new file and allocate a new cluster.
|
||||
|
||||
Note: The chain is traversed to the end before linking in the new
|
||||
Note: The chain is traversed to the end before linking in the new
|
||||
cluster. The new cluster terminates the chain.
|
||||
Returns
|
||||
Return a new cluster number or 0 if the disk is full.
|
||||
@ -320,7 +320,7 @@ CLUSTERTYPE fatxx_clgrow(DDRIVE *pdr, CLUSTERTYPE clno) /
|
||||
nextcluster = fatxx_clnext(pdr , clno);
|
||||
while (nextcluster != 0xffffffff && ++range_check < MAX_CLUSTERS_PER_DIR)
|
||||
{
|
||||
if (!nextcluster) /* fatxx_clnext - set errno */
|
||||
if (!nextcluster) /* fatxx_clnext - set errno */
|
||||
return (0);
|
||||
clno = nextcluster;
|
||||
nextcluster = fatxx_clnext(pdr , clno);
|
||||
@ -356,15 +356,15 @@ CLUSTERTYPE fatxx_clgrow(DDRIVE *pdr, CLUSTERTYPE clno) /
|
||||
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
|
||||
/* Return a cluster to the free list */
|
||||
/* Note: The caller locks the fat before calling this routine */
|
||||
BOOLEAN fatxx_clrelease_dir(DDRIVE *pdr, CLUSTERTYPE clno) /*__fatfn__*/
|
||||
{
|
||||
int current_errno;
|
||||
/* This is a cleanup routine, an earlier event is the interesting errno
|
||||
to the application, so we restore errno if we fail */
|
||||
/* This is a cleanup routine, an earlier event is the interesting errno
|
||||
to the application, so we restore errno if we fail */
|
||||
current_errno = get_errno();
|
||||
/* No need to check clno value, pfaxx will catch it */
|
||||
/* Do not catch any lower level errors here. You will catch them soon enough */
|
||||
@ -513,8 +513,8 @@ CLUSTERTYPE fatxx_cl_truncate_dir(DDRIVE *pdr, CLUSTERTYPE cluster, CLUSTERTYPE
|
||||
{ /* Don't set errno in this function, it is a cleanup */
|
||||
return (0);
|
||||
}
|
||||
/* This is a cleanup routine, an earlier event is the interesting errno
|
||||
to the application, so we restore errno if we fail */
|
||||
/* This is a cleanup routine, an earlier event is the interesting errno
|
||||
to the application, so we restore errno if we fail */
|
||||
current_errno = get_errno();
|
||||
|
||||
nextcluster = fatxx_clnext(pdr , cluster);
|
||||
@ -553,16 +553,16 @@ CLUSTERTYPE fatxx_cl_truncate_dir(DDRIVE *pdr, CLUSTERTYPE cluster, CLUSTERTYPE
|
||||
|
||||
/******************************************************************************
|
||||
PC_PFAXXTERM - Write a terminating value to the FAT at clno.
|
||||
|
||||
|
||||
Description
|
||||
Given a DDRIVE,cluster number and value. Write the value 0xffffffff or
|
||||
Given a DDRIVE,cluster number and value. Write the value 0xffffffff or
|
||||
0xffff in the fat at clusterno. Handle 32, 16 and 12 bit fats correctly.
|
||||
|
||||
Returns
|
||||
FALSE if an io error occurred during fat swapping, else TRUE
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
/* Given a clno & fatval Put the value in the table at the index (clno) */
|
||||
/* Note: The caller locks the fat before calling this routine */
|
||||
BOOLEAN fatxx_pfaxxterm(DDRIVE *pdr, CLUSTERTYPE clno) /*__fatfn__*/
|
||||
@ -573,11 +573,11 @@ BOOLEAN fatxx_pfaxxterm(DDRIVE *pdr, CLUSTERTYPE clno) /*__fatfn_
|
||||
else
|
||||
#endif
|
||||
return(fatxx_pfaxx(pdr, clno, 0xffff));
|
||||
|
||||
|
||||
}
|
||||
/******************************************************************************
|
||||
PC_PFAXX - Write a value to the FAT at clno.
|
||||
|
||||
|
||||
Description
|
||||
Given a DDRIVE,cluster number and value. Write the value in the fat
|
||||
at clusterno. Handle 16 and 12 bit fats correctly.
|
||||
@ -586,7 +586,7 @@ BOOLEAN fatxx_pfaxxterm(DDRIVE *pdr, CLUSTERTYPE clno) /*__fatfn_
|
||||
No if an io error occurred during fat swapping, else TRUE.
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
/* Given a clno & fatval Put the value in the table at the index (clno) */
|
||||
/* Note: The caller locks the fat before calling this routine */
|
||||
BOOLEAN fatxx_pfaxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE value) /*__fatfn__*/
|
||||
@ -631,9 +631,9 @@ BOOLEAN fatxx_pfaxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE value)
|
||||
/*
|
||||
| W0 | W1 | W2 |
|
||||
A1 A0 B0 A2 B2 B1 C1 C0 D0 C2 D2 D1
|
||||
xx xx xx
|
||||
xx xx xx
|
||||
*/
|
||||
|
||||
|
||||
else if (offset == 1) /* (B1 B2 << 4) | B0 */
|
||||
{
|
||||
/* Hi nibble of b[1] is lo nibble of value */
|
||||
@ -653,9 +653,9 @@ BOOLEAN fatxx_pfaxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE value)
|
||||
/*
|
||||
| W0 | W1 | W2 |
|
||||
A1 A0 B0 A2 B2 B1 C1 C0 D0 C2 D2 D1
|
||||
xx xx xx
|
||||
xx xx xx
|
||||
*/
|
||||
|
||||
|
||||
else if (offset == 2) /*(C2 << 8) | C1 C2 */
|
||||
{
|
||||
/* b[1] = low byte of value */
|
||||
@ -677,8 +677,8 @@ BOOLEAN fatxx_pfaxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE value)
|
||||
A1 A0 B0 A2 B2 B1 C1 C0 D0 C2 D2 D1
|
||||
xx xx xx
|
||||
*/
|
||||
|
||||
else if (offset == 3) /* (D2 D1) << 4 | D0 */
|
||||
|
||||
else if (offset == 3) /* (D2 D1) << 4 | D0 */
|
||||
{
|
||||
/* Hi nibble b[0] == low nible of value */
|
||||
u.wrdbuf[0] &= 0x0f;
|
||||
@ -716,10 +716,10 @@ BOOLEAN fatxx_pfaxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE value)
|
||||
|
||||
/***************************************************************************
|
||||
PC_CLNEXT - Return the next cluster in a cluster chain
|
||||
|
||||
|
||||
|
||||
Description
|
||||
Given a DDRIVE and a cluster number, return the next cluster in the
|
||||
Given a DDRIVE and a cluster number, return the next cluster in the
|
||||
chain containing clno. Return 0 on end of chain.
|
||||
|
||||
Returns
|
||||
@ -749,20 +749,27 @@ CLUSTERTYPE fatxx_clnext(DDRIVE *pdr, CLUSTERTYPE clno)
|
||||
{
|
||||
_Oxffffffful = 0x0ffffffful;
|
||||
nxt &= _Oxffffffful;
|
||||
if ( nxt == 0x0ffffffful )
|
||||
nxt = 0xffffffff; /* end of chain */
|
||||
/* Bug fix 2-01-2007 - fatxx_clnext() changed to detect terminate
|
||||
on cluster value > xxfff7. Was expecting xxffff */
|
||||
if ( (nxt > 0x0ffffff7ul) && (nxt <= 0x0ffffffful) )
|
||||
nxt = 0xffffffff;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
#if (FAT32)
|
||||
if ( (nxt >= (CLUSTERTYPE)0xfff7) && (nxt <= (CLUSTERTYPE)0xffff) )
|
||||
/* Bug fix 2-01-2007 - fatxx_clnext() changed to detect terminate
|
||||
on cluster value > xxfff7. Was expecting xxffff */
|
||||
if ( (nxt > (CLUSTERTYPE)0xfff7) && (nxt <= (CLUSTERTYPE)0xffff) )
|
||||
#else
|
||||
/* If fat32 is not defined the nxt is always <= 0xffff. picky compilers
|
||||
notice this and emit a warning */
|
||||
if (nxt >= (CLUSTERTYPE)0xfff7)
|
||||
/* Bug fix 2-01-2007 - fatxx_clnext() changed to detect terminate
|
||||
on cluster value > xxfff7. Was expecting xxffff */
|
||||
if (nxt > (CLUSTERTYPE)0xfff7)
|
||||
#endif
|
||||
nxt = 0xffffffff; /* end of chain */
|
||||
|
||||
}
|
||||
if (nxt != 0xffffffff && (nxt < 2 || nxt > pdr->maxfindex) )
|
||||
{
|
||||
@ -780,10 +787,10 @@ CLUSTERTYPE fatxx_clnext(DDRIVE *pdr, CLUSTERTYPE clno)
|
||||
(the next cluster in a chain.) Handle 16 and 12 bit fats correctly.
|
||||
|
||||
Returns
|
||||
Returns the the value at clno. In pvalue.
|
||||
Returns the the value at clno. In pvalue.
|
||||
If any error occured while FAT swapping return FALSE else return TRUE.
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
/* Retrieve a value from the fat */
|
||||
BOOLEAN fatxx_faxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE *pvalue) /*__fatfn__*/
|
||||
{
|
||||
@ -827,9 +834,9 @@ BOOLEAN fatxx_faxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE *pvalue)
|
||||
/*
|
||||
| W0 | W1 | W2 |
|
||||
A1 A0 B0 A2 B2 B1 C1 C0 D0 C2 D2 D1
|
||||
xx xx xx
|
||||
xx xx xx
|
||||
*/
|
||||
|
||||
|
||||
else if (offset == 1) /* (B1 B2 << 4) | B0 */
|
||||
{
|
||||
/* BYTE 2 == High byte Byte 1 high nibb == low nib */
|
||||
@ -843,7 +850,7 @@ BOOLEAN fatxx_faxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE *pvalue)
|
||||
/*
|
||||
| W0 | W1 | W2 |
|
||||
A1 A0 B0 A2 B2 B1 C1 C0 D0 C2 D2 D1
|
||||
xx xx xx
|
||||
xx xx xx
|
||||
*/
|
||||
else if (offset == 2) /*(C2 << 8) | C1 C2 */
|
||||
{
|
||||
@ -859,8 +866,8 @@ BOOLEAN fatxx_faxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE *pvalue)
|
||||
A1 A0 B0 A2 B2 B1 C1 C0 D0 C2 D2 D1
|
||||
xx xx xx
|
||||
*/
|
||||
|
||||
else if (offset == 3) /* (D2 D1) << 4 | D0 */
|
||||
|
||||
else if (offset == 3) /* (D2 D1) << 4 | D0 */
|
||||
{
|
||||
result = u.wrdbuf[1];
|
||||
result <<= 4;
|
||||
@ -877,7 +884,7 @@ BOOLEAN fatxx_faxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE *pvalue)
|
||||
return (FALSE);
|
||||
#else
|
||||
if ( fatxx_pfgdword( pdr, clno, (dword *) &u.wrdbuf[0] ))
|
||||
result = (CLUSTERTYPE) to_DWORD(&u.wrdbuf[0]);
|
||||
result = (CLUSTERTYPE) to_DWORD(&u.wrdbuf[0]);
|
||||
else
|
||||
return (FALSE);
|
||||
#endif
|
||||
@ -904,7 +911,7 @@ BOOLEAN fatxx_faxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE *pvalue)
|
||||
Starting at start_cluster return the number of contiguous clusters
|
||||
allocated in the chain containing start_cluster or n_clusters,
|
||||
whichever is less.
|
||||
|
||||
|
||||
Returns
|
||||
Returns the number of contiguous clusters found. Or zero on an error.
|
||||
This function should always return at least one. (start_cluster). Unless
|
||||
@ -915,7 +922,7 @@ BOOLEAN fatxx_faxx(DDRIVE *pdr, CLUSTERTYPE clno, CLUSTERTYPE *pvalue)
|
||||
the first cluster in the next segment of the chain.
|
||||
. If we are still in a section it contains
|
||||
the next cluster in the current segment of the chain.
|
||||
. If we are at the end of the chain it contains the last cluster
|
||||
. If we are at the end of the chain it contains the last cluster
|
||||
in the chain.
|
||||
|
||||
****************************************************************************/
|
||||
@ -930,8 +937,8 @@ CLUSTERTYPE fatxx_get_chain(DDRIVE *pdr, CLUSTERTYPE start_cluster, CLUSTERTYPE
|
||||
value = 0;
|
||||
clno = start_cluster;
|
||||
n_contig = 1;
|
||||
*pnext_cluster = 0;
|
||||
|
||||
*pnext_cluster = 0;
|
||||
|
||||
/* Get each FAT entry. If its value points to the next contiguous entry
|
||||
continue. Otherwise we have reached the end of the contiguous chain.
|
||||
At which point we return the number of contig s found and by reference
|
||||
@ -939,11 +946,11 @@ CLUSTERTYPE fatxx_get_chain(DDRIVE *pdr, CLUSTERTYPE start_cluster, CLUSTERTYPE
|
||||
*/
|
||||
*end_of_chain = 0;
|
||||
for (;;)
|
||||
{
|
||||
{
|
||||
next_cluster = fatxx_clnext(pdr, clno);
|
||||
if (!next_cluster) /* clnext detected an error */
|
||||
return(0);
|
||||
/* check for end markers set next cluster to the last
|
||||
/* check for end markers set next cluster to the last
|
||||
cluster in the chain if we are at the end */
|
||||
if (next_cluster == 0xffffffff) /* clnext detected end */
|
||||
{
|
||||
@ -969,16 +976,16 @@ CLUSTERTYPE fatxx_get_chain(DDRIVE *pdr, CLUSTERTYPE start_cluster, CLUSTERTYPE
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
PC_FATSW - Map in a page of the FAT
|
||||
PC_FATSW - Map in a page of the FAT
|
||||
****************************************************************************/
|
||||
|
||||
|
||||
/* Swap in the page containing index */
|
||||
/* Note: The caller locks the fat before calling this routine */
|
||||
byte * fatxx_pfswap(DDRIVE *pdr, CLUSTERTYPE index, BOOLEAN for_write) /*__fatfn__*/
|
||||
{
|
||||
dword block_offset_in_fat;
|
||||
dword flags;
|
||||
|
||||
|
||||
if (pdr->fasize == 8)
|
||||
block_offset_in_fat = (dword)(index >> 7);
|
||||
else
|
||||
@ -997,7 +1004,7 @@ byte * fatxx_pfswap(DDRIVE *pdr, CLUSTERTYPE index, BOOLEAN for_write) /
|
||||
BOOLEAN fatxx_fword(DDRIVE *pdr, CLUSTERTYPE index, word *pvalue, BOOLEAN putting) /*__fatfn__*/
|
||||
{
|
||||
word *ppage;
|
||||
word offset;
|
||||
word offset;
|
||||
/* Make sure we have access to the page. Mark it for writing (if a put) */
|
||||
ppage = (word *)fatxx_pfswap(pdr,index,putting);
|
||||
|
||||
@ -1020,8 +1027,6 @@ FAT_DRIVER fatxx_d;
|
||||
static BOOLEAN init_fat(DDRIVE *pdr)
|
||||
{
|
||||
FAT_DRIVER *pfd;
|
||||
/* int driveno;
|
||||
driveno = pdr->driveno;*/
|
||||
pfd = &fatxx_d;
|
||||
pfd->fatop_alloc_chain = fatxx_alloc_chain;
|
||||
pfd->fatop_clnext = fatxx_clnext;
|
||||
@ -1068,4 +1073,3 @@ BOOLEAN init_fat12(DDRIVE *pdr)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -2,9 +2,9 @@
|
||||
* rtkernfn.c - Miscelaneous portable functions
|
||||
*
|
||||
* ERTFS portable process management and other functions.
|
||||
* This file is portable but it requires interaction with the
|
||||
* This file is portable but it requires interaction with the
|
||||
* porting layer functions in portrtfs.c.
|
||||
*
|
||||
*
|
||||
* Copyright EBS Inc. 1987-2003
|
||||
* All rights reserved.
|
||||
* This code may not be redistributed in source or linkable object form
|
||||
@ -33,7 +33,7 @@ BOOLEAN rtfs_resource_init(void) /*__fn__*/
|
||||
|
||||
PRTFS_SYSTEM_USER rtfs_get_system_user(void)
|
||||
{
|
||||
int i;
|
||||
int i,j;
|
||||
dword t;
|
||||
|
||||
t = rtfs_port_get_taskid();
|
||||
@ -58,6 +58,17 @@ return_it:
|
||||
}
|
||||
/* We are out of user structures so use element 0 */
|
||||
i = 0;
|
||||
/* Bug fix 02-01-2007 - If we are using the default user (0), make sure the
|
||||
current working directory objects are freed and the finode access counts
|
||||
are reduced */
|
||||
for(j = 0; j < prtfs_cfg->cfg_NDRIVES; j++)
|
||||
{
|
||||
if(prtfs_cfg->rtfs_user_table[i].lcwd[j])
|
||||
{
|
||||
pc_freeobj((DROBJ *) prtfs_cfg->rtfs_user_table[i].lcwd[j]);
|
||||
prtfs_cfg->rtfs_user_table[i].lcwd[j] = 0;
|
||||
}
|
||||
}
|
||||
goto return_it;
|
||||
}
|
||||
|
||||
@ -84,10 +95,10 @@ PRTFS_SYSTEM_USER s;
|
||||
*
|
||||
* This routine is called by RTFS when it closes a drive.
|
||||
* The routine must release the current directory object for that drive
|
||||
* for each user. If a user does not have a CWD for the drive it should
|
||||
* for each user. If a user does not have a CWD for the drive it should
|
||||
* not call pc_freeobj.
|
||||
*
|
||||
* In the reference port we cycle through our array of user structures
|
||||
* In the reference port we cycle through our array of user structures
|
||||
* to provide the enumeration. Other implementations are equally valid.
|
||||
*/
|
||||
|
||||
@ -118,24 +129,24 @@ int i;
|
||||
|
||||
/* int rtfs_set_driver_errno() - set device driver errno for the calling task
|
||||
|
||||
Saves driver errno for the calling task in array based on callers taskid.
|
||||
Saves driver errno for the calling task in array based on callers taskid.
|
||||
|
||||
Note: This routine must not be called from the interrupt service layer
|
||||
|
||||
Returns nothing
|
||||
Returns nothing
|
||||
*/
|
||||
void rtfs_set_driver_errno(dword error) /*__fn__*/
|
||||
{
|
||||
rtfs_get_system_user()->rtfs_driver_errno = error;
|
||||
}
|
||||
|
||||
|
||||
/* ********************************************************************
|
||||
|
||||
dword rtfs_get_driver_errno() - get device driver errno for the calling task
|
||||
|
||||
Returns device driver errno for the calling task in array based on
|
||||
callers taskid.
|
||||
/* ********************************************************************
|
||||
|
||||
dword rtfs_get_driver_errno() - get device driver errno for the calling task
|
||||
|
||||
Returns device driver errno for the calling task in array based on
|
||||
callers taskid.
|
||||
*/
|
||||
|
||||
dword rtfs_get_driver_errno(void) /*__fn__*/
|
||||
@ -146,9 +157,9 @@ dword rtfs_get_driver_errno(void) /*__fn__*/
|
||||
|
||||
/* int rtfs_set_errno() - set errno for the calling task
|
||||
|
||||
Saves errno for the calling task in array based on callers taskid.
|
||||
Saves errno for the calling task in array based on callers taskid.
|
||||
|
||||
Returns -1
|
||||
Returns -1
|
||||
*/
|
||||
int rtfs_set_errno(int error) /*__fn__*/
|
||||
{
|
||||
@ -156,12 +167,12 @@ int rtfs_set_errno(int error) /*__fn__*/
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
||||
/* ********************************************************************
|
||||
|
||||
int get_errno() - get errno for the calling task
|
||||
|
||||
Returns errno for the calling task in array based on callers taskid.
|
||||
/* ********************************************************************
|
||||
|
||||
int get_errno() - get errno for the calling task
|
||||
|
||||
Returns errno for the calling task in array based on callers taskid.
|
||||
*/
|
||||
|
||||
int get_errno(void) /*__fn__*/
|
||||
@ -177,19 +188,19 @@ void pc_report_error(int error_number) /*__fn__*/
|
||||
RTFS_PRINT_LONG_1((dword) error_number, PRFLG_NL);
|
||||
}
|
||||
|
||||
/* This routine will be called if an IO error occurs. It must return
|
||||
either CRITICAL_ERROR_ABORT to have the operation aborted and
|
||||
/* This routine will be called if an IO error occurs. It must return
|
||||
either CRITICAL_ERROR_ABORT to have the operation aborted and
|
||||
the drive to be unmounted or CRITICAL_ERROR_RETRY to force a retry
|
||||
of the operation.
|
||||
|
||||
This routine prompts the user to Abort or Retry. If console input
|
||||
is not implemented it return Abort. This routine may be modified
|
||||
is not implemented it return Abort. This routine may be modified
|
||||
to take corrective action (such as ask the user to reinsert the media)
|
||||
before return Retry or Abort
|
||||
before return Retry or Abort
|
||||
*/
|
||||
|
||||
KS_CONSTANT int med_st[] =
|
||||
{
|
||||
KS_CONSTANT int med_st[] =
|
||||
{
|
||||
USTRING_SYS_NULL, /* "" */
|
||||
USTRING_CRITERR_02, /* "BAD_FORMAT" */
|
||||
USTRING_CRITERR_03, /* "CRERR_NO_CARD" */
|
||||
@ -217,7 +228,7 @@ BOOLEAN needs_flush;
|
||||
needs_flush = FALSE;
|
||||
|
||||
RTFS_PRINT_STRING_1(USTRING_CRITERR_07,0); /* "Media status == " */
|
||||
RTFS_PRINT_STRING_1(med_st[media_status],PRFLG_NL);
|
||||
RTFS_PRINT_STRING_1(med_st[media_status],PRFLG_NL);
|
||||
RTFS_PRINT_STRING_2(USTRING_CRITERR_08, pdr->volume_label, PRFLG_NL); /* "Volume == " */
|
||||
|
||||
if (needs_flush)
|
||||
@ -231,7 +242,7 @@ BOOLEAN needs_flush;
|
||||
CS_OP_ASSIGN_ASCII(p,'A');
|
||||
CS_OP_INC_PTR(p);
|
||||
CS_OP_TERM_STRING(p);
|
||||
return (CRITICAL_ERROR_ABORT); /* ctr modified */
|
||||
return( CRITICAL_ERROR_ABORT); /* ctr modified */
|
||||
// for (;;)
|
||||
// {
|
||||
// /* "Type A to abort R to Retry" */
|
||||
@ -247,7 +258,7 @@ BOOLEAN needs_flush;
|
||||
PC_NUM_DRIVES - Return total number of drives in the system
|
||||
|
||||
Description
|
||||
This routine returns the number of drives in the system
|
||||
This routine returns the number of drives in the system
|
||||
|
||||
Returns
|
||||
The number
|
||||
@ -261,7 +272,7 @@ int pc_num_drives(void) /* __fn__ */
|
||||
PC_NUSERFILES - Return total number of uses allowed in the system
|
||||
|
||||
Description
|
||||
This routine returns the number of user in the system
|
||||
This routine returns the number of user in the system
|
||||
|
||||
Returns
|
||||
The number
|
||||
@ -275,7 +286,7 @@ int pc_num_users(void) /* __fn__ */
|
||||
PC_NUSERFILES - Return total number of userfiles alloed in the system
|
||||
|
||||
Description
|
||||
This routine returns the number of user files in the system
|
||||
This routine returns the number of user files in the system
|
||||
|
||||
Returns
|
||||
The number
|
||||
@ -318,7 +329,7 @@ BOOLEAN pc_validate_driveno(int driveno) /* __fn__ */
|
||||
memory management this way to provide maximum flexibility for embedded
|
||||
system developers. In the reference port we use malloc to allocate the
|
||||
various chunks of memory we need, but we could just have easily comiled
|
||||
the tables into the BSS section of the program.
|
||||
the tables into the BSS section of the program.
|
||||
|
||||
Use whatever method makes sense in you system.
|
||||
|
||||
@ -359,18 +370,18 @@ BOOLEAN pc_memory_init(void) /*__
|
||||
return(FALSE);
|
||||
|
||||
/* Initialize buffer pools for each drive */
|
||||
for (pdrive=prtfs_cfg->mem_drives_structures,i = 0;
|
||||
for (pdrive=prtfs_cfg->mem_drives_structures,i = 0;
|
||||
i < prtfs_cfg->cfg_NDRIVES; i++, pdrive++)
|
||||
{
|
||||
/* Use the globally shared block buffer pool.
|
||||
this can be overriden through the API to assign a private buffer pool to the drive */
|
||||
this can be overriden through the API to assign a private buffer pool to the drive */
|
||||
pdrive->pbuffcntxt = &prtfs_cfg->buffcntxt;
|
||||
|
||||
/* Initialize the fat block buffer array */
|
||||
if (!pc_initialize_fat_block_pool(
|
||||
&pdrive->fatcontext,
|
||||
&pdrive->fatcontext,
|
||||
prtfs_cfg->cfg_FAT_BUFFER_SIZE[i], prtfs_cfg->fat_buffers[i],
|
||||
prtfs_cfg->cfg_FAT_HASHTBL_SIZE[i], prtfs_cfg->fat_hash_table[i],
|
||||
prtfs_cfg->cfg_FAT_HASHTBL_SIZE[i], prtfs_cfg->fat_hash_table[i],
|
||||
prtfs_cfg->fat_primary_cache[i], prtfs_cfg->fat_primary_index[i]))
|
||||
return(FALSE);
|
||||
|
||||
@ -380,7 +391,7 @@ BOOLEAN pc_memory_init(void) /*__
|
||||
DROBJ memory allocator routine. */
|
||||
pobj = prtfs_cfg->mem_drobj_freelist = prtfs_cfg->mem_drobj_pool;
|
||||
pobj->is_free = TRUE;
|
||||
for (i = 0,j = 1; i < prtfs_cfg->cfg_NDROBJS-1; i++, j++)
|
||||
for (i = 0,j = 1; i < prtfs_cfg->cfg_NDROBJS-1; i++, j++)
|
||||
{
|
||||
pobj = prtfs_cfg->mem_drobj_freelist + j;
|
||||
pobj->is_free = TRUE;
|
||||
@ -389,10 +400,10 @@ BOOLEAN pc_memory_init(void) /*__
|
||||
prtfs_cfg->mem_drobj_freelist[prtfs_cfg->cfg_NDROBJS-1].pdrive = 0;
|
||||
|
||||
/* Make a NULL terminated FINODE freelist using
|
||||
pnext as the link. This linked freelist is used by the FINODE
|
||||
pnext as the link. This linked freelist is used by the FINODE
|
||||
memory allocator routine */
|
||||
pfi = prtfs_cfg->mem_finode_freelist = prtfs_cfg->mem_finode_pool;
|
||||
for (i = 0; i < prtfs_cfg->cfg_NFINODES-1; i++)
|
||||
for (i = 0; i < prtfs_cfg->cfg_NFINODES-1; i++)
|
||||
{
|
||||
pfi->is_free = TRUE;
|
||||
pfi++;
|
||||
@ -432,7 +443,7 @@ DROBJ *preturn;
|
||||
if (!pobj->is_free)
|
||||
{
|
||||
pobj->is_free = TRUE;
|
||||
/* Free it by putting it at the head of the freelist
|
||||
/* Free it by putting it at the head of the freelist
|
||||
NOTE: pdrive is used to link the freelist */
|
||||
pobj->pdrive = (DDRIVE *) prtfs_cfg->mem_drobj_freelist;
|
||||
prtfs_cfg->mem_drobj_freelist = pobj;
|
||||
@ -519,4 +530,3 @@ BLKBUFF *pfile_buffer;
|
||||
return(preturn);
|
||||
}
|
||||
|
||||
|
||||
|
@ -161,7 +161,14 @@ BOOLEAN pc_i_dskopen(int driveno) /*__fn__*/
|
||||
pdr->secreserved = bl0.secreserved; /* sectors reserved */
|
||||
pdr->secptrk = bl0.secptrk; /* sectors per track */
|
||||
pdr->numhead = bl0.numhead; /* number of heads */
|
||||
pdr->numhide =bl0.numhide; /* # hidden sectors */
|
||||
{
|
||||
|
||||
dword ltemp;
|
||||
pdr->numhide =bl0.numhide; /* # hidden sectors */
|
||||
ltemp = bl0.numhide2;
|
||||
ltemp <<= 16;
|
||||
pdr->numhide |= ltemp;
|
||||
}
|
||||
|
||||
copybuff(pdr->volume_label, &bl0.vollabel[0], 11);
|
||||
pdr->volume_label[11] = 0;
|
||||
|
@ -1,8 +1,8 @@
|
||||
/*
|
||||
* rttermin.c - Portable portion of terminal IO routines
|
||||
*
|
||||
*
|
||||
* EBS - ERTFS
|
||||
*
|
||||
*
|
||||
* Copyright EBS Inc. 1987-2003
|
||||
* All rights reserved.
|
||||
* This code may not be redistributed in source or linkable object form
|
||||
@ -11,24 +11,24 @@
|
||||
*
|
||||
* Module description:
|
||||
* This file contains terminal IO routines used by the sample programs
|
||||
* and by routines that print diagnostics.
|
||||
* and by routines that print diagnostics.
|
||||
*
|
||||
*
|
||||
* The rest of the routines in this module are portable with the possible
|
||||
* exception of these two routines:
|
||||
*
|
||||
*
|
||||
* void rtfs_print_format_dir
|
||||
* void rtfs_print_format_stat
|
||||
*
|
||||
* These routines may require porting if sprintf() is not available to you.
|
||||
* They are called only by the test shell prgram (tstsh.c) and are used to create attractive
|
||||
* formatted output for the DIR and STAT commands. They rely on sprintf to format the output
|
||||
* They are called only by the test shell prgram (tstsh.c) and are used to create attractive
|
||||
* formatted output for the DIR and STAT commands. They rely on sprintf to format the output
|
||||
* to provide a system specific console output routine. A define is provided
|
||||
* in this file named SYS_SUPPORTS_SPRINTF, if this is set to one the routines format the output
|
||||
* using sprintf, otherwise they print a fixd string. If sprintf is not available to you set
|
||||
* SYS_SUPPORTS_SPRINTF to zero.
|
||||
* in this file named SYS_SUPPORTS_SPRINTF, if this is set to one the routines format the output
|
||||
* using sprintf, otherwise they print a fixd string. If sprintf is not available to you set
|
||||
* SYS_SUPPORTS_SPRINTF to zero.
|
||||
*
|
||||
*
|
||||
*
|
||||
* The following portable routines are also provided in this file.
|
||||
*
|
||||
* rtfs_print_string_1(int stringid,int flags)
|
||||
@ -36,29 +36,29 @@
|
||||
*
|
||||
* These two routines are used to print string values to the console. They are portable,
|
||||
* relying on the routine rtfs_port_puts(() to provide a system specific console output routine.
|
||||
* If no output is desired define the macros RTFS_PRINT_STRING_1 and RTFS_PRINT_STRING_2 as
|
||||
* If no output is desired define the macros RTFS_PRINT_STRING_1 and RTFS_PRINT_STRING_2 as
|
||||
* no-ops in portterm.h.
|
||||
*
|
||||
* rtfs_print_long_1
|
||||
*
|
||||
* This routine is used to print long integers values to the console. It relies on
|
||||
* rtfs_port_puts(() to provide a system specific console output routine. If no output
|
||||
* This routine is used to print long integers values to the console. It relies on
|
||||
* rtfs_port_puts(() to provide a system specific console output routine. If no output
|
||||
* is desired define the macro RTFS_PRINT_LONG_1 as a no-op in portterm.h.
|
||||
*
|
||||
*
|
||||
*
|
||||
* rtfs_print_prompt_user() -
|
||||
*
|
||||
* This routine is called when the ERTFS demo programs and critical error handlr routine
|
||||
* requires console input from the user. It takes as input a prompt id (this is a numeric
|
||||
* This routine is called when the ERTFS demo programs and critical error handlr routine
|
||||
* requires console input from the user. It takes as input a prompt id (this is a numeric
|
||||
* handle to the prompt strings in the prompts string table prompt_table[]
|
||||
* in portstr.c and the address of a buffer where to place the console
|
||||
* input.
|
||||
* in portstr.c and the address of a buffer where to place the console
|
||||
* input.
|
||||
*
|
||||
* This routine displays the prompt by calling rtfs_print_one_string() and then
|
||||
* calls the target specific routine tm_gets_rtfs() to recieve the console
|
||||
* input.
|
||||
*
|
||||
* Note: If in your system console input is not available you may still
|
||||
* Note: If in your system console input is not available you may still
|
||||
* use the demo and test applications by modifying this routine so that
|
||||
* it returns specific strings to simulate user input. The values to return
|
||||
* must be relevant to the value of prompt_id. Here are several prompt_id
|
||||
@ -66,12 +66,12 @@
|
||||
*
|
||||
*
|
||||
* UPROMPT_CRITERR - This is the prompt_id argument when a drive IO error
|
||||
* occurs. You should return "A" in the return buffer. This will cause the
|
||||
* occurs. You should return "A" in the return buffer. This will cause the
|
||||
* IO operation to fail and return an error to the API.
|
||||
*
|
||||
* UPROMPT_TSTSH - If you returned "S" for UPROMPT_RTFSDEM1 then this
|
||||
* prompt will be called after the test shell starts and repeatedly
|
||||
* thereafter. Return strings for this prompt as if you were typing
|
||||
* UPROMPT_TSTSH - If you returned "S" for UPROMPT_RTFSDEM1 then this
|
||||
* prompt will be called after the test shell starts and repeatedly
|
||||
* thereafter. Return strings for this prompt as if you were typing
|
||||
* input to the command shell.
|
||||
*
|
||||
* For example a sequence of strings might fill.
|
||||
@ -82,7 +82,7 @@
|
||||
*
|
||||
* If you do not wish to use the interactive test programs you need
|
||||
* not implement this function.
|
||||
* If sprintf is not available to you set SYS_SUPPORTS_SPRINTF to zero.
|
||||
* If sprintf is not available to you set SYS_SUPPORTS_SPRINTF to zero.
|
||||
*/
|
||||
#define SYS_SUPPORTS_SPRINTF 0
|
||||
#include <rtfs.h>
|
||||
@ -139,13 +139,13 @@ void rtfs_print_format_dir(byte *display_buffer, DSTAT *statobj)
|
||||
dirstr = (byte *)"<DIR>";
|
||||
else
|
||||
dirstr = (byte *)" ";
|
||||
|
||||
|
||||
p = display_buffer;
|
||||
*p = 0;
|
||||
|
||||
sprintf((char *)p,"%-8s.", (char *)&(statobj->fname[0]));
|
||||
sprintf((char *)gotoeos(p),"%-3s", (char *)&(statobj->fext[0]));
|
||||
// sprintf((char *)gotoeos(p)," %10lu ", statobj->fsize);
|
||||
/* sprintf((char *)gotoeos(p)," %10lu ", statobj->fsize); */
|
||||
sprintf((char *)gotoeos(p)," %10u ", statobj->fsize);
|
||||
|
||||
sprintf((char *)gotoeos(p),"%5s", dirstr);
|
||||
@ -163,7 +163,7 @@ void rtfs_print_format_dir(byte *display_buffer, DSTAT *statobj)
|
||||
{
|
||||
/* For vfat systems display the attributes and the long file name
|
||||
seperately. This is a trick since the attribute are ASCII and the
|
||||
LFN is UNICODE. If we print seperately we will see them both correctly */
|
||||
LFN is UNICODE. If we print seperately we will see them both correctly */
|
||||
sprintf((char *)gotoeos(p), " - ");
|
||||
rtfs_print_one_string(display_buffer, 0);
|
||||
rtfs_print_one_string(statobj->lfname,PRFLG_NL);
|
||||
@ -197,7 +197,7 @@ byte *p;
|
||||
|
||||
void rtfs_print_one_string(byte *pstr,int flags)
|
||||
{
|
||||
|
||||
|
||||
rtfs_port_puts(CS_OP_FORMAT_OUTPUT(pstr));
|
||||
if (flags & PRFLG_NL)
|
||||
rtfs_port_puts((byte *)"\n");
|
||||
@ -212,11 +212,11 @@ int digit;
|
||||
byte *olddest = dest;
|
||||
byte * p;
|
||||
|
||||
p = &(buffer[32]);
|
||||
p = &(buffer[32]);
|
||||
|
||||
*p = '\0';
|
||||
|
||||
/* Convert num to a string going from dest[31] backwards */
|
||||
/* Convert num to a string going from dest[31] backwards */
|
||||
/* Nasty little ItoA algorithm */
|
||||
do
|
||||
{
|
||||
@ -232,4 +232,3 @@ byte * p;
|
||||
while((*dest++=*p++)!='\0');
|
||||
return (olddest);
|
||||
}
|
||||
|
||||
|
@ -54,6 +54,7 @@ Summary
|
||||
*/
|
||||
|
||||
|
||||
void pc_calculate_chs(dword total, dword *cylinders, int *heads, int *secptrack);
|
||||
|
||||
#define DEFAULT_HOST_DISK_SIZE 10240 /* 5M, FAT16 */
|
||||
|
||||
@ -61,9 +62,6 @@ Summary
|
||||
#define WINDOWS_HOSTDISK_SPRINTF sprintf
|
||||
|
||||
|
||||
void calculate_hcn(long n_blocks, PDEV_GEOMETRY pgeometry);
|
||||
|
||||
|
||||
#define MAXSEGMENTS_PER_UNIT 16
|
||||
#define MAX_UNITS 8
|
||||
struct file64 {
|
||||
@ -166,7 +164,6 @@ DWORD size, s;
|
||||
return((dword)size);
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN hostdisk_io_64(int unit, dword block, void *buffer, word _count, BOOLEAN reading) /*__fn__*/
|
||||
{
|
||||
dword segment_number;
|
||||
@ -177,12 +174,6 @@ dword nbytes,nblocks;
|
||||
byte *bbuffer;
|
||||
bbuffer = (byte *) buffer;
|
||||
count = (dword) _count;
|
||||
// if (reading)
|
||||
// printf("%d,", block);
|
||||
//else
|
||||
// printf("%d;", block);
|
||||
//if (block < 2000)
|
||||
// printf("\n");
|
||||
while (count)
|
||||
{
|
||||
segment_number = block/BLOCKS_PER_GIG;
|
||||
@ -315,7 +306,7 @@ DDRIVE *pdr;
|
||||
gc.dev_geometry_lbas = size_64bit_volume(pdr->logical_unit_number);
|
||||
if (!gc.dev_geometry_lbas)
|
||||
return(-1);
|
||||
calculate_hcn(gc.dev_geometry_lbas, &gc);
|
||||
pc_calculate_chs(gc.dev_geometry_lbas, &gc.dev_geometry_cylinders, &gc.dev_geometry_heads, &gc.dev_geometry_secptrack);
|
||||
copybuff(pargs, &gc, sizeof(gc));
|
||||
return (0);
|
||||
}
|
||||
@ -402,8 +393,7 @@ DDRIVE *pdr;
|
||||
|
||||
/* Update caller's idea of geometry */
|
||||
pgc->dev_geometry_lbas = l;
|
||||
calculate_hcn(pgc->dev_geometry_lbas, pgc);
|
||||
|
||||
pc_calculate_chs(pgc->dev_geometry_lbas, &pgc->dev_geometry_cylinders, &pgc->dev_geometry_heads, &pgc->dev_geometry_secptrack);
|
||||
return(0);
|
||||
}
|
||||
break;
|
||||
@ -448,5 +438,4 @@ DDRIVE *pdr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif /* (INCLUDE_HOSTDISK) */
|
||||
|
@ -11,7 +11,7 @@
|
||||
*
|
||||
* Description:
|
||||
* This file contains porting layer tuning constants for configuring RTFS.
|
||||
* It is included by rtfsconf.h.
|
||||
* It is included by pcconf.h.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
@ -25,26 +25,23 @@
|
||||
#define KS_CONSTANT const /* See porting reference guide for explanation */
|
||||
#define KS_FAR /* See porting reference guide for explanation */
|
||||
|
||||
/* Compile time constants to control device inclusion and includion of
|
||||
porting layer subroutines */
|
||||
|
||||
/* Compile time constants to control device inclusion
|
||||
See the reference guide for an explanation
|
||||
*/
|
||||
|
||||
|
||||
#define INCLUDE_SD 0
|
||||
#define INCLUDE_IDE 0 /* - Include the IDE driver */
|
||||
#define INCLUDE_PCMCIA 0 /* - Include the pcmcia driver */
|
||||
#define INCLUDE_PCMCIA_SRAM 0 /* - Include the pcmcia static ram card driver */
|
||||
#define INCLUDE_COMPACT_FLASH 0 /* - Support compact flash (requires IDE and PCMCIA) */
|
||||
#define INCLUDE_FLASH_FTL 0 /* - Include the linear flash driver */
|
||||
#define INCLUDE_ROMDISK 0 /* - Include the rom disk driver */
|
||||
#define INCLUDE_RAMDISK 0 /* - Include the rom disk driver */
|
||||
#define INCLUDE_MMCCARD 0 /* - Include the multi media flash card driver */
|
||||
#define INCLUDE_SMARTMEDIA 0 /* - Include the smart media flash card driver */
|
||||
#define INCLUDE_FLOPPY 0 /* - Include the floppy disk driver */
|
||||
#define INCLUDE_HOSTDISK 0 /* - Include the host disk disk simulator */
|
||||
#define INCLUDE_UDMA 0 /* - Include ultra dma support for the ide driver */
|
||||
#define INCLUDE_82365_PCMCTRL 0 /* - Include the 82365 pcmcia controller driver */
|
||||
|
||||
#define INCLUDE_IDE 0 /* - Include the IDE driver */
|
||||
#define INCLUDE_PCMCIA 0 /* - Include the pcmcia driver */
|
||||
#define INCLUDE_PCMCIA_SRAM 0 /* - Include the pcmcia static ram card driver */
|
||||
#define INCLUDE_COMPACT_FLASH 0 /* - Support compact flash (requires IDE and PCMCIA) */
|
||||
#define INCLUDE_CDROM 0 /* - Support ATAPI CD (requires IDE) */
|
||||
#define INCLUDE_FLASH_FTL 0 /* - Include the linear flash driver */
|
||||
#define INCLUDE_ROMDISK 0 /* - Include the rom disk driver */
|
||||
#define INCLUDE_RAMDISK 0 /* - Include the rom disk driver */
|
||||
#define INCLUDE_MMCCARD 0 /* - Include the multi media flash card driver */
|
||||
#define INCLUDE_SMARTMEDIA 0 /* - Include the smart media flash card driver */
|
||||
#define INCLUDE_FLOPPY 0 /* - Include the floppy disk driver */
|
||||
#define INCLUDE_HOSTDISK 0 /* - Include the host disk disk simulator */
|
||||
#define INCLUDE_WINDEV 0 /* - Include windows direct device access */
|
||||
#define INCLUDE_UDMA 0 /* - Include ultra dma support for the ide driver */
|
||||
#define INCLUDE_82365_PCMCTRL 0 /* - Include the 82365 pcmcia controller driver */
|
||||
|
||||
#endif /* __PORTCONF__ */
|
||||
|
@ -383,7 +383,6 @@ typedef struct ddrive {
|
||||
etc are valid */
|
||||
BOOLEAN mount_abort; /* True if error handler requests abort */
|
||||
int drive_opencounter; /* Value of global opencounter when we mounted */
|
||||
|
||||
dword volume_serialno; /* Volume serial number block 0 */
|
||||
byte volume_label[14]; /* Volume entry from block 0 */
|
||||
int bytespcluster; /* */
|
||||
@ -626,6 +625,7 @@ typedef struct blkbuffcntxt {
|
||||
struct blkbuff *pfree_blocks; /* uses pnext */
|
||||
int num_blocks;
|
||||
int num_free;
|
||||
int scratch_alloc_count;
|
||||
int low_water;
|
||||
int num_alloc_failures;
|
||||
int hash_size;
|
||||
@ -795,7 +795,6 @@ typedef struct fmtparms {
|
||||
#define VOID_CHECK_MEM() if (!prtfs_cfg) {return;}
|
||||
#define IS_AVOLORDIR(X) ((X->isroot) || (X->finode->fattribute & AVOLUME|ADIRENT))
|
||||
|
||||
|
||||
/* File RTFSINIT.C: */
|
||||
BOOLEAN pc_ertfs_init(void);
|
||||
|
||||
@ -1187,7 +1186,6 @@ typedef struct dev_geometry {
|
||||
#define DEVCTL_FLUSH 7
|
||||
/*----------------------------------*/
|
||||
|
||||
|
||||
typedef struct dev_geometry *PDEV_GEOMETRY;
|
||||
|
||||
|
||||
@ -1390,7 +1388,7 @@ extern RTFS_CFG *prtfs_cfg;
|
||||
#include "prfs.h"
|
||||
#endif /* INCLUDE_FAILSAFE_CODE */
|
||||
/* Include RTFS Pro features */
|
||||
#include "rtfspro.h" //twl modified
|
||||
#include <rtfspro.h>
|
||||
|
||||
|
||||
#include "attach.h" //ctr modified
|
||||
|
Loading…
Reference in New Issue
Block a user