merge in some changes from UNSTABLE, batch files no change just line ending issue
git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1036 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
74b074660d
commit
99f863a28f
220
docs/config.txt
220
docs/config.txt
@ -1,51 +1,220 @@
|
|||||||
Advanced - FreeDOS specific - CONFIG.SYS processing
|
Configuring your DOS system for use:
|
||||||
|
------------------------------------
|
||||||
|
When booting DOS, you will find it only supports a subset of
|
||||||
|
the devices available on many computers. To support additional
|
||||||
|
devices and advanced features, device specific driver and
|
||||||
|
memory resident software most be loaded. This allows the
|
||||||
|
kernel to be easily extended to support hardware not presently
|
||||||
|
available and take better advantage of installed hardware
|
||||||
|
without wasting resources on computers lacking it. This
|
||||||
|
software is generally loaded during the kernel initialization
|
||||||
|
phase, with details describing what to load expressed in the
|
||||||
|
file CONFIG.SYS. The FreeDOS kernel will first look for a
|
||||||
|
file named FDCONFIG.SYS, should it exist, it will will be used
|
||||||
|
instead of CONFIG.SYS; this allows the FreeDOS kernel to coexist
|
||||||
|
and be configured differently than another DOS kernel. There
|
||||||
|
are additional options available to adjust other aspects of the
|
||||||
|
kernel's behaviour. Note: some options listed below are FreeDOS
|
||||||
|
specific and will not work when using other/older DOS kernels.
|
||||||
|
Below is list of all documented FreeDOS config.sys supported
|
||||||
|
options; additional undocumented options may exist but are not
|
||||||
|
meant for normal usage.
|
||||||
|
|
||||||
a new command DOSDATA=UMB
|
|
||||||
DOSDATA=UMB loads some FreeDOS specific stuff in Upper Memory Blocks,
|
|
||||||
like the RAM that FILESHIGH, LASTDRIVEHIGH, and STACKSHIGH occupy
|
|
||||||
|
|
||||||
a new command ECHO
|
BREAK
|
||||||
ECHO does ECHO its argument (surprised ?-) and is executed at
|
Usage: break=on|off
|
||||||
the time the DEVICE= lines are executed.
|
Set extended Control-C/Control-Break checking to on [default] or off.
|
||||||
use it similarly to
|
When set to on, the kernel will perform the check (and invoke current
|
||||||
|
handler if pressed) prior to most int 21h calls. When set to off,
|
||||||
|
the kernel only performs the check on I/O calls using standard streams.
|
||||||
|
e.g. break=off
|
||||||
|
|
||||||
|
BUFFERS
|
||||||
|
BUFFERSHIGH
|
||||||
|
Usage: buffers=nn[,n] where nn is in range 1-99 & n is in range 1-8
|
||||||
|
Memory buffers used by the kernel; primary[,secondary]
|
||||||
|
The secondary buffer option is available for compatibility with
|
||||||
|
other DOS kernels, but is ignored by the FreeDOS kernel.
|
||||||
|
e.g. buffers=20
|
||||||
|
|
||||||
|
COUNTRY
|
||||||
|
Usage: country=nnn[,[mmm][,[d:][path]file]]
|
||||||
|
Only limited country=nnn support is presently available.
|
||||||
|
Enables/sets international features of DOS
|
||||||
|
nnn is country code (001==US)
|
||||||
|
mmm is code page (437 is default, 850 is updated form, 1252 for Windows)
|
||||||
|
[drive][path]file specifies file with country specific data
|
||||||
|
e.g. country=001,850,C:\FDOS\BIN\COUNTRY.SYS
|
||||||
|
|
||||||
|
DEVICE
|
||||||
|
Usage: device=[d:][path]file [options]
|
||||||
|
Load the device driver specified by d:path\file (into conventional
|
||||||
|
[low 640KB] memory). The options are for the driver itself; refer
|
||||||
|
to documentation that came with your particular device for supported
|
||||||
|
options and their usage.
|
||||||
|
e.g. device=himem.sys
|
||||||
|
|
||||||
|
DEVICEHIGH
|
||||||
|
Usage: devicehigh=[d:][path]file [options]
|
||||||
|
This is just like device= statement, except it attempts to load
|
||||||
|
the device driver into high memory first (failing that it should
|
||||||
|
load it in conventional memory).
|
||||||
|
Note: The order you load devices may have a large impact on amount
|
||||||
|
of free memory available. In general try to load large (in memory
|
||||||
|
usage) programs into high memory first.
|
||||||
|
Important: You should have a high memory manager such as FDXMS or
|
||||||
|
Himem installed (prior device=FDXMS.SYS or device=HIMEM.SYS) before
|
||||||
|
using this option.
|
||||||
|
e.g. devicehigh=atapicdd.sys /D:FDCD0001
|
||||||
|
|
||||||
|
DOS
|
||||||
|
Usage: dos=high|low,umb|noumb
|
||||||
|
Indicates whether the kernel should try to load itself into
|
||||||
|
high memory or only conventional (low), and whether to link
|
||||||
|
upper memory blocks in with normal memory or not.
|
||||||
|
Note: only one set need be given, ie dos=high and dos=noumb are ok.
|
||||||
|
Important: if you specify dos=high[,umb|noumb] then you must also
|
||||||
|
load a high memory manager (first), ie FDXMS or HIMEM
|
||||||
|
e.g. dos=high,umb
|
||||||
|
or dos=low,noumb
|
||||||
|
|
||||||
|
DOSDATA
|
||||||
|
Usage: dosdata=umb
|
||||||
|
Try to load kernel data into Upper Memory Blocks; effectively
|
||||||
|
same as using the <name>HIGH variant of kernel parameters,
|
||||||
|
such as fileshigh, lastdrivehigh, and stackshigh (does not
|
||||||
|
effect drivers loaded using device= or install=).
|
||||||
|
e.g. dosdata=umb
|
||||||
|
|
||||||
|
ECHO
|
||||||
|
Usage: ECHO Message to be displayed to user.
|
||||||
|
ECHO displays (echos) its arguments to the console during
|
||||||
|
config.sys processing when device drivers are loaded (when
|
||||||
|
DEVICE= lines are executed).
|
||||||
|
e.g.
|
||||||
ECHO loading driver 1
|
ECHO loading driver 1
|
||||||
device=Driver1.sys
|
device=Driver1.sys
|
||||||
ECHO driver1 successfully loaded
|
ECHO driver1 successfully loaded
|
||||||
|
|
||||||
a new command called EECHO is also available, for echo-ing ANSI Escape Sequences
|
EECHO
|
||||||
(redefines keyboard input for example).
|
Usage: EECHO Message with ANSI Escape Sequence
|
||||||
|
EECHO allows for echo-ing ANSI Escape Sequences
|
||||||
|
(redefines keyboard input for example). Use a dollar sign ($)
|
||||||
|
to represent the ANSI Escape character. Note: requires an
|
||||||
|
ansi driver loaded prior to use.
|
||||||
|
|
||||||
|
FCBS
|
||||||
|
Usage: fcbs=nnn
|
||||||
|
where nnn is in range 1-255
|
||||||
|
Sets the number of File Control Blocks to reserve room for.
|
||||||
|
As file control blocks have been replaced by file handles
|
||||||
|
(see files) most applications will not need this value adjusted.
|
||||||
|
e.g. fcbs=4
|
||||||
|
|
||||||
an undocumented command SCREEN=xx
|
FILES
|
||||||
SCREEN= switches into videomode xxx (INT10/11xx/000)
|
FILESHIGH
|
||||||
useful
|
Usage: files=nnn
|
||||||
SCREEN=0x11 -- 28 lines
|
where nnn is in range 8-255 (default 8)
|
||||||
SCREEN=0x12 -- 43/50 lines (on EGA/VGA)
|
Specifies how many files allowed open at once (reserves
|
||||||
|
memory necessary to support opening this many files).
|
||||||
|
Note: there are other restrictions, so a given program
|
||||||
|
may not be able to actually open this many
|
||||||
|
A good number is 20, though some programs suggest/require
|
||||||
|
30, 40, or even 255
|
||||||
|
e.g. files=20
|
||||||
|
|
||||||
|
INSTALL
|
||||||
|
INSTALLHIGH
|
||||||
|
Usage: install=[d:][path]file [options]
|
||||||
|
Load the program specified by d:path\file. Generally used to
|
||||||
|
load TSR (terminate and stay resident) programs with a minimal
|
||||||
|
environment block. The options are for the program itself; refer
|
||||||
|
to documentation that came with your particular software for
|
||||||
|
supported options and usage.
|
||||||
|
e.g. install=nansi.com
|
||||||
|
|
||||||
|
LASTDRIVE
|
||||||
|
LASTDRIVEHIGH
|
||||||
|
Usage: lastdrive=x
|
||||||
|
where x is last drive letter available for use; A-Z
|
||||||
|
e.g. lastdrive=z
|
||||||
|
|
||||||
|
NUMLOCK
|
||||||
|
Usage: numlock=on|off
|
||||||
|
Set the keyboard number lock to on or off.
|
||||||
|
e.g. numlock=off
|
||||||
|
|
||||||
|
REM
|
||||||
|
Usage: rem Your remarks!
|
||||||
|
This provides the ability to place comments within the configuration
|
||||||
|
file. The text following the rem until the end of the line is
|
||||||
|
reached are ignored. This may also be used to temporarily disable
|
||||||
|
loading a particular device or other option.
|
||||||
|
|
||||||
|
SCREEN
|
||||||
|
Usage: screen=xx
|
||||||
|
Switches into videomode xxx (INT10/11xx/000)
|
||||||
|
where xx should be 0x11 for 28 lines or 0x12 for 43/50 (EGA/VGA) lines
|
||||||
|
|
||||||
|
SET
|
||||||
|
Usage: set ENVVAR=value
|
||||||
|
Sets the environment variable to provided value.
|
||||||
|
e.g. set HOME=C:\home\me
|
||||||
|
|
||||||
|
SHELL
|
||||||
|
SHELLHIGH
|
||||||
|
Usage: shell=[d:][path]file [options]
|
||||||
|
Indicates the shell to use; often used to alter COMMAND.COM's behavior.
|
||||||
|
Note: it is command.com that processes AUTOEXEC.BAT; by using the
|
||||||
|
shell option, you can get command.com to process a differently named
|
||||||
|
file (such as FDAUTO.BAT for coexisting with another DOS using different
|
||||||
|
configuration options) or run a completely different command interpreter
|
||||||
|
such as 4DOS or a (unix) sh variant.
|
||||||
|
e.g. shell=C:\COMMAND.COM /E:256 /P
|
||||||
|
|
||||||
|
STACKS
|
||||||
|
STACKSHIGH
|
||||||
|
Usage: stacks=nn,nnn
|
||||||
|
where nn is in range 0,8-64 and nnn is in range 32-512
|
||||||
|
Changes number of stacks available
|
||||||
|
nn is number of different stacks and nnn is size in bytes of each one
|
||||||
|
e.g. stacks=16,256
|
||||||
|
|
||||||
|
SWITCHAR
|
||||||
|
Usage: switchar=c
|
||||||
|
Sets the default switchar to character c. Where c is a single character
|
||||||
|
that is used to indicate a command line parameter is an option switch.
|
||||||
|
The default is a forward slash (/). Note: This simply sets the value
|
||||||
|
returned by a get switchar query, it will not effect programs that use
|
||||||
|
hardcoded switch characters.
|
||||||
|
e.g. switchar=-
|
||||||
|
|
||||||
|
VERSION
|
||||||
|
Usage: version=x.y
|
||||||
|
FreeDOS specific command to specify what DOS version to report.
|
||||||
|
e.g. version=6.2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
the following advanced config.sys processing options are available:
|
Advanced - FreeDOS specific CONFIG.SYS menu processing:
|
||||||
|
-------------------------------------------------------
|
||||||
|
|
||||||
normal
|
normal
|
||||||
FILES=20
|
FILES=20
|
||||||
DEVICE=MyNetWorkDriver.sys
|
DEVICE=MyNetWorkDriver.sys
|
||||||
|
|
||||||
'?' - ALWAYS ask if a single line shall be executed
|
'?' - ALWAYS ask if a single line shall be executed
|
||||||
|
|
||||||
FILES=20
|
FILES=20
|
||||||
?DEVICE=MyNetWorkDriver.sys
|
?DEVICE=MyNetWorkDriver.sys
|
||||||
|
|
||||||
|
|
||||||
'!' - NEVER ask if a single line shall be executed, even if single stepping
|
'!' - NEVER ask if a single line shall be executed, even if single stepping
|
||||||
|
|
||||||
!FILES=20
|
!FILES=20
|
||||||
!DOS=HIGH,UMB
|
!DOS=HIGH,UMB
|
||||||
!BUFFERS=30
|
!BUFFERS=30
|
||||||
DEVICE=MyNetWorkDriver.sys
|
DEVICE=MyNetWorkDriver.sys
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
configuration management - you may compose several configurations,
|
configuration management - you may compose several configurations,
|
||||||
using following special commands:
|
using following special commands:
|
||||||
|
|
||||||
@ -66,8 +235,11 @@ MENUDEFAULT=0,1 ( configuration 0, wait 1 second)
|
|||||||
2? device=MyNetworkDriver.SYS
|
2? device=MyNetworkDriver.SYS
|
||||||
|
|
||||||
|
|
||||||
Although this is definitively worse then MSDOS menuing possibilities,
|
Although this is different than MSDOS menuing possibilities, it
|
||||||
IMHO it's better then nothing.
|
allows for selecting from multiple options during bootup while
|
||||||
|
remaining simple. It, however, does not allow for multi-level
|
||||||
|
menuing based configuration schemes.
|
||||||
|
|
||||||
|
|
||||||
It's also possible to combine menu options, to avoid writing thing every
|
It's also possible to combine menu options, to avoid writing thing every
|
||||||
time again.
|
time again.
|
||||||
@ -165,11 +337,7 @@ MENUDEFAULT=1,10 ( configuration 1, wait 10 seconds)
|
|||||||
4? ECHO You selected menu #4
|
4? ECHO You selected menu #4
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2002-11-28 - Tom Ehlert
|
2002-11-28 - Tom Ehlert
|
||||||
2003-07-15 - Bernd Blaauw
|
2003-07-15 - Bernd Blaauw
|
||||||
2003-09-18 - Bart Oldeman
|
2003-09-18 - Bart Oldeman
|
||||||
|
2004-07-24 - Jeremy Davis
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
These are the known contributors of the FreeDOS kernel. If you have
|
These are the known contributors of the FreeDOS kernel. If you have
|
||||||
contributed in any way to the kernel, but are not on this list,
|
contributed in any way to the kernel, but are not on this list,
|
||||||
please email me at bart@dosemu.org so I can add you to the list!
|
please email the current kernel maintainer so we can add you to the list!
|
||||||
|
|
||||||
Thanks to all the following for contributing to the FreeDOS kernel:
|
Thanks to all the following for contributing to the FreeDOS kernel:
|
||||||
|
|
||||||
|
Aitor Santamaria (aitor.sm@wanadoo.es)
|
||||||
Arkady Belousov (ark@mos.ru)
|
Arkady Belousov (ark@mos.ru)
|
||||||
Bart Oldeman (bart@dosemu.org)
|
Bart Oldeman (bart@dosemu.org)
|
||||||
|
Bernd Blaauw (bblaauw@home.nl)
|
||||||
Brian Reifsnyder (reifsnyderb@mindspring.com)
|
Brian Reifsnyder (reifsnyderb@mindspring.com)
|
||||||
Charles Dye (raster@highfiber.com)
|
Charles Dye (raster@highfiber.com)
|
||||||
|
Eduardo Casino (eduardo@terra.es)
|
||||||
Eric Auer (eric@coli.uni-sb.de)
|
Eric Auer (eric@coli.uni-sb.de)
|
||||||
Eric Biederman (ebiederm+eric@ccr.net)
|
Eric Biederman (ebiederm+eric@ccr.net)
|
||||||
Eric Luttmann (ecl@users.sourceforge.net)
|
Eric Luttmann (ecl@users.sourceforge.net)
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
Begin3
|
Begin3
|
||||||
Title: The FreeDOS Kernel
|
Title: The FreeDOS Kernel
|
||||||
Version: 2.0.35
|
Version: 2.0.35a
|
||||||
Entered-date: 30 May 2004
|
Entered-date: 12 Sept 2004
|
||||||
Description: The FreeDOS Kernel.
|
Description: The FreeDOS Kernel.
|
||||||
Keywords: kernel freedos dos msdos
|
Keywords: kernel freedos dos msdos
|
||||||
Author: (developers)
|
Author: (developers)
|
||||||
Maintained-by: bartoldeman@users.sourceforge.net
|
Maintained-by: jeremyd@computer.org
|
||||||
Primary-site: http://freedos.sourceforge.net
|
Primary-site: http://freedos.sourceforge.net
|
||||||
Original-site: http://www.gcfl.net/pub/FreeDOS/kernel
|
Original-site: http://www.gcfl.net/pub/FreeDOS/kernel
|
||||||
Platforms: dos dosemu
|
Platforms: dos dosemu
|
||||||
|
@ -1,3 +1,16 @@
|
|||||||
|
2004 Sept ?? - Build 2035a
|
||||||
|
-------- Jeremy Davis (jeremyd@computer.org)
|
||||||
|
+ Changes Bart
|
||||||
|
* int2f.asm: call_nls: DI register was not preserved (bug 1812)
|
||||||
|
+ Changes Arkady
|
||||||
|
* floppy.asm: fix epilog for FL_SETMEDIATYPE & FL_SETDISKTYPE
|
||||||
|
to use 'ret' instead of 'ret 8'; improve comments
|
||||||
|
* entry.asm: use unsigned comparision instead of signed
|
||||||
|
+ Changes Lucho
|
||||||
|
* dsk.c: text in play_dj
|
||||||
|
* fatfs.c:
|
||||||
|
- zero creation/access stamp on directory entry write as MS-DOS 7.10
|
||||||
|
- prevent removal or renaming of the current directory of that drive
|
||||||
2004 May 30 - Build 2035
|
2004 May 30 - Build 2035
|
||||||
-------- Bart Oldeman (bart@dosemu.org)
|
-------- Bart Oldeman (bart@dosemu.org)
|
||||||
+ Changes Lucho + Tom
|
+ Changes Lucho + Tom
|
||||||
|
@ -374,7 +374,8 @@ typedef struct {
|
|||||||
struct {
|
struct {
|
||||||
UBYTE _r_cat; /* Category code */
|
UBYTE _r_cat; /* Category code */
|
||||||
UBYTE _r_fun; /* Function code */
|
UBYTE _r_fun; /* Function code */
|
||||||
UBYTE unused[4]; /* SI or DI contents or DS:reqhdr */
|
UWORD _r_si; /* Contents of SI and DI */
|
||||||
|
UWORD _r_di; /* (PC DOS 7 Technical Update, pp 104,105) */
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
struct gblkio FAR *_r_io;
|
struct gblkio FAR *_r_io;
|
||||||
@ -424,6 +425,8 @@ typedef struct {
|
|||||||
/* generic IOCTL and IOCTL query macros */
|
/* generic IOCTL and IOCTL query macros */
|
||||||
#define r_cat _r_x._r_gen._r_cat
|
#define r_cat _r_x._r_gen._r_cat
|
||||||
#define r_fun _r_x._r_gen._r_fun
|
#define r_fun _r_x._r_gen._r_fun
|
||||||
|
#define r_si _r_x._r_gen._r_si
|
||||||
|
#define r_di _r_x._r_gen._r_di
|
||||||
#define r_rw _r_x._r_gen._r_par._r_rw
|
#define r_rw _r_x._r_gen._r_par._r_rw
|
||||||
#define r_io _r_x._r_gen._r_par._r_io
|
#define r_io _r_x._r_gen._r_par._r_io
|
||||||
#define r_fv _r_x._r_gen._r_par._r_fv
|
#define r_fv _r_x._r_gen._r_par._r_fv
|
||||||
|
@ -119,6 +119,10 @@ unsigned short getCS(void);
|
|||||||
#define _SS getSS()
|
#define _SS getSS()
|
||||||
unsigned short getSS(void);
|
unsigned short getSS(void);
|
||||||
#pragma aux getSS = "mov dx,ss" value [dx] modify exact[dx];
|
#pragma aux getSS = "mov dx,ss" value [dx] modify exact[dx];
|
||||||
|
#if !defined(FORSYS) && !defined(EXEFLAT) && _M_IX86 >= 300
|
||||||
|
#pragma aux default parm [ax dx cx] modify [ax dx es fs] /* min.unpacked size */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* enable Possible loss of precision warning for compatibility with Borland */
|
/* enable Possible loss of precision warning for compatibility with Borland */
|
||||||
#pragma enable_message(130)
|
#pragma enable_message(130)
|
||||||
|
|
||||||
|
@ -416,13 +416,9 @@ FMEMCHR:
|
|||||||
mov ax, di
|
mov ax, di
|
||||||
jmp short strchr_found1
|
jmp short strchr_found1
|
||||||
|
|
||||||
%endif
|
|
||||||
|
|
||||||
;**********************************************************************
|
;**********************************************************************
|
||||||
%if 0
|
global FSTRCMP
|
||||||
nix pascal - still untested
|
FSTRCMP:
|
||||||
global _fstrcmp
|
|
||||||
_fstrcmp:
|
|
||||||
call pascal_setup
|
call pascal_setup
|
||||||
|
|
||||||
; Get the source pointer, ss
|
; Get the source pointer, ss
|
||||||
|
@ -314,7 +314,7 @@ int21_2: inc byte [_InDOS]
|
|||||||
or ah,ah
|
or ah,ah
|
||||||
jz int21_3
|
jz int21_3
|
||||||
cmp ah,0ch
|
cmp ah,0ch
|
||||||
jle int21_normalentry
|
jbe int21_normalentry
|
||||||
|
|
||||||
int21_3:
|
int21_3:
|
||||||
call dos_crit_sect
|
call dos_crit_sect
|
||||||
|
@ -107,27 +107,20 @@ struct dpb FAR *get_dpb(COUNT dsk)
|
|||||||
return cdsp->cdsDpb;
|
return cdsp->cdsDpb;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialize all direntry fields except for the name */
|
/* initialize directory entry (creation/access stamps 0 as per MS-DOS 7.10) */
|
||||||
STATIC void init_direntry(struct dirent *dentry, unsigned attrib,
|
STATIC void init_direntry(struct dirent *dentry, unsigned attrib,
|
||||||
CLUSTER cluster)
|
CLUSTER cluster, char *name)
|
||||||
{
|
{
|
||||||
struct dostime dt;
|
|
||||||
|
|
||||||
dentry->dir_size = 0l;
|
dentry->dir_size = 0l;
|
||||||
|
memset(dentry, 0, sizeof(struct dirent));
|
||||||
|
memcpy(dentry->dir_name, name, FNAME_SIZE + FEXT_SIZE);
|
||||||
#ifdef WITHFAT32
|
#ifdef WITHFAT32
|
||||||
dentry->dir_start_high = (UWORD)(cluster >> 16);
|
dentry->dir_start_high = (UWORD)(cluster >> 16);
|
||||||
#else
|
|
||||||
dentry->dir_start_high = 0;
|
|
||||||
#endif
|
#endif
|
||||||
dentry->dir_start = (UWORD)cluster;
|
dentry->dir_start = (UWORD)cluster;
|
||||||
dentry->dir_attrib = attrib;
|
dentry->dir_attrib = (UBYTE)attrib;
|
||||||
dentry->dir_case = 0;
|
dentry->dir_time = dos_gettime();
|
||||||
DosGetTime(&dt);
|
dentry->dir_date = dos_getdate();
|
||||||
dentry->dir_crtimems = dt.hundredth;
|
|
||||||
if (dt.second & 1)
|
|
||||||
dentry->dir_crtimems += 100;
|
|
||||||
dentry->dir_time = dentry->dir_crtime = time_encode(&dt);
|
|
||||||
dentry->dir_date = dentry->dir_crdate = dentry->dir_accdate = dos_getdate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
@ -154,7 +147,7 @@ long dos_open(char *path, unsigned flags, unsigned attrib)
|
|||||||
if ((flags & O_ACCMODE) > 2)
|
if ((flags & O_ACCMODE) > 2)
|
||||||
return DE_INVLDACC;
|
return DE_INVLDACC;
|
||||||
|
|
||||||
/* first split the passed dir into comopnents (i.e. - path to */
|
/* next split the passed dir into comopnents (i.e. - path to */
|
||||||
/* new directory and name of new directory. */
|
/* new directory and name of new directory. */
|
||||||
if ((fnp = split_path(path, fcbname)) == NULL)
|
if ((fnp = split_path(path, fcbname)) == NULL)
|
||||||
return DE_PATHNOTFND;
|
return DE_PATHNOTFND;
|
||||||
@ -206,9 +199,6 @@ long dos_open(char *path, unsigned flags, unsigned attrib)
|
|||||||
int ret = alloc_find_free(fnp, path, fcbname);
|
int ret = alloc_find_free(fnp, path, fcbname);
|
||||||
if (ret != SUCCESS)
|
if (ret != SUCCESS)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* put the fnode's name into the directory. */
|
|
||||||
memcpy(fnp->f_dir.dir_name, fcbname, FNAME_SIZE + FEXT_SIZE);
|
|
||||||
status = S_CREATED;
|
status = S_CREATED;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -225,7 +215,7 @@ long dos_open(char *path, unsigned flags, unsigned attrib)
|
|||||||
|
|
||||||
if (status != S_OPENED)
|
if (status != S_OPENED)
|
||||||
{
|
{
|
||||||
init_direntry(&fnp->f_dir, attrib, FREE);
|
init_direntry(&fnp->f_dir, attrib, FREE, fcbname);
|
||||||
fnp->f_flags = F_DMOD | F_DDIR;
|
fnp->f_flags = F_DMOD | F_DDIR;
|
||||||
if (!dir_write(fnp))
|
if (!dir_write(fnp))
|
||||||
{
|
{
|
||||||
@ -584,7 +574,12 @@ COUNT dos_rmdir(BYTE * path)
|
|||||||
BOOL found;
|
BOOL found;
|
||||||
char fcbname[FNAME_SIZE + FEXT_SIZE];
|
char fcbname[FNAME_SIZE + FEXT_SIZE];
|
||||||
|
|
||||||
/* first split the passed dir into comopnents (i.e. - */
|
/* prevent removal of the current directory of that drive */
|
||||||
|
register struct cds FAR *cdsp = get_cds(path[0] - 'A');
|
||||||
|
if (!fstrcmp(path, cdsp->cdsCurrentPath))
|
||||||
|
return DE_RMVCUDIR;
|
||||||
|
|
||||||
|
/* next, split the passed dir into components (i.e. - */
|
||||||
/* path to new directory and name of new directory */
|
/* path to new directory and name of new directory */
|
||||||
if ((fnp = split_path(path, fcbname)) == NULL)
|
if ((fnp = split_path(path, fcbname)) == NULL)
|
||||||
{
|
{
|
||||||
@ -598,24 +593,20 @@ COUNT dos_rmdir(BYTE * path)
|
|||||||
return DE_ACCESS;
|
return DE_ACCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check that we don't have a duplicate name, so if we */
|
/* Verify name exists, and if so then ensure it refers */
|
||||||
/* find one, it's an error. */
|
/* to a directory and directory is empty. */
|
||||||
if (find_fname(fnp, fcbname, D_ALL))
|
if (find_fname(fnp, fcbname, D_ALL))
|
||||||
{
|
{
|
||||||
/* The only permissable attribute is directory, */
|
/* Check if it's really a directory, directories may
|
||||||
/* check for any other bit set. If it is, give */
|
have attributes, but if other than 'archive' then do not
|
||||||
/* an access error. */
|
allow (RDONLY|SYSTEM|HIDDEN) directory to be deleted.
|
||||||
/* if (fnp->f_dir.dir_attrib & ~D_DIR) */
|
*/
|
||||||
|
if ( !(fnp->f_dir.dir_attrib & D_DIR) ||
|
||||||
/* directories may have attributes, too. at least my WinNT disk
|
(fnp->f_dir.dir_attrib & ~(D_DIR |D_ARCHIVE)) )
|
||||||
has many 'archive' directories
|
|
||||||
we still don't allow RDONLY directories to be deleted TE */
|
|
||||||
|
|
||||||
/* if (fnp->f_dir.dir_attrib & ~(D_DIR |D_HIDDEN|D_ARCHIVE|D_SYSTEM))
|
|
||||||
{
|
{
|
||||||
dir_close(fnp);
|
dir_close(fnp);
|
||||||
return DE_ACCESS;
|
return DE_ACCESS;
|
||||||
} */
|
}
|
||||||
|
|
||||||
/* Check that the directory is empty. Only the */
|
/* Check that the directory is empty. Only the */
|
||||||
/* "." and ".." are permissable. */
|
/* "." and ".." are permissable. */
|
||||||
@ -628,7 +619,8 @@ COUNT dos_rmdir(BYTE * path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dir_read(fnp1);
|
dir_read(fnp1);
|
||||||
if (fnp1->f_dir.dir_name[0] != '.')
|
/* 1st entry should be ".", else directory corrupt or not empty */
|
||||||
|
if (fnp1->f_dir.dir_name[0] != '.' || fnp1->f_dir.dir_name[1] != ' ')
|
||||||
{
|
{
|
||||||
dir_close(fnp);
|
dir_close(fnp);
|
||||||
return DE_ACCESS;
|
return DE_ACCESS;
|
||||||
@ -636,7 +628,8 @@ COUNT dos_rmdir(BYTE * path)
|
|||||||
|
|
||||||
fnp1->f_diroff++;
|
fnp1->f_diroff++;
|
||||||
dir_read(fnp1);
|
dir_read(fnp1);
|
||||||
if (fnp1->f_dir.dir_name[0] != '.')
|
/* secondard entry should be ".." */
|
||||||
|
if (fnp1->f_dir.dir_name[0] != '.' || fnp1->f_dir.dir_name[1] != '.')
|
||||||
{
|
{
|
||||||
dir_close(fnp);
|
dir_close(fnp);
|
||||||
return DE_ACCESS;
|
return DE_ACCESS;
|
||||||
@ -683,6 +676,11 @@ COUNT dos_rename(BYTE * path1, BYTE * path2, int attrib)
|
|||||||
COUNT ret;
|
COUNT ret;
|
||||||
char fcbname[FNAME_SIZE + FEXT_SIZE];
|
char fcbname[FNAME_SIZE + FEXT_SIZE];
|
||||||
|
|
||||||
|
/* prevent renaming of the current directory of that drive */
|
||||||
|
register struct cds FAR *cdsp = get_cds(path1[0] - 'A');
|
||||||
|
if (!fstrcmp(path1, cdsp->cdsCurrentPath))
|
||||||
|
return DE_RMVCUDIR;
|
||||||
|
|
||||||
/* first split the passed target into compnents (i.e. - path to */
|
/* first split the passed target into compnents (i.e. - path to */
|
||||||
/* new file name and name of new file name */
|
/* new file name and name of new file name */
|
||||||
if ((fnp2 = split_path(path2, fcbname)) == NULL)
|
if ((fnp2 = split_path(path2, fcbname)) == NULL)
|
||||||
@ -723,19 +721,12 @@ COUNT dos_rename(BYTE * path1, BYTE * path2, int attrib)
|
|||||||
if ((ret = remove_lfn_entries(fnp1)) < 0)
|
if ((ret = remove_lfn_entries(fnp1)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
/* init fnode for new file name to match old file name */
|
||||||
|
memcpy(&fnp2->f_dir, &fnp1->f_dir, sizeof(struct dirent));
|
||||||
|
|
||||||
/* put the fnode's name into the directory. */
|
/* put the fnode's name into the directory. */
|
||||||
memcpy(fnp2->f_dir.dir_name, fcbname, FNAME_SIZE + FEXT_SIZE);
|
memcpy(fnp2->f_dir.dir_name, fcbname, FNAME_SIZE + FEXT_SIZE);
|
||||||
|
|
||||||
/* Set the fnode to the desired mode */
|
|
||||||
fnp2->f_dir.dir_size = fnp1->f_dir.dir_size;
|
|
||||||
fnp2->f_dir.dir_start = fnp1->f_dir.dir_start;
|
|
||||||
#ifdef WITHFAT32
|
|
||||||
fnp2->f_dir.dir_start_high = fnp1->f_dir.dir_start_high;
|
|
||||||
#endif
|
|
||||||
fnp2->f_dir.dir_attrib = fnp1->f_dir.dir_attrib;
|
|
||||||
fnp2->f_dir.dir_time = fnp1->f_dir.dir_time;
|
|
||||||
fnp2->f_dir.dir_date = fnp1->f_dir.dir_date;
|
|
||||||
|
|
||||||
/* The directory has been modified, so set the bit before */
|
/* The directory has been modified, so set the bit before */
|
||||||
/* closing it, allowing it to be updated. */
|
/* closing it, allowing it to be updated. */
|
||||||
fnp1->f_flags = fnp2->f_flags = F_DMOD | F_DDIR;
|
fnp1->f_flags = fnp2->f_flags = F_DMOD | F_DDIR;
|
||||||
@ -798,10 +789,8 @@ STATIC VOID wipe_out_clusters(struct dpb FAR * dpbp, CLUSTER st)
|
|||||||
/* */
|
/* */
|
||||||
STATIC VOID wipe_out(f_node_ptr fnp)
|
STATIC VOID wipe_out(f_node_ptr fnp)
|
||||||
{
|
{
|
||||||
/* if already free or not valid file, just exit */
|
/* if not already free and valid file, do it */
|
||||||
if ((fnp == NULL) || checkdstart(fnp->f_dpb, &fnp->f_dir, FREE))
|
if (fnp && !checkdstart(fnp->f_dpb, &fnp->f_dir, FREE))
|
||||||
return;
|
|
||||||
|
|
||||||
wipe_out_clusters(fnp->f_dpb, getdstart(fnp->f_dpb, &fnp->f_dir));
|
wipe_out_clusters(fnp->f_dpb, getdstart(fnp->f_dpb, &fnp->f_dir));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1105,13 +1094,10 @@ COUNT dos_mkdir(BYTE * dir)
|
|||||||
return DE_HNDLDSKFULL;
|
return DE_HNDLDSKFULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* put the fnode's name into the directory. */
|
|
||||||
memcpy(fnp->f_dir.dir_name, fcbname, FNAME_SIZE + FEXT_SIZE);
|
|
||||||
|
|
||||||
/* Set the fnode to the desired mode */
|
/* Set the fnode to the desired mode */
|
||||||
fnp->f_mode = WRONLY;
|
fnp->f_mode = WRONLY;
|
||||||
|
|
||||||
init_direntry(&fnp->f_dir, D_DIR, free_fat);
|
init_direntry(&fnp->f_dir, D_DIR, free_fat, fcbname);
|
||||||
|
|
||||||
fnp->f_flags = F_DMOD | F_DDIR;
|
fnp->f_flags = F_DMOD | F_DDIR;
|
||||||
|
|
||||||
@ -1135,9 +1121,7 @@ COUNT dos_mkdir(BYTE * dir)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Create the "." entry */
|
/* Create the "." entry */
|
||||||
DirEntBuffer.dir_name[0] = '.';
|
init_direntry(&DirEntBuffer, D_DIR, free_fat, ". ");
|
||||||
memset(DirEntBuffer.dir_name + 1, ' ', FNAME_SIZE + FEXT_SIZE - 1);
|
|
||||||
init_direntry(&DirEntBuffer, D_DIR, free_fat);
|
|
||||||
|
|
||||||
/* And put it out */
|
/* And put it out */
|
||||||
putdirent(&DirEntBuffer, bp->b_buffer);
|
putdirent(&DirEntBuffer, bp->b_buffer);
|
||||||
@ -1986,6 +1970,7 @@ COUNT dos_setfattr(BYTE * name, UWORD attrp)
|
|||||||
/* set attributes that user requested */
|
/* set attributes that user requested */
|
||||||
fnp->f_dir.dir_attrib |= attrp; /* JPP */
|
fnp->f_dir.dir_attrib |= attrp; /* JPP */
|
||||||
fnp->f_flags |= F_DMOD | F_DDATE;
|
fnp->f_flags |= F_DMOD | F_DDATE;
|
||||||
|
merge_file_changes(fnp, FALSE);
|
||||||
save_far_f_node(fnp);
|
save_far_f_node(fnp);
|
||||||
dos_close(fd);
|
dos_close(fd);
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
@ -2135,7 +2120,7 @@ COUNT media_check(REG struct dpb FAR * dpbp)
|
|||||||
|
|
||||||
/* If it definitely changed, don't know (falls through) */
|
/* If it definitely changed, don't know (falls through) */
|
||||||
/* or has been changed, rebuild the bpb. */
|
/* or has been changed, rebuild the bpb. */
|
||||||
case M_CHANGED:
|
/* case M_CHANGED: */
|
||||||
default:
|
default:
|
||||||
setinvld(dpbp->dpb_unit);
|
setinvld(dpbp->dpb_unit);
|
||||||
ret = rqblockio(C_BLDBPB, dpbp);
|
ret = rqblockio(C_BLDBPB, dpbp);
|
||||||
|
Loading…
Reference in New Issue
Block a user