2 Copyright © 1995-2008, The AROS Development Team. All rights reserved.
5 Desc: Read a couple of bytes from a file.
8 #include <aros/debug.h>
9 #include <proto/exec.h>
10 #include <dos/dosextens.h>
11 #include <dos/filesystem.h>
12 #include "dos_intern.h"
14 /*****************************************************************************
17 #include <proto/dos.h>
22 AROS_LHA(BPTR
, file
, D1
),
23 AROS_LHA(APTR
, buffer
, D2
),
24 AROS_LHA(LONG
, length
, D3
),
27 struct DosLibrary
*, DOSBase
, 7, Dos
)
30 Read some data from a given file. The request is directly
31 given to the filesystem - no buffering is involved. For
32 small amounts of data it's probably better to use the
33 buffered I/O routines.
37 buffer - pointer to buffer for the data
38 length - number of bytes to read. The filesystem is
39 advised to try to fulfill the request as good
43 The number of bytes actually read, 0 if the end of the
44 file was reached, -1 if an error happened. IoErr() will
45 give additional information in that case.
57 *****************************************************************************/
61 /* Get pointer to filehandle */
62 struct FileHandle
*fh
= (struct FileHandle
*)BADDR(file
);
64 /* Get pointer to I/O request. Use stackspace for now. */
65 struct IOFileSys iofs
;
68 ASSERT_VALID_PTR(fh
->fh_Device
);
69 ASSERT_VALID_PTR(fh
->fh_Unit
);
70 ASSERT_VALID_PTR(buffer
);
72 /* Prepare I/O request. */
73 InitIOFS(&iofs
, FSA_READ
, DOSBase
);
75 iofs
.IOFS
.io_Device
= fh
->fh_Device
;
76 iofs
.IOFS
.io_Unit
= fh
->fh_Unit
;
78 iofs
.io_Union
.io_READ
.io_Buffer
= buffer
;
79 iofs
.io_Union
.io_READ
.io_Length
= length
;
81 /* send the request, with error reporting */
84 } while (iofs
.io_DosError
!= 0
85 && !ErrorReport(iofs
.io_DosError
, REPORT_STREAM
, (IPTR
)fh
, NULL
));
87 SetIoErr(iofs
.io_DosError
);
89 return iofs
.io_DosError
== 0 ? iofs
.io_Union
.io_READ
.io_Length
: -1;