Subversion Repositories Kolibri OS

Rev

Rev 4872 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/* Reentrant versions of read system call. */
2
 
3
#include 
4
#include 
5
#include <_syslist.h>
6
#include 
7
 
8
/* Some targets provides their own versions of this functions.  Those
9
   targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS.  */
10
 
11
#ifdef _REENT_ONLY
12
#ifndef REENTRANT_SYSCALLS_PROVIDED
13
#define REENTRANT_SYSCALLS_PROVIDED
14
#endif
15
#endif
16
 
17
#ifndef REENTRANT_SYSCALLS_PROVIDED
18
 
19
/* We use the errno variable used by the system dependent layer.  */
20
 
21
/*
22
FUNCTION
23
	<<_read_r>>---Reentrant version of read
24
 
25
INDEX
26
	_read_r
27
 
28
ANSI_SYNOPSIS
29
	#include 
30
	_ssize_t _read_r(struct _reent *<[ptr]>,
31
		         int <[fd]>, void *<[buf]>, size_t <[cnt]>);
32
 
33
TRAD_SYNOPSIS
34
	#include 
35
	_ssize_t _read_r(<[ptr]>, <[fd]>, <[buf]>, <[cnt]>)
36
	struct _reent *<[ptr]>;
37
	int <[fd]>;
38
	char *<[buf]>;
39
	size_t <[cnt]>;
40
 
41
DESCRIPTION
42
	This is a reentrant version of <>.  It
43
	takes a pointer to the global data block, which holds
44
	<>.
45
*/
46
 
47
 
48
extern unsigned  __NFiles;
49
 
50
#define _READ   0x0001  /* file opened for reading */
51
#define _BINARY 0x0040  /* file is binary, skip CRLF processing */
52
#define _ISTTY  0x2000  /* is console device */
53
 
54
#define __handle_check( __h, __r )                \
55
        if( (__h) < 0  ||  (__h) > __NFiles ) {   \
56
           ptr->_errno =  EBADF;                  \
57
           return( __r );                         \
58
        }
59
 
60
_ssize_t
61
_DEFUN (_read, (fd, buf, cnt),
62
     int fd _AND
63
     _PTR buf _AND
64
     size_t cnt)
65
{
66
 
67
    return _read_r( _REENT, fd, buf, cnt);
68
}
69
 
70
_ssize_t
71
_DEFUN (_read_r, (ptr, fd, buf, cnt),
72
     struct _reent *ptr _AND
73
     int fd _AND
74
     _PTR buf _AND
75
     size_t cnt)
76
{
77
    _ssize_t ret;
78
 
79
    _ssize_t  read_len, total_len;
80
    unsigned  reduce_idx, finish_idx;
81
    unsigned  iomode_flags;
82
    char     *buffer = buf;
83
    int       rc;
84
    int       h;
85
    unsigned amount_read;
86
    int err;
87
 
88
    __file_handle *fh;
89
 
90
    __handle_check( fd, -1 );
91
    __ChkTTYIOMode( fd );
92
    iomode_flags = __GetIOMode( fd );
93
    if( iomode_flags == 0 )
94
    {
95
        ptr->_errno = EBADF;
96
        return( -1 );
97
    }
98
    if( !(iomode_flags & _READ) )
99
    {
100
        ptr->_errno = EACCES;      /* changed from EBADF to EACCES 23-feb-89 */
101
        return( -1 );
102
    }
103
 
104
    fh = (__file_handle*) __getOSHandle( fd );
105
 
106
    if( iomode_flags & _BINARY )   /* if binary mode */
107
    {
108
        err = read_file(fh->name, buffer, fh->offset, cnt, &amount_read);
109
        fh->offset+= amount_read;
110
        total_len  = amount_read;
111
 
112
        if(err)
113
            if ( amount_read == 0)
114
                return (-1);
115
    }
116
    else
117
    {
118
        total_len = 0;
119
        read_len = cnt;
120
        do
121
        {
122
            err=read_file(fh->name,buffer, fh->offset, cnt, &amount_read);
123
            fh->offset+=amount_read;
124
 
125
            if( amount_read == 0 )
126
                break;                   /* EOF */
127
 
128
            reduce_idx = 0;
129
            finish_idx = reduce_idx;
130
            for( ; reduce_idx < amount_read; ++reduce_idx )
131
            {
132
                if( buffer[ reduce_idx ] == 0x1a )     /* EOF */
133
                {
134
                    _lseek_r(ptr, fd, ((long)reduce_idx - (long)amount_read)+1L,
135
                           SEEK_CUR );
136
                    total_len += finish_idx;
137
                    return( total_len );
138
                }
139
                if( buffer[ reduce_idx ] != '\r' )
140
                {
141
                    buffer[ finish_idx++ ] = buffer[ reduce_idx ];
142
                };
143
            }
144
 
145
            total_len += finish_idx;
146
            buffer += finish_idx;
147
            read_len -= finish_idx;
148
            if( iomode_flags & _ISTTY )
149
            {
150
                break;  /* 04-feb-88, FWC */
151
            }
152
        } while( read_len != 0 );
153
    }
154
    return( total_len );
155
}
156
 
157
 
158
_ssize_t
159
_DEFUN (read, (fd, buf, cnt),
160
     int fd _AND
161
     _PTR buf _AND
162
     size_t cnt)
163
{
164
 
165
    return _read_r(_REENT, fd, buf, cnt);
166
};
167
 
168
#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */