2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
5 Desc: Internal types and stuff for dos
11 #include <aros/system.h>
14 #include <dos/exall.h>
15 #include <dos/dosextens.h>
16 #include <dos/dosasl.h>
17 #include <dos/filehandler.h>
18 #include <utility/tagitem.h>
19 #include <proto/exec.h>
20 #include <proto/utility.h>
22 #include "fs_driver.h"
25 * These bases are historically placed in public portion of DOSBase.
26 * We won't change this.
29 #define TimerBase (DOSBase->dl_TimeReq->tr_node.io_Device)
31 #define UtilityBase (DOSBase->dl_UtilityBase)
33 /* Needed for close() */
35 AROS_LC0(BPTR, expunge, struct DosLibrary *, DOSBase, 3, Dos)
37 #define RDAF_ALLOCATED_BY_READARGS (1L << 31)
39 /* BCPL compatibility: At least LONG alignment required */
43 struct DosLibrary pub
;
44 struct Library
*debugBase
;
45 struct RootNode rootNode
__attribute__((aligned(4)));
46 struct ErrorString errors
__attribute__((aligned(4)));
48 ULONG arm_Arch
; /* ARM-specific info for ELF loader */
54 #define IDosBase(base) ((struct IntDosBase *)base)
55 #define DebugBase IDosBase(DOSBase)->debugBase
69 #define IOBUFSIZE 4096
76 struct DosLibrary
*DOSBase
;
79 /* fh_Flags. The flags are AROS specific and therefore PRIVATE.. */
80 #define FHF_WRITE 0x80000000
81 #define FHF_BUF 0x00000001
82 #define FHF_APPEND 0x00000002
83 #define FHF_LINEBUF 0x00000004
84 #define FHF_NOBUF 0x00000008
85 #define FHF_OWNBUF 0x00000010
86 #define FHF_FLUSHING 0x00000020
89 (((struct FileHandle *)BADDR(f))->fh_Flags&FHF_WRITE&& \
90 ((struct FileHandle *)BADDR(f))->fh_Pos<((struct FileHandle *)BADDR(f))->fh_End? \
91 *((struct FileHandle *)BADDR(f))->fh_Pos++=c,0:FPutC(f,c))
93 #define DOS_FH_MAGIC AROS_MAKE_ID('F','h','n','d')
94 #define ISFILEHANDLE(f) \
95 ((((struct FileHandle *)BADDR(f))->fh_Func2) == DOS_FH_MAGIC)
97 /* Softlink handling */
98 STRPTR
ResolveSoftlink(BPTR cur
, struct DevProc
*dvp
, CONST_STRPTR name
, struct DosLibrary
*DOSBase
);
99 LONG
RootDir(struct DevProc
*dvp
, struct DosLibrary
*DOSBase
);
102 struct DosPacket
*allocdospacket(void);
103 void freedospacket(struct DosPacket
*dp
);
104 SIPTR
dopacket(SIPTR
*res2
, struct MsgPort
*port
, LONG action
, SIPTR arg1
, SIPTR arg2
, SIPTR arg3
, SIPTR arg4
, SIPTR arg5
, SIPTR arg6
, SIPTR arg7
);
105 void internal_SendPkt(struct DosPacket
*dp
, struct MsgPort
*port
, struct MsgPort
*replyport
);
106 struct DosPacket
*internal_WaitPkt(struct MsgPort
*msgPort
);
107 void internal_ReplyPkt(struct DosPacket
*dp
, struct MsgPort
*replyPort
, SIPTR res1
, LONG res2
);
109 #define dopacket5(base, res2, port, action, arg1, arg2, arg3, arg4, arg5) dopacket(res2, port, action, (SIPTR)(arg1), (SIPTR)(arg2), (SIPTR)(arg3), (SIPTR)(arg4), (SIPTR)(arg5), 0, 0)
110 #define dopacket4(base, res2, port, action, arg1, arg2, arg3, arg4) dopacket(res2, port, action, (SIPTR)(arg1), (SIPTR)(arg2), (SIPTR)(arg3), (SIPTR)(arg4), 0, 0, 0)
111 #define dopacket3(base, res2, port, action, arg1, arg2, arg3) dopacket(res2, port, action, (SIPTR)(arg1), (SIPTR)(arg2), (SIPTR)(arg3), 0, 0, 0, 0)
112 #define dopacket2(base, res2, port, action, arg1, arg2) dopacket(res2, port, action, (SIPTR)(arg1), (SIPTR)(arg2), 0, 0, 0, 0, 0)
113 #define dopacket1(base, res2, port, action, arg1) dopacket(res2, port, action, (SIPTR)(arg1), 0, 0, 0, 0, 0, 0)
114 #define dopacket0(base, res2, port, action) dopacket(res2, port, action, 0, 0, 0, 0, 0, 0, 0)
117 extern void BCPL_Fixup(struct Process
*me
);
119 #define BCPL_Fixup(p) do { } while (0)
122 ULONG
CallEntry(STRPTR argptr
, ULONG argsize
, LONG_FUNC entry
, struct Process
*me
);
124 struct MsgPort
*RunHandler(struct DeviceNode
*deviceNode
, const char *path
, struct DosLibrary
*DOSBase
);
125 BOOL
namefrom_internal(struct DosLibrary
*DOSBase
, BPTR lock
, STRPTR buffer
, LONG length
);
127 /* Platform-overridable boot sequence */
128 void __dos_Boot(struct DosLibrary
*DOSBase
, ULONG BootFlags
, UBYTE Flags
);
129 BOOL
__dos_IsBootable(struct DosLibrary
*DOSBase
, BPTR Lock
);
131 /* Cli dependent SetProgramName() for use in CreateNewProc() */
132 BOOL
internal_SetProgramName(struct CommandLineInterface
*cli
,
133 CONST_STRPTR name
, struct DosLibrary
*DOSBase
);
134 /* Duplicate a cli_CommandDir BPTR list */
135 BPTR
internal_CopyPath(BPTR boldpath
, struct DosLibrary
* DOSBase
);
138 /* Pattern matching function used by MatchPattern() and MatchPatternNoCase() */
139 BOOL
patternMatch(CONST_STRPTR pat
, CONST_STRPTR str
, BOOL useCase
,
140 struct DosLibrary
*DOSBase
);
142 /* Pattern parsing function used by ParsePattern() and ParsePatternNoCase() */
143 LONG
patternParse(CONST_STRPTR Source
, STRPTR Dest
, LONG DestLength
,
144 BOOL useCase
, struct DosLibrary
*DOSBase
);
149 struct FileHandle
*fh
,
152 struct DosLibrary
*DOSBase
154 LONG
InternalFlush( struct FileHandle
*fh
, struct DosLibrary
*DOSBase
);
159 struct AChain
*Match_AllocAChain(LONG extrasize
, struct DosLibrary
*DOSBase
);
160 void Match_FreeAChain(struct AChain
*ac
, struct DosLibrary
*DOSBase
);
161 LONG
Match_BuildAChainList(CONST_STRPTR pattern
, struct AnchorPath
*ap
,
162 struct AChain
**retac
, struct DosLibrary
*DOSBase
);
163 LONG
Match_MakeResult(struct AnchorPath
*ap
, struct DosLibrary
*DOSBase
);
165 void addprocesstoroot(struct Process
* , struct DosLibrary
*);
166 void removefromrootnode(struct Process
*, struct DosLibrary
*);
170 UBYTE type
; /* 0: Split 1: MP_NOT */
171 CONST_STRPTR pat
; /* Pointer into pattern */
172 CONST_STRPTR str
; /* Pointer into string */
177 struct markerarray
*next
;
178 struct markerarray
*prev
;
179 struct marker marker
[128];
182 #define PUSH(t,p,s) \
186 if(macur->next==NULL) \
188 macur->next=AllocMem(sizeof(struct markerarray),MEMF_ANY); \
189 if(macur->next==NULL) \
190 ERROR(ERROR_NO_FREE_STORE); \
191 macur->next->prev=macur; \
196 macur->marker[macnt].type=(t); \
197 macur->marker[macnt].pat=(p); \
198 macur->marker[macnt].str=(s); \
212 (t)=macur->marker[macnt].type; \
213 (p)=macur->marker[macnt].pat; \
214 (s)=macur->marker[macnt].str; \
217 #define MP_ESCAPE 0x81 /* Before characters in [0x81;0x8a] */
218 #define MP_MULT 0x82 /* _#(_a) */
219 #define MP_MULT_END 0x83 /* #(a_)_ */
220 #define MP_NOT 0x84 /* _~(_a) */
221 #define MP_NOT_END 0x85 /* ~(a_)_ */
222 #define MP_OR 0x86 /* _(_a|b) */
223 #define MP_OR_NEXT 0x87 /* (a_|_b) */
224 #define MP_OR_END 0x88 /* (a|b_)_ */
225 #define MP_SINGLE 0x89 /* ? */
226 #define MP_ALL 0x8a /* #? or * */
227 #define MP_SET 0x8b /* _[_ad-g] */
228 #define MP_NOT_SET 0x8c /* _[~_ad-g] */
229 #define MP_DASH 0x8d /* [ad_-g_] */
230 #define MP_SET_END 0x8e /* [ad-g_]_ */
232 /* Whether MatchFirst/MatchNext/MatchEnd in case of the base
233 AChain should just take the currentdir lock pointer, or
234 make a real duplicate with DupLock() */
236 #define MATCHFUNCS_NO_DUPLOCK 0
238 #define __is_task(task) (((struct Task *)task)->tc_Node.ln_Type == NT_TASK)
239 #define __is_process(task) (((struct Task *)task)->tc_Node.ln_Type == NT_PROCESS)
253 IPTR start_address
; // start address of loaded executable segment
254 struct MinList seginfos
;
257 struct InternalExAllControl
259 struct ExAllControl eac
;
260 /* Used for ExAll emulation. If non null, it means
261 ExAll emulation is being performed. */
262 struct FileInfoBlock
*fib
;
266 typedef struct FileHandle
* FileHandlePtr
;
268 void vbuf_free(FileHandlePtr fh
);
269 APTR
vbuf_alloc(FileHandlePtr fh
, STRPTR buf
, ULONG size
);
270 BOOL
vbuf_inject(BPTR fh
, CONST_STRPTR argptr
, ULONG argsize
, struct DosLibrary
*DOSBase
);
272 LONG
FWriteChars(BPTR file
, CONST UBYTE
* buffer
, ULONG length
, struct DosLibrary
*DOSBase
);
275 #ifdef AROS_FAST_BSTR
277 #define CMPBSTR(x, y) Stricmp(BADDR(x), BADDR(y))
278 #define CMPNICBSTR(x, y, n) Strnicmp(x, BADDR(y), n)
279 #define BSTR2C(s) ((STRPTR)BADDR(s))
284 BOOL
CMPBSTR(BSTR
, BSTR
);
285 BOOL
CMPNICBSTR(CONST_STRPTR
, BSTR
, UBYTE
);
288 #define FreeCSTR(s) FreeVec(s)
292 #ifdef AROS_FAST_BSTR
293 #define C2BSTR(x) ((char *)(x))
294 #define FREEC2BSTR(x) do { } while (0)
295 #define CMPCBSTR(a,b) strcmp(a,b)
296 #define CMPICBSTR(a,b) Stricmp(a,b)
298 BSTR
C2BSTR(CONST_STRPTR
);
299 #define FREEC2BSTR(bstr) FreeVec(BADDR(bstr))
300 BOOL
CMPCBSTR(CONST_STRPTR
, BSTR
);
301 BOOL
CMPICBSTR(CONST_STRPTR
, BSTR
);
304 void fixfib(struct FileInfoBlock
*);
306 struct PacketHelperStruct
309 struct MsgPort
*port
;
314 BOOL
getpacketinfo(struct DosLibrary
*DOSBase
, CONST_STRPTR
, struct PacketHelperStruct
*);
315 BOOL
getdevpacketinfo(struct DosLibrary
*DOSBase
, CONST_STRPTR devname
, CONST_STRPTR name
, struct PacketHelperStruct
*phs
);
316 void freepacketinfo(struct DosLibrary
*DOSBase
, struct PacketHelperStruct
*);
318 #define ASSERT_VALID_FILELOCK(lock) do { \
319 struct FileLock *fl = BADDR(lock); \
320 if (fl && fl->fl_Access != SHARED_LOCK && fl->fl_Access != EXCLUSIVE_LOCK) { \
321 bug("%s() bogus FileLock! '%s' %x %d %s/%s/%d\n", \
322 __FUNCTION__, SysBase->ThisTask->tc_Node.ln_Name, fl, fl->fl_Access, __FILE__,__FUNCTION__,__LINE__); \
326 /* Shell utilities */
327 BPTR
findseg_cli(BOOL isBoot
, struct DosLibrary
*DOSBase
);
329 BPTR
findseg_shell(BOOL isBoot
, struct DosLibrary
*DOSBase
);
331 /* Helper for IN:, OUT:, ERR:, STDIN:, STDOUT:, STDERR:
333 BOOL
pseudoLock(CONST_STRPTR name
, LONG lockMode
, BPTR
*lock
, LONG
*ret
, struct DosLibrary
*DOSBase
);
335 #endif /* DOS_INTERN_H */