2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
5 Desc: Change the mode of a filehandle or -lock.
8 #include <proto/exec.h>
9 #include <dos/dosextens.h>
10 #include <dos/filesystem.h>
11 #include "dos_intern.h"
13 /*****************************************************************************
16 #include <proto/dos.h>
18 AROS_LH3(BOOL
, ChangeMode
,
21 AROS_LHA(ULONG
, type
, D1
),
22 AROS_LHA(BPTR
, object
, D2
),
23 AROS_LHA(ULONG
, newmode
, D3
),
26 struct DosLibrary
*, DOSBase
, 75, Dos
)
29 Try to change the mode used by a lock or filehandle.
32 type - CHANGE_FH or CHANGE_LOCK.
33 object - Filehandle or lock.
34 newmode - New mode (see <dos/dos.h>).
37 != 0 if all went well, otherwise 0. IoErr() gives additional
38 information in the latter case.
41 Since filehandles and locks are identical under AROS the type
52 *****************************************************************************/
56 /* Get pointer to filehandle */
57 struct FileHandle
*fh
= (struct FileHandle
*)BADDR(object
);
59 /* Get pointer to I/O request. Use stackspace for now. */
60 struct IOFileSys iofs
;
62 /* Convert Open() and Lock() constants to filehandler flags. */
65 if(newmode
== MODE_OLDFILE
|| newmode
== MODE_READWRITE
||
66 newmode
== ACCESS_READ
)
71 else if(newmode
== MODE_NEWFILE
|| newmode
== ACCESS_WRITE
)
78 if (newmode
& FMF_APPEND
)
80 /* See if the handler supports FSA_SEEK */
81 if (!(fh
->fh_Flags
& FHF_APPEND
) && Seek(MKBADDR(fh
), 0, OFFSET_END
) != -1)
83 /* if so then set the proper flag in the FileHandle struct */
84 fh
->fh_Flags
|= FHF_APPEND
;
88 fh
->fh_Flags
&= ~FHF_APPEND
;
90 newmode
&= ~FMF_APPEND
;
96 /* Prepare I/O request. */
97 InitIOFS(&iofs
, FSA_FILE_MODE
, DOSBase
);
99 iofs
.IOFS
.io_Device
= fh
->fh_Device
;
100 iofs
.IOFS
.io_Unit
= fh
->fh_Unit
;
102 iofs
.io_Union
.io_FILE_MODE
.io_FileMode
= newflags
;
103 iofs
.io_Union
.io_FILE_MODE
.io_Mask
= mask
;
105 /* Send the request. */
108 /* Set error code and return */
109 if (iofs
.io_DosError
!= 0)
111 SetIoErr(iofs
.io_DosError
);