diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk4fdrda.ctr |
Initial commit
Diffstat (limited to 'support/dktools/dk4fdrda.ctr')
-rw-r--r-- | support/dktools/dk4fdrda.ctr | 125 |
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; +} + |