Starting changing error convention for casio_write (untested)

This commit is contained in:
Lailouezzz 2020-01-04 21:24:44 +01:00
parent 7210d28a16
commit c70e3a0bef
Signed by: Lailouezzz
GPG Key ID: 03FCE8A99EF8482C
16 changed files with 86 additions and 65 deletions

View File

@ -102,7 +102,7 @@ typedef int casio_stream_settm_t
typedef ssize_t casio_stream_read_t
OF((void *, unsigned char *, size_t));
typedef int casio_stream_write_t
typedef ssize_t casio_stream_write_t
OF((void *, const unsigned char *, size_t));
typedef int casio_stream_seek_t
OF((void *, casio_off_t *, casio_whence_t));
@ -362,7 +362,7 @@ CASIO_EXTERN int CASIO_EXPORT casio_get_lasterr
CASIO_EXTERN ssize_t CASIO_EXPORT casio_read
OF((casio_stream_t *casio__stream,
void *casio__dest, size_t casio__size));
CASIO_EXTERN int CASIO_EXPORT casio_write
CASIO_EXTERN ssize_t CASIO_EXPORT casio_write
OF((casio_stream_t *casio__stream,
const void *casio__data, size_t casio__size));

View File

@ -58,7 +58,8 @@
/* Write. */
# define WRITE(CASIO__BUF, CASIO__SZ) { \
int WRITE_err = casio_write(buffer, (CASIO__BUF), (CASIO__SZ)); \
ssize_t WRITE_ssize = casio_write(buffer, (CASIO__BUF), (CASIO__SZ)); \
int WRITE_err = WRITE_ssize < 0 ? -WRITE_ssize : 0; \
if (WRITE_err) return (WRITE_err); }
# define DWRITE(CASIO__OBJECT) \
WRITE(&(CASIO__OBJECT), sizeof(CASIO__OBJECT))

View File

@ -167,7 +167,8 @@ int CASIO_EXPORT casio_seven_get_buffer(casio_link_t *handle,
msg((ll_info, "buffer too full, should be emptied"));
/* Empty the buffer in the stream. */
buf_err = casio_write(buffer, buf, ps);
ssize_t ssize = casio_write(buffer, buf, ps);
buf_err = ssize < 0 ? -ssize : 0;
if (buf_err) { err = casio_error_nowrite; goto fail; }
/* Reset the pointer. */

View File

@ -149,17 +149,18 @@ fail:
* @return the error code (0 if ok).
*/
CASIO_LOCAL int casio_seven_data_write(seven_data_cookie_t *cookie,
CASIO_LOCAL ssize_t casio_seven_data_write(seven_data_cookie_t *cookie,
const unsigned char *data, size_t size)
{
int err; size_t tocopy, lastlimit;
casio_link_t *handle = cookie->_link;
size_t writtensize = 0;
/* Check if the stream is faulty, or if we have already finished. */
if (cookie->_faulty)
return (casio_error_nowrite);
return -(casio_error_nowrite);
if (cookie->_id > cookie->_total)
return (casio_error_eof);
return -(casio_error_eof);
/* Current packet management. */
if (cookie->_pos || size < BUFSIZE) {
@ -171,13 +172,14 @@ CASIO_LOCAL int casio_seven_data_write(seven_data_cookie_t *cookie,
memcpy(cookie->_current, data, tocopy);
data += tocopy; size -= tocopy;
cookie->_pos += tocopy;
writtensize += tocopy;
/* Check if the current packet is full. */
if (cookie->_id == cookie->_total) {
if (cookie->_pos < cookie->_lastsize)
return (0);
return (writtensize);
} else if (cookie->_pos < BUFSIZE - 1)
return (0);
return (writtensize);
/* Send the packet. */
if (cookie->_id == 1 && cookie->_disp)
@ -198,14 +200,14 @@ CASIO_LOCAL int casio_seven_data_write(seven_data_cookie_t *cookie,
if (err) goto fail;
if (cookie->_disp) (*cookie->_disp)(cookie->_disp_cookie,
cookie->_id, cookie->_total);
data += BUFSIZE; size -= BUFSIZE; cookie->_id++;
data += BUFSIZE; size -= BUFSIZE; cookie->_id++; writtensize += BUFSIZE;
}
/* Copy the last bytes of the call. */
lastlimit = cookie->_id == cookie->_total ? cookie->_lastsize : BUFSIZE;
tocopy = lastlimit; if (tocopy > size) tocopy = size;
memcpy(cookie->_current, data, tocopy);
cookie->_pos = tocopy; size -= tocopy;
cookie->_pos = tocopy; size -= tocopy; writtensize += tocopy;
/* Send the last packet if required. */
if (tocopy == lastlimit) {
@ -220,14 +222,14 @@ CASIO_LOCAL int casio_seven_data_write(seven_data_cookie_t *cookie,
/* Check if there are still some bytes left
* (bytes after the last packet, means the announced size
* was too small). */
if (size) return (casio_error_nowrite);
if (size) return -(casio_error_nowrite);
/* Everything went well! :) */
return (0);
return (writtensize);
fail:
/* XXX: tell the distant device we have a problem? */
cookie->_faulty = 1;
return (err);
return -(err);
}
/**
@ -286,11 +288,13 @@ CASIO_LOCAL int casio_seven_data_close(seven_data_cookie_t *cookie)
* go directly to the end. */
memset(zeroes, 0, BUFSIZE);
for (; left >= BUFSIZE; left -= BUFSIZE) {
if ((err = casio_seven_data_write(cookie, zeroes, BUFSIZE)))
ssize_t ssize = casio_seven_data_write(cookie, zeroes, BUFSIZE);
if ((err = ssize < 0 ? -ssize : 0))
goto fail;
}
err = casio_seven_data_write(cookie, zeroes, left);
ssize_t ssize = casio_seven_data_write(cookie, zeroes, left);
err = ssize < 0 ? -ssize : 0;
}
err = 0;

View File

@ -202,11 +202,12 @@ CASIO_LOCAL ssize_t seven_scsi_read(seven_scsi_cookie_t *cookie,
return copiedsize;
}
CASIO_LOCAL int seven_scsi_write(seven_scsi_cookie_t *cookie,
CASIO_LOCAL ssize_t seven_scsi_write(seven_scsi_cookie_t *cookie,
unsigned char const *buffer, size_t size)
{
casio_scsi_t scsi;
int err;
size_t writtensize = 0;
do {
casio_uint16_t activity;
@ -229,7 +230,7 @@ CASIO_LOCAL int seven_scsi_write(seven_scsi_cookie_t *cookie,
scsi.casio_scsi_data_len = 16;
if ((err = casio_scsi_request(cookie->stream, &scsi)))
return (err);
return -(err);
#if 0
activity = (poll_data[10] << 8) | poll_data[11];
@ -264,14 +265,15 @@ CASIO_LOCAL int seven_scsi_write(seven_scsi_cookie_t *cookie,
scsi.casio_scsi_data_len = to_send;
if ((err = casio_scsi_request(cookie->stream, &scsi)))
return (err);
return -(err);
buffer += to_send;
size -= to_send;
writtensize += to_send;
}
} while (size);
return (0);
return (writtensize);
}
/* ---

View File

@ -91,7 +91,8 @@ CASIO_LOCAL int casio_seven_send_buf(casio_link_t *handle,
}
/* send prepared packet */
err = casio_write(handle->casio_link_stream, buf, bufsize);
ssize_t ssize = casio_write(handle->casio_link_stream, buf, bufsize);
err = ssize < 0 ? -ssize : 0;
if (err) return (err);
/* set wasreset for logging */

View File

@ -57,7 +57,8 @@
/* Write. */
# define WRITE(CASIO__BUF, CASIO__SZ) { \
int WRITE_err = casio_write(buffer, (CASIO__BUF), (CASIO__SZ)); \
ssize_t WRITE_ssize = casio_write(buffer, (CASIO__BUF), (CASIO__SZ)); \
int WRITE_err = WRITE_ssize < 0 ? -WRITE_ssize : 0; \
if (WRITE_err) return (WRITE_err); }
# define DWRITE(CASIO__OBJECT) \
WRITE(&(CASIO__OBJECT), sizeof(CASIO__OBJECT))

View File

@ -126,10 +126,10 @@ CASIO_LOCAL ssize_t casio_file_read(file_cookie_t *cookie,
* @arg cookie the cookie.
* @arg data the source
* @arg size the source size
* @return the error code (0 if ok)
* @return the size written if > 0, or if < 0 the error code is -[returned value].
*/
CASIO_LOCAL int casio_file_write(file_cookie_t *cookie,
CASIO_LOCAL ssize_t casio_file_write(file_cookie_t *cookie,
const unsigned char *data, size_t size)
{
size_t sent;
@ -145,7 +145,7 @@ CASIO_LOCAL int casio_file_write(file_cookie_t *cookie,
/* End of file (EOF). */
msg((ll_error, "encountered an end of file"));
return (casio_error_eof);
return -(casio_error_eof);
case EINTR: /* alarm */
case ETIMEDOUT:
@ -155,20 +155,20 @@ CASIO_LOCAL int casio_file_write(file_cookie_t *cookie,
/* Timeout error. */
msg((ll_error, "timeout received"));
return (casio_error_timeout);
return -(casio_error_timeout);
case ENODEV:
/* Device disconnected. */
msg((ll_fatal, "calculator was disconnected"));
return (casio_error_nocalc);
return -(casio_error_nocalc);
default:
msg((ll_fatal, "errno was %d: %s", errno, strerror(errno)));
return (casio_error_unknown);
return -(casio_error_unknown);
}
return (0);
return sent;
}
/**

View File

@ -61,7 +61,7 @@ CASIO_EXTERN int CASIO_EXPORT casio_libusb_settm
CASIO_EXTERN ssize_t CASIO_EXPORT casio_libusb_read
OF((cookie_libusb_t *casio__cookie,
unsigned char *casio__dest, size_t casio__size));
CASIO_EXTERN int CASIO_EXPORT casio_libusb_write
CASIO_EXTERN ssize_t CASIO_EXPORT casio_libusb_write
OF((cookie_libusb_t *casio__cookie,
const unsigned char *casio__data, size_t casio__size));

View File

@ -26,10 +26,10 @@
* @arg cookie the cookie.
* @arg data the source.
* @arg size the source size.
* @return the error code (0 if ok).
* @return the size written if > 0, or if < 0 the error code is -[returned value].
*/
int CASIO_EXPORT casio_libusb_write(cookie_libusb_t *cookie,
ssize_t CASIO_EXPORT casio_libusb_write(cookie_libusb_t *cookie,
const unsigned char *data, size_t size)
{
int sent, libusberr;
@ -44,15 +44,15 @@ int CASIO_EXPORT casio_libusb_write(cookie_libusb_t *cookie,
case LIBUSB_ERROR_PIPE:
case LIBUSB_ERROR_NO_DEVICE:
msg((ll_error, "The calculator is not here anymore :("));
return (casio_error_nocalc);
return -(casio_error_nocalc);
default:
msg((ll_fatal, "libusb error was %d: %s", libusberr,
libusb_strerror(libusberr)));
return (casio_error_unknown);
return -(casio_error_unknown);
}
return (0);
return (sent);
}
#endif

View File

@ -63,25 +63,25 @@ CASIO_LOCAL ssize_t casio_memory_read(void *vcookie, unsigned char *dest, size_t
* @arg vcookie the cookie (uncasted).
* @arg data the data pointer.
* @arg size the data size.
* @return the error code (0 if ok).
* @return the size written if > 0, or if < 0 the error code is -[returned value].
*/
CASIO_LOCAL int casio_memory_write(void *vcookie, const unsigned char *data,
CASIO_LOCAL ssize_t casio_memory_write(void *vcookie, const unsigned char *data,
size_t size)
{
memory_cookie_t *cookie = (void*)vcookie;
if (((size_t)-1 - cookie->_offset) < size) /* overflow */
return (casio_error_write);
return -(casio_error_write);
if (cookie->_offset + (casio_off_t)size > cookie->_size) {
cookie->_offset = cookie->_size - 1;
return (casio_error_eof);
return -(casio_error_eof);
}
memcpy(&cookie->_memory[cookie->_offset], data, size);
cookie->_offset += size;
return (0);
return (size);
}
/**

View File

@ -54,7 +54,7 @@ CASIO_EXTERN int CASIO_EXPORT casio_streams_settm
CASIO_EXTERN ssize_t CASIO_EXPORT casio_streams_read
OF((streams_cookie_t *casio__cookie,
unsigned char *casio__dest, size_t casio__size));
CASIO_EXTERN int CASIO_EXPORT casio_streams_write
CASIO_EXTERN ssize_t CASIO_EXPORT casio_streams_write
OF((streams_cookie_t *casio__cookie,
const unsigned char *casio__data, size_t casio__size));

View File

@ -26,13 +26,14 @@
* @arg cookie the cookie.
* @arg data the source.
* @arg size the source size.
* @return the error (0 if ok).
* @return the size written if > 0, or if < 0 the error code is -[returned value].
*/
int CASIO_EXPORT casio_streams_write(streams_cookie_t *cookie,
ssize_t CASIO_EXPORT casio_streams_write(streams_cookie_t *cookie,
const unsigned char *data, size_t size)
{
int fd = cookie->_writefd;
size_t writtensize = 0;
/* Send. */
@ -40,19 +41,20 @@ int CASIO_EXPORT casio_streams_write(streams_cookie_t *cookie,
ssize_t wr = write(fd, data, size);
if (wr < 0) break;
size -= (size_t)wr;
writtensize += (size_t)wr;
}
/* Be sure it's written, or check the error. */
if (size) switch (errno) {
case ENODEV:
return (casio_error_nocalc);
return -(casio_error_nocalc);
default:
msg((ll_fatal, "errno was %d: %s", errno, strerror(errno)));
return (casio_error_unknown);
return -(casio_error_unknown);
}
return (0);
return (writtensize);
}
#endif

View File

@ -53,7 +53,7 @@ CASIO_EXTERN int CASIO_EXPORT casio_windows_settm
CASIO_EXTERN ssize_t CASIO_EXPORT casio_windows_read
OF((win_cookie_t *cookie, unsigned char *dest, size_t size));
CASIO_EXTERN int CASIO_EXPORT casio_windows_write
CASIO_EXTERN ssize_t CASIO_EXPORT casio_windows_write
OF((win_cookie_t *cookie, const unsigned char *data, size_t size));
/* Seek callback. */

View File

@ -26,13 +26,14 @@
* @arg cookie the cookie.
* @arg data the source
* @arg size the source size
* @return the error code (0 if ok).
* @return the size written if > 0, or if < 0 the error code is -[returned value].
*/
int CASIO_EXPORT casio_windows_write(win_cookie_t *cookie,
ssize_t CASIO_EXPORT casio_windows_write(win_cookie_t *cookie,
const unsigned char *data, size_t size)
{
BOOL wsuccess, werr;
size_t writtensize = 0;
/* Make the I/O request. */
@ -49,6 +50,7 @@ int CASIO_EXPORT casio_windows_write(win_cookie_t *cookie,
data += wrt;
size -= wrt;
writtensize += wrt;
} while (size);
/* Check the error. */
@ -56,14 +58,14 @@ int CASIO_EXPORT casio_windows_write(win_cookie_t *cookie,
if (!wsuccess) switch ((werr = GetLastError())) {
case ERROR_DEV_NOT_EXIST:
msg((ll_error, "Device has been disconnected!"));
return (casio_error_nocalc);
return -(casio_error_nocalc);
default:
msg((ll_fatal, "Encountered error 0x%08lx", werr));
return (casio_error_unknown);
return -(casio_error_unknown);
}
return (0);
return (writtensize);
}
#endif

View File

@ -25,32 +25,38 @@
* @arg stream the stream to write to.
* @arg data the data to write.
* @arg size the amount of bytes to write.
* @return the error code (0 if ok).
* @return the size written if > 0, or if < 0 the error code is -[returned value].
*/
int CASIO_EXPORT casio_write(casio_stream_t *stream,
ssize_t CASIO_EXPORT casio_write(casio_stream_t *stream,
const void *data, size_t size)
{
int err;
int err = casio_error_ok;
ssize_t ssize = 0;
/* check if we can write */
failure(~stream->casio_stream_mode & CASIO_OPENMODE_WRITE,
casio_error_write)
failure(~stream->casio_stream_mode & CASIO_OPENMODE_WRITE,
casio_error_write);
/* write */
if (!size) return (0);
err = (*getcb(stream, write))(stream->casio_stream_cookie, data, size);
if (err) {
msg((ll_error, "Stream writing failure: %s", casio_strerror(err)));
if (size == 0) {
return (0);
}
ssize = (*getcb(stream, write))(stream->casio_stream_cookie, data, size);
if (ssize < 0) {
err = -ssize;
msg((ll_error, "Stream reading failure: %s", casio_strerror(err)));
goto fail;
}
/* move the cursor and return */
stream->casio_stream_offset += size;
err = 0;
if(ssize >= 0) {
stream->casio_stream_offset += size;
}
fail:
stream->casio_stream_lasterr = err;
return (err);
return ssize;
}
/**
@ -66,5 +72,6 @@ int CASIO_EXPORT casio_write_char(casio_stream_t *stream, int car)
{
unsigned char ccar = car;
return (casio_write(stream, &ccar, 1));
ssize_t ssize = casio_write(stream, &ccar, 1);
return (ssize < 0 ? (int)-ssize : 0);
}