6 #include <exec/types.h>
7 #include <intuition/classes.h>
8 #include <intuition/classusr.h>
9 #include <utility/hooks.h>
11 #include <dos/dostags.h>
12 #include <dos/exall.h>
16 #include <proto/dos.h>
17 #include <proto/exec.h>
18 #include <proto/intuition.h>
19 #include <proto/utility.h>
20 #include <proto/asl.h>
22 #include <proto/scalos.h>
24 #include <clib/alib_protos.h>
27 #include <scalos/scalos.h>
34 #include "FsAbstraction.h"
36 //----------------------------------------------------------------------------
38 // local data definitions
40 //----------------------------------------------------------------------------
44 //----------------------------------------------------------------------------
48 //----------------------------------------------------------------------------
50 BOOL
ScalosExamineBegin(T_ExamineData
**exd
)
56 *exd
= AllocDosObject(DOS_FIB
, NULL
);
57 return (BOOL
) (NULL
!= *exd
);
61 //----------------------------------------------------------------------------
63 void ScalosExamineEnd(T_ExamineData
**exd
)
68 FreeDosObject(DOS_EXAMINEDATA
, *exd
);
74 FreeDosObject(DOS_FIB
, *exd
);
80 //----------------------------------------------------------------------------
82 BOOL
ScalosExamineLock(BPTR lock
, T_ExamineData
**exd
)
85 *exd
= ExamineObjectTags(EX_FileLockInput
, lock
,
87 return (NULL
!= *exd
);
88 #elif defined(__MORPHOS__) && defined(ACTION_EXAMINE_NEXT64)
89 if (DOSBase
->dl_lib
.lib_Version
>= 51)
90 return Examine64(lock
, *exd
, NULL
);
92 return Examine(lock
, *exd
);
94 return (BOOL
) Examine(lock
, *exd
);
98 //----------------------------------------------------------------------------
100 BOOL
ScalosExamineFH(BPTR fh
, T_ExamineData
**exd
)
103 *exd
= ExamineObjectTags(EX_FileHandleInput
, fh
,
105 return (NULL
!= *exd
);
106 #elif defined(__MORPHOS__) && defined(ACTION_EXAMINE_NEXT64)
107 if (DOSBase
->dl_lib
.lib_Version
>= 51)
108 return ExamineFH64(fh
, *exd
, NULL
);
110 return ExamineFH(fh
, *exd
);
112 return ExamineFH(fh
, *exd
);
113 #endif //__amigaos4__
115 //----------------------------------------------------------------------------
117 struct DateStamp
*ScalosExamineGetDate(T_ExamineData
*exd
)
122 return &exd
->fib_Date
;
123 #endif //__amigaos4__
126 //----------------------------------------------------------------------------
128 ULONG
ScalosExamineGetProtection(const T_ExamineData
*exd
)
131 return exd
->Protection
;
133 return (ULONG
) exd
->fib_Protection
;
134 #endif //__amigaos4__
137 //----------------------------------------------------------------------------
139 ULONG64
ScalosExamineGetSize(const T_ExamineData
*exd
)
142 return exd
->FileSize
;
143 #elif defined(__MORPHOS__) && defined(ACTION_EXAMINE_NEXT64)
144 if (DOSBase
->dl_lib
.lib_Version
>= 51)
146 ULONG64 Size
= (ULONG64
) exd
->fib_un
.fib_un_ext
.fib_un_ext_Size64
;
148 // workaround for MorphOS 2.1 sign-extension bug:
149 // 64bit file size is negative for files with sizes between 2G and 4G
150 if (0xffffffff == ULONG64_HIGH(Size
))
151 Size
= MakeU64(ULONG64_LOW(Size
));
157 return MakeU64(exd
->fib_Size
);
160 return MakeU64(exd
->fib_Size
);
161 #endif //__amigaos4__
164 //----------------------------------------------------------------------------
166 ULONG
ScalosExamineGetBlockCount(const T_ExamineData
*exd
)
169 if (exd
->FileSize
>= 0)
171 // Real block count is not available, so we calculate an estimation
172 return (511 + exd
->FileSize
) / 512;
176 #elif defined(__MORPHOS__)
177 return exd
->fib_NumBlocks
;
179 return (ULONG
) exd
->fib_NumBlocks
;
180 #endif //__amigaos4__
183 //----------------------------------------------------------------------------
185 CONST_STRPTR
ScalosExamineGetName(const T_ExamineData
*exd
)
190 return exd
->fib_FileName
;
191 #endif //__amigaos4__
194 //----------------------------------------------------------------------------
196 CONST_STRPTR
ScalosExamineGetComment(const T_ExamineData
*exd
)
201 return exd
->fib_Comment
;
202 #endif //__amigaos4__
205 //----------------------------------------------------------------------------
207 LONG
ScalosExamineGetDirEntryType(const T_ExamineData
*exd
)
212 if( EXD_IS_FILE(exd
) )
214 else if ( EXD_IS_DIRECTORY(exd
) )
216 else if (EXD_IS_SOFTLINK(exd
))
218 else if (EXD_IS_PIPE(exd
))
223 return exd
->fib_DirEntryType
;
224 #endif //__amigaos4__
227 //----------------------------------------------------------------------------
229 LONG
ScalosExamineGetDirEntryTypeRoot(const T_ExamineData
*exd
, BPTR fLock
)
234 if( EXD_IS_FILE(exd
) )
236 else if ( EXD_IS_DIRECTORY(exd
) )
238 // Special handling (expensive!) since AmigaOS4 ExamineObject() has no means to recognize volumes
239 BPTR parentLock
= ParentDir(fLock
);
250 else if (EXD_IS_SOFTLINK(exd
))
252 else if (EXD_IS_PIPE(exd
))
257 return exd
->fib_DirEntryType
;
258 #endif //__amigaos4__
261 //----------------------------------------------------------------------------
263 LONG
ScalosExamineIsDrawer(const T_ExamineData
*exd
)
266 return EXD_IS_DIRECTORY(exd
) ? TRUE
: FALSE
;
268 return exd
->fib_DirEntryType
> 0;
269 #endif //__amigaos4__
272 //----------------------------------------------------------------------------
274 ULONG
ScalosExamineGetDirUID(const T_ExamineData
*exd
)
277 return exd
->OwnerUID
;
279 return exd
->fib_OwnerUID
;
280 #endif //__amigaos4__
282 //----------------------------------------------------------------------------
284 ULONG
ScalosExamineGetDirGID(const T_ExamineData
*exd
)
287 return exd
->OwnerGID
;
289 return exd
->fib_OwnerGID
;
290 #endif //__amigaos4__
292 //----------------------------------------------------------------------------
294 SLONG64
ScalosSeek(BPTR fh
, SLONG64 pos
, LONG mode
)
297 int64 oldPos
= GetFilePosition(fh
);
299 if (-1LL != oldPos
&& !ChangeFilePosition(fh
, pos
, mode
))
304 #elif defined(__MORPHOS__) && defined(ACTION_EXAMINE_NEXT64)
305 if (DOSBase
->dl_lib
.lib_Version
>= 51)
306 return Seek64(fh
, pos
, mode
);
308 return Seek(fh
, ULONG64_LOW(pos
), mode
);
312 return (SLONG64
) Seek(fh
, ULONG64_LOW(pos
), mode
);
317 SLONG64_HIGH(res64
) = 0;
318 SLONG64_LOW(res64
) = Seek(fh
, ULONG64_LOW(pos
), mode
);
323 #endif //__amigaos4__
326 //----------------------------------------------------------------------------
328 BOOL
ScalosExamineDirBegin(BPTR lock
, T_ExamineDirHandle
*edh
)
331 *edh
= ObtainDirContextTags(EX_FileLockInput
, lock
,
332 EX_DataFields
, EXF_ALL
,
334 return (NULL
!= *edh
);
335 #elif defined(__MORPHOS__) && defined(ACTION_EXAMINE_NEXT64)
336 *edh
= AllocDosObject(DOS_FIB
, NULL
);
339 if (DOSBase
->dl_lib
.lib_Version
>= 51)
341 if (!Examine64(lock
, *edh
, NULL
))
343 FreeDosObject(DOS_FIB
, *edh
);
349 if (!Examine(lock
, *edh
))
351 FreeDosObject(DOS_FIB
, *edh
);
355 d1(KPrintF("%s/%s/%ld: fib=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, *edh
));
356 return (NULL
!= *edh
);
358 *edh
= AllocDosObject(DOS_FIB
, NULL
);
361 if (!Examine(lock
, *edh
))
363 FreeDosObject(DOS_FIB
, *edh
);
366 return (BOOL
) (NULL
!= *edh
);
367 #endif //__amigaos4__
370 //----------------------------------------------------------------------------
372 void ScalosExamineDirEnd(T_ExamineDirHandle
*edh
)
377 ReleaseDirContext(*edh
);
383 FreeDosObject(DOS_FIB
, *edh
);
386 #endif //__amigaos4__
389 //----------------------------------------------------------------------------
391 BOOL
ScalosExamineDir(BPTR lock
, T_ExamineDirHandle
*edh
, T_ExamineData
**exd
)
395 *exd
= ExamineDir(*edh
);
396 return (NULL
!= *exd
);
397 #elif defined(__MORPHOS__) && defined(ACTION_EXAMINE_NEXT64)
398 if (DOSBase
->dl_lib
.lib_Version
>= 51)
400 if (ExNext64(lock
, *edh
, NULL
))
411 if (ExNext(lock
, *edh
))
422 if (ExNext(lock
, *edh
))
431 #endif //__amigaos4__
434 //----------------------------------------------------------------------------
436 BOOL
ScalosReadLink(BPTR srcDirLock
, CONST_STRPTR srcName
, STRPTR Buffer
, size_t BuffLen
)
439 BOOL Success
= FALSE
;
440 BPTR oldDir
= CurrentDir(srcDirLock
);
441 struct ExamineData
*exd
= NULL
;
442 APTR dirContext
= NULL
;
445 if (ParsePatternNoCase(srcName
, Buffer
, BuffLen
) < 0)
448 dirContext
= ObtainDirContextTags(EX_FileLockInput
, srcDirLock
,
449 EX_DataFields
, EXF_NAME
| EXF_LINK
| EXF_TYPE
,
450 EX_MatchString
, Buffer
,
452 if (NULL
== dirContext
)
455 exd
= ExamineDir(dirContext
);
459 if (!EXD_IS_LINK(exd
))
462 stccpy(Buffer
, exd
->Link
, BuffLen
);
467 ReleaseDirContext(dirContext
);
473 BOOL Success
= FALSE
;
474 struct DevProc
*devproc
= NULL
;
477 if (!NameFromLock(srcDirLock
, Buffer
, BuffLen
))
482 devproc
= GetDeviceProc(Buffer
, NULL
);
488 if (!ReadLink(devproc
->dvp_Port
, srcDirLock
, (STRPTR
) srcName
,
497 FreeDeviceProc(devproc
);
500 #endif //__amigaos4__
503 //----------------------------------------------------------------------------
505 void ScalosDosPacketExamineDir(struct DosPacket
*pkt
, BPTR dirLock
, T_ExamineDirHandle
*edh
)
508 pkt
->dp_Type
= ACTION_EXAMINEDATA_DIR
;
509 pkt
->dp_Arg1
= MKBADDR(*edh
);
511 #elif defined(__MORPHOS__) && defined(ACTION_EXAMINE_NEXT64)
513 if (DOSBase
->dl_lib
.lib_Version
>= 51)
515 pkt
->dp_Type
= ACTION_EXAMINE_NEXT64
;
516 pkt
->dp_Arg1
= dirLock
;
517 pkt
->dp_Arg2
= MKBADDR(*edh
);
522 pkt
->dp_Type
= ACTION_EXAMINE_NEXT
;
523 pkt
->dp_Arg1
= dirLock
;
524 pkt
->dp_Arg2
= MKBADDR(*edh
);
528 pkt
->dp_Type
= ACTION_EXAMINE_NEXT
;
529 pkt
->dp_Arg1
= (IPTR
) dirLock
;
530 pkt
->dp_Arg2
= (IPTR
) MKBADDR(*edh
);
534 //----------------------------------------------------------------------------
536 BOOL
ScalosDosPacketExamineDirResult(struct StandardPacket
*pkt
, T_ExamineData
**exd
,
537 T_ExamineDirHandle
*edh
)
540 if (pkt
->sp_Pkt
.dp_Res1
)
542 *exd
= (T_ExamineData
*) pkt
->sp_Pkt
.dp_Res1
;
547 return 0 != pkt
->sp_Pkt
.dp_Res1
;
549 *exd
= (T_ExamineData
*) *edh
;
551 return (BOOL
) (0 != pkt
->sp_Pkt
.dp_Res1
);
555 //----------------------------------------------------------------------------
557 BOOL
ScalosSupportsExamineDir(struct MsgPort
*fileSysPort
, BPTR dirLock
, T_ExamineDirHandle
*edh
)
562 rc
= DoPkt1(fileSysPort
,
563 ACTION_EXAMINEDATA_DIR
,
566 d1(KPrintF("%s/%s/%ld: rc=%ld\n", __FILE__
, __FUNC__
, __LINE__
, rc
));
567 return (BOOL
) (0 != rc
);
568 #elif defined(__MORPHOS__) && defined(ACTION_EXAMINE_NEXT64)
571 d1(KPrintF("%s/%s/%ld: fib=%08lx\n", __FILE__
, __FUNC__
, __LINE__
, *edh
));
573 rc
= DoPkt3(fileSysPort
,
574 ACTION_EXAMINE_OBJECT64
,
579 d1(KPrintF("%s/%s/%ld: rc=%ld\n", __FILE__
, __FUNC__
, __LINE__
, rc
));
580 return (BOOL
) (0 != rc
);
583 #endif /* __MORPHOS__ */
586 //----------------------------------------------------------------------------