summaryrefslogtreecommitdiff
path: root/support/dktools/dk4fdrda.ctr
blob: 0186c692bbca271b0b883153321bd23c4a02707b (plain)
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;
}