Build fix.
[AROS.git] / rom / dos / read.c
blob80a5db192405d84cc2c5561ec41087179dba3196
1 /*
2 Copyright © 1995-2008, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Read a couple of bytes from a file.
6 Lang: english
7 */
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 /*****************************************************************************
16 NAME */
17 #include <proto/dos.h>
19 AROS_LH3(LONG, Read,
21 /* SYNOPSIS */
22 AROS_LHA(BPTR, file, D1),
23 AROS_LHA(APTR, buffer, D2),
24 AROS_LHA(LONG, length, D3),
26 /* LOCATION */
27 struct DosLibrary *, DOSBase, 7, Dos)
29 /* FUNCTION
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.
35 INPUTS
36 file - filehandle
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
40 as possible.
42 RESULT
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.
47 NOTES
49 EXAMPLE
51 BUGS
53 SEE ALSO
55 INTERNALS
57 *****************************************************************************/
59 AROS_LIBFUNC_INIT
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;
67 ASSERT_VALID_PTR(fh);
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 */
82 do {
83 DosDoIO(&iofs.IOFS);
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;
91 AROS_LIBFUNC_EXIT
92 } /* Read */