diff --git a/include/libcasio/stream.h b/include/libcasio/stream.h index a27bd7d..a6e794c 100644 --- a/include/libcasio/stream.h +++ b/include/libcasio/stream.h @@ -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)); diff --git a/lib/file/file.h b/lib/file/file.h index 30bc53b..0e5f85d 100644 --- a/lib/file/file.h +++ b/lib/file/file.h @@ -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)) diff --git a/lib/link/seven/dataflow.c b/lib/link/seven/dataflow.c index ab158df..0ff5e51 100644 --- a/lib/link/seven/dataflow.c +++ b/lib/link/seven/dataflow.c @@ -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. */ diff --git a/lib/link/seven/datastream.c b/lib/link/seven/datastream.c index 2af1a54..11b5862 100644 --- a/lib/link/seven/datastream.c +++ b/lib/link/seven/datastream.c @@ -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; diff --git a/lib/link/seven/scsi.c b/lib/link/seven/scsi.c index a8af9b8..2db73f1 100644 --- a/lib/link/seven/scsi.c +++ b/lib/link/seven/scsi.c @@ -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); } /* --- diff --git a/lib/link/seven/send.c b/lib/link/seven/send.c index 9eb4892..0912f2e 100644 --- a/lib/link/seven/send.c +++ b/lib/link/seven/send.c @@ -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 */ diff --git a/lib/mcsfile/mcsfile.h b/lib/mcsfile/mcsfile.h index 46d39f5..59990e7 100644 --- a/lib/mcsfile/mcsfile.h +++ b/lib/mcsfile/mcsfile.h @@ -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)) diff --git a/lib/stream/builtin/file.c b/lib/stream/builtin/file.c index ea3a1ea..605485f 100644 --- a/lib/stream/builtin/file.c +++ b/lib/stream/builtin/file.c @@ -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; } /** diff --git a/lib/stream/builtin/libusb/libusb.h b/lib/stream/builtin/libusb/libusb.h index 0cd1a10..a0d5662 100644 --- a/lib/stream/builtin/libusb/libusb.h +++ b/lib/stream/builtin/libusb/libusb.h @@ -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)); diff --git a/lib/stream/builtin/libusb/write.c b/lib/stream/builtin/libusb/write.c index 8f36f37..c24e4a6 100644 --- a/lib/stream/builtin/libusb/write.c +++ b/lib/stream/builtin/libusb/write.c @@ -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 diff --git a/lib/stream/builtin/memory.c b/lib/stream/builtin/memory.c index d7a3166..5614882 100644 --- a/lib/stream/builtin/memory.c +++ b/lib/stream/builtin/memory.c @@ -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); } /** diff --git a/lib/stream/builtin/streams/streams.h b/lib/stream/builtin/streams/streams.h index 9f077f1..cdea0e2 100644 --- a/lib/stream/builtin/streams/streams.h +++ b/lib/stream/builtin/streams/streams.h @@ -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)); diff --git a/lib/stream/builtin/streams/write.c b/lib/stream/builtin/streams/write.c index 2388826..8f2d19d 100644 --- a/lib/stream/builtin/streams/write.c +++ b/lib/stream/builtin/streams/write.c @@ -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 diff --git a/lib/stream/builtin/windows/windows.h b/lib/stream/builtin/windows/windows.h index 05b5eea..839c4b1 100644 --- a/lib/stream/builtin/windows/windows.h +++ b/lib/stream/builtin/windows/windows.h @@ -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. */ diff --git a/lib/stream/builtin/windows/write.c b/lib/stream/builtin/windows/write.c index 6092959..6b47ce4 100644 --- a/lib/stream/builtin/windows/write.c +++ b/lib/stream/builtin/windows/write.c @@ -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 diff --git a/lib/stream/write.c b/lib/stream/write.c index 128a8ed..4f0be6e 100644 --- a/lib/stream/write.c +++ b/lib/stream/write.c @@ -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); }