+/**
+ * Do a non-blocking read of up to the allocated length, and
+ * check if a timeout has occured.
+ *
+ * @param scpi Previously initialised SCPI device structure.
+ * @param response Buffer to which the response is appended.
+ * @param abs_timeout_us Absolute timeout in microseconds
+ *
+ * @return read length on success, SR_ERR* on failure.
+ */
+SR_PRIV int sr_scpi_read_response(struct sr_scpi_dev_inst *scpi,
+ GString *response, gint64 abs_timeout_us)
+{
+ int len, space;
+
+ space = response->allocated_len - response->len;
+ len = sr_scpi_read_data(scpi, &response->str[response->len], space);
+
+ if (len < 0) {
+ sr_err("Incompletely read SCPI response.");
+ return SR_ERR;
+ }
+
+ if (len > 0) {
+ g_string_set_size(response, response->len + len);
+ return len;
+ }
+
+ if (g_get_monotonic_time() > abs_timeout_us) {
+ sr_err("Timed out waiting for SCPI response.");
+ return SR_ERR_TIMEOUT;
+ }
+
+ return 0;
+}
+