%% 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 #define UNISTD_H_INCLUDED 1 #endif #endif #if DK4_HAVE_ERRNO_H #ifndef ERRNO_H_INCLUDED #include #define ERRNO_H_INCLUDED 1 #endif #endif #if DK4_HAVE_IO_H #ifndef IO_H_INCLUDED #include #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; }