1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
%% options
copyright owner = Dirk Krause
copyright year = 2015-xxxx
SPDX-License-Identifier: BSD-3-Clause
%% header
/** @file dk4fdrda.h Read from file descriptor.
*/
#ifndef DK4CONF_H_INCLUDED
#if DK4_BUILDING_DKTOOLS4
#include "dk4conf.h"
#else
#include <dktools-4/dk4conf.h>
#endif
#endif
#ifndef DK4APP_H_INCLUDED
#if DK4_BUILDING_DKTOOLS4
#include "dk4app.h"
#else
#include <dktools-4/dk4app.h>
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
/** Read from file descriptor.
@param fd File descriptor to read from.
@param buffer Destination buffer address.
@param psz Pointer to buffer size (number of bytes),
in: bytes available, out: bytes used.
@param fn File name, may be NULL.
@param app Application structure for diagnostics, may be NULL.
@return 1 on success, 0 on error.
*/
int
dk4fd_read_app(
int fd, void *buffer, size_t *psz, const dkChar *fn, dk4_app_t *app
);
#ifdef __cplusplus
}
#endif
%% module
#include "dk4conf.h"
#include "dk4fdrda.h"
#include "dk4fdrde.h"
#if DK4_HAVE_UNISTD_H
#ifndef UNISTD_H_INCLUDED
#include <unistd.h>
#define UNISTD_H_INCLUDED 1
#endif
#endif
#if DK4_HAVE_ERRNO_H
#ifndef ERRNO_H_INCLUDED
#include <errno.h>
#define ERRNO_H_INCLUDED 1
#endif
#endif
#if DK4_HAVE_IO_H
#ifndef IO_H_INCLUDED
#include <io.h>
#define IO_H_INCLUDED 1
#endif
#endif
$!trace-include
#ifdef RW_MAX
#undef RW_MAX
#endif
#if DK4_ON_WINDOWS
/** Maximum number of bytes for read or write operation.
*/
#define RW_MAX (INT_MAX)
#else
/** Maximum number of bytes for read or write operation.
*/
#define RW_MAX ((SIZE_MAX) / 2U)
#endif
int
dk4fd_read_app(
int fd, void *buffer, size_t *psz, const dkChar *fn, dk4_app_t *app
)
{
#if DK4_ON_WINDOWS
int res;
#else
ssize_t res;
#endif
int back = 0;
$? "+ dk4fd_read_app"
if ((-1 != fd) && (NULL != buffer) && (NULL != psz)) {
if (0 < *psz) {
if ((dk4_um_t)RW_MAX >= (dk4_um_t)(*psz)) {
errno = 0;
#if DK4_ON_WINDOWS
res = _read(fd, buffer, (unsigned)(*psz));
#else
res = read(fd, buffer, *psz);
#endif
if (0 <= res) {
if (0 < res) { $? ". bytes found"
back = 1;
*psz = (size_t)res;
} else { $? ". EOF"
back = 1;
*psz = (size_t)0;
}
} else { $? "! error"
dk4fd_read_error_msg(app, fn, errno);
}
}
} else { $? "! BUG buffer size 0"
}
} else { $? "! BUG arguments"
} $? "- dk4fd_read_app %d", back
return back;
}
|