added concrete implementations of putc(), getc(), getchar() and gets()
[tangerine.git] / rom / dos / changemode.c
blobf360e569e6c66e2e6788255abd7feb95da469f09
1 /*
2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Change the mode of a filehandle or -lock.
6 Lang: English
7 */
8 #include <proto/exec.h>
9 #include <dos/dosextens.h>
10 #include <dos/filesystem.h>
11 #include "dos_intern.h"
13 /*****************************************************************************
15 NAME */
16 #include <proto/dos.h>
18 AROS_LH3(BOOL, ChangeMode,
20 /* SYNOPSIS */
21 AROS_LHA(ULONG, type, D1),
22 AROS_LHA(BPTR, object, D2),
23 AROS_LHA(ULONG, newmode, D3),
25 /* LOCATION */
26 struct DosLibrary *, DOSBase, 75, Dos)
28 /* FUNCTION
29 Try to change the mode used by a lock or filehandle.
31 INPUTS
32 type - CHANGE_FH or CHANGE_LOCK.
33 object - Filehandle or lock.
34 newmode - New mode (see <dos/dos.h>).
36 RESULT
37 != 0 if all went well, otherwise 0. IoErr() gives additional
38 information in the latter case.
40 NOTES
41 Since filehandles and locks are identical under AROS the type
42 argument is ignored.
44 EXAMPLE
46 BUGS
48 SEE ALSO
50 INTERNALS
52 *****************************************************************************/
54 AROS_LIBFUNC_INIT
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. */
63 ULONG newflags, mask;
65 if(newmode == MODE_OLDFILE || newmode == MODE_READWRITE ||
66 newmode == ACCESS_READ)
68 newflags = 0;
69 mask = FMF_LOCK;
71 else if(newmode == MODE_NEWFILE || newmode == ACCESS_WRITE)
73 newflags = FMF_LOCK;
74 mask = FMF_LOCK;
76 else
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;
87 else
88 fh->fh_Flags &= ~FHF_APPEND;
90 newmode &= ~FMF_APPEND;
92 newflags = newmode;
93 mask = 0xFFFFFFFF;
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. */
106 DosDoIO(&iofs.IOFS);
108 /* Set error code and return */
109 if (iofs.io_DosError != 0)
111 SetIoErr(iofs.io_DosError);
112 return DOSFALSE;
115 return DOSTRUE;
117 AROS_LIBFUNC_EXIT
118 } /* ChangeMode */