summaryrefslogtreecommitdiff
path: root/support/dktools/dk4fdrda.ctr
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk4fdrda.ctr
Initial commit
Diffstat (limited to 'support/dktools/dk4fdrda.ctr')
-rw-r--r--support/dktools/dk4fdrda.ctr125
1 files changed, 125 insertions, 0 deletions
diff --git a/support/dktools/dk4fdrda.ctr b/support/dktools/dk4fdrda.ctr
new file mode 100644
index 0000000000..3395cbd1bf
--- /dev/null
+++ b/support/dktools/dk4fdrda.ctr
@@ -0,0 +1,125 @@
+%% options
+
+copyright owner = Dirk Krause
+copyright year = 2015-xxxx
+license = bsd
+
+
+%% header
+
+/** @file dk4fdrda.h Read from file descriptor.
+*/
+
+#include "dk4conf.h"
+#include "dk4app.h"
+
+#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 "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;
+}
+