diff --git a/src/sftp/sftp.h b/src/sftp/sftp.h index d62b646594f3c25fe2f84693383a5687745d64ec..8ce4535e7cc40f004647d2cfaa5f6b82ee3786f8 100644 --- a/src/sftp/sftp.h +++ b/src/sftp/sftp.h @@ -171,22 +171,7 @@ enum sftp_handle_type { typedef sftp_str_t sftp_filehandle_t; typedef sftp_str_t sftp_dirhandle_t; -typedef struct sftp_client_state { - bool (*send_cb)(uint8_t *buf, size_t len, void *cb_data); - xpevent_t recv_event; - sftp_rx_pkt_t rxp; - sftp_tx_pkt_t txp; - void *cb_data; - sftp_str_t err_msg; - sftp_str_t err_lang; - pthread_mutex_t mtx; - uint32_t version; - uint32_t running; - uint32_t id; - uint32_t err_id; - uint32_t err_code; - bool terminating; -} *sftpc_state_t; +typedef struct sftp_client_state *sftpc_state_t; typedef struct sftp_server_state { bool (*send_cb)(uint8_t *buf, size_t len, void *cb_data); @@ -264,6 +249,7 @@ bool sftpc_close(sftpc_state_t state, sftp_filehandle_t *handle); bool sftpc_read(sftpc_state_t state, sftp_filehandle_t handle, uint64_t offset, uint32_t len, sftp_str_t *ret); bool sftpc_write(sftpc_state_t state, sftp_filehandle_t handle, uint64_t offset, sftp_str_t data); bool sftpc_reclaim(sftpc_state_t state); +uint32_t sftpc_get_err(sftpc_state_t state); /* sftp_attr.c */ sftp_file_attr_t sftp_fattr_alloc(void); diff --git a/src/sftp/sftp_client.c b/src/sftp/sftp_client.c index bb2ba791527ead7d44fd8e6b8b12b4764937b182..43ed048d2698aa17e5cd770b25cc3c22ce4599af 100644 --- a/src/sftp/sftp_client.c +++ b/src/sftp/sftp_client.c @@ -5,6 +5,23 @@ #include "sftp.h" +typedef struct sftp_client_state { + bool (*send_cb)(uint8_t *buf, size_t len, void *cb_data); + xpevent_t recv_event; + sftp_rx_pkt_t rxp; + sftp_tx_pkt_t txp; + void *cb_data; + sftp_str_t err_msg; + sftp_str_t err_lang; + pthread_mutex_t mtx; + uint32_t version; + uint32_t running; + uint32_t id; + uint32_t err_id; + uint32_t err_code; + bool terminating; +} *sftpc_state_t; + #define SFTP_STATIC_TYPE sftpc_state_t #include "sftp_static.h" #undef SFTP_STATIC_TYPE @@ -367,3 +384,14 @@ sftpc_reclaim(sftpc_state_t state) ret = sftp_rx_pkt_reclaim(&state->rxp) && ret; return ret; } + +uint32_t +sftpc_get_err(sftpc_state_t state) +{ + uint32_t ret = SSH_FX_FAILURE; + if (!enter_function(state)) + return ret; + ret = state->err_code; + exit_function(state, true); + return ret; +} diff --git a/src/syncterm/ssh.c b/src/syncterm/ssh.c index 72e700991659633d22e5b5f060397f6d0cefd48d..aa4d73a7be9919a96610740789f246395d921f52 100644 --- a/src/syncterm/ssh.c +++ b/src/syncterm/ssh.c @@ -466,12 +466,8 @@ key_not_present(sftp_filehandle_t f, const char *priv) } if (!sftpc_read(sftp_state, f, off, (bufsz - bufpos > 1024) ? 1024 : bufsz - bufpos, &r)) { free(buf); - pthread_mutex_lock(&ssh_mutex); - if (sftp_state->err_code == SSH_FX_EOF) { - pthread_mutex_unlock(&ssh_mutex); + if (sftpc_get_err(sftp_state) == SSH_FX_EOF) return true; - } - pthread_mutex_unlock(&ssh_mutex); return false; } memcpy(&buf[bufpos], r->c_str, r->len);