/**
* Wait for buffered data to be transmitted.
*
+ * @warning If your program runs on Unix, defines its own signal handlers, and
+ * needs to abort draining the output buffer when when these are
+ * called, then you should not use this function. It repeats system
+ * calls that return with EINTR. To be able to abort a drain from a
+ * signal handler, you would need to implement your own blocking
+ * drain by polling the result of sp_output_waiting().
+ *
* @param port Pointer to port structure.
*
* @return SP_OK upon success, a negative error code otherwise.
/* Returns non-zero upon success, 0 upon failure. */
if (FlushFileBuffers(port->hdl) == 0)
RETURN_FAIL("FlushFileBuffers() failed");
+ RETURN_OK();
#else
- /* Returns 0 upon success, -1 upon failure. */
- if (tcdrain(port->fd) < 0)
- RETURN_FAIL("tcdrain() failed");
+ int result;
+ while (1) {
+ result = tcdrain(port->fd);
+ if (result < 0) {
+ if (errno == EINTR) {
+ DEBUG("tcdrain() was interrupted");
+ continue;
+ } else {
+ RETURN_FAIL("tcdrain() failed");
+ }
+ } else {
+ RETURN_OK();
+ }
+ }
#endif
-
- RETURN_OK();
}
enum sp_return sp_blocking_write(struct sp_port *port, const void *buf, size_t count, unsigned int timeout)