Add ssh_get_poll_flags()
For integration with an external mainloop, we need to know how to replicate libssh's internal poll() calls. We originally through ssh_get_status() was that API, but it's not really - those flags only get updated from the *result* of a poll(), where what we really need is to know how libssh would *start* a poll(). Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
Этот коммит содержится в:
родитель
a8dc67ded8
Коммит
4cc7f4ad03
@ -429,6 +429,7 @@ SSH_DEPRECATED LIBSSH_API int ssh_get_pubkey_hash(ssh_session session, unsigned
|
|||||||
LIBSSH_API int ssh_get_random(void *where,int len,int strong);
|
LIBSSH_API int ssh_get_random(void *where,int len,int strong);
|
||||||
LIBSSH_API int ssh_get_version(ssh_session session);
|
LIBSSH_API int ssh_get_version(ssh_session session);
|
||||||
LIBSSH_API int ssh_get_status(ssh_session session);
|
LIBSSH_API int ssh_get_status(ssh_session session);
|
||||||
|
LIBSSH_API int ssh_get_poll_flags(ssh_session session);
|
||||||
LIBSSH_API int ssh_init(void);
|
LIBSSH_API int ssh_init(void);
|
||||||
LIBSSH_API int ssh_is_blocking(ssh_session session);
|
LIBSSH_API int ssh_is_blocking(ssh_session session);
|
||||||
LIBSSH_API int ssh_is_connected(ssh_session session);
|
LIBSSH_API int ssh_is_connected(ssh_session session);
|
||||||
|
@ -52,6 +52,7 @@ void ssh_socket_set_write_wontblock(ssh_socket s);
|
|||||||
void ssh_socket_set_read_wontblock(ssh_socket s);
|
void ssh_socket_set_read_wontblock(ssh_socket s);
|
||||||
void ssh_socket_set_except(ssh_socket s);
|
void ssh_socket_set_except(ssh_socket s);
|
||||||
int ssh_socket_get_status(ssh_socket s);
|
int ssh_socket_get_status(ssh_socket s);
|
||||||
|
int ssh_socket_get_poll_flags(ssh_socket s);
|
||||||
int ssh_socket_buffered_write_bytes(ssh_socket s);
|
int ssh_socket_buffered_write_bytes(ssh_socket s);
|
||||||
int ssh_socket_data_available(ssh_socket s);
|
int ssh_socket_data_available(ssh_socket s);
|
||||||
int ssh_socket_data_writable(ssh_socket s);
|
int ssh_socket_data_writable(ssh_socket s);
|
||||||
|
@ -607,6 +607,25 @@ int ssh_get_status(ssh_session session) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get poll flags for an external mainloop
|
||||||
|
*
|
||||||
|
* @param session The ssh session to use.
|
||||||
|
*
|
||||||
|
* @returns A bitmask including SSH_READ_PENDING or SSH_WRITE_PENDING.
|
||||||
|
* For SSH_READ_PENDING, your invocation of poll() should include
|
||||||
|
* POLLIN. For SSH_WRITE_PENDING, your invocation of poll() should
|
||||||
|
* include POLLOUT.
|
||||||
|
*/
|
||||||
|
int ssh_get_poll_flags(ssh_session session)
|
||||||
|
{
|
||||||
|
if (session == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ssh_socket_get_poll_flags (session->socket);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the disconnect message from the server.
|
* @brief Get the disconnect message from the server.
|
||||||
*
|
*
|
||||||
|
11
src/socket.c
11
src/socket.c
@ -710,6 +710,17 @@ int ssh_socket_get_status(ssh_socket s) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ssh_socket_get_poll_flags(ssh_socket s) {
|
||||||
|
int r = 0;
|
||||||
|
if (s->poll_in != NULL && (ssh_poll_get_events (s->poll_in) & POLLIN) > 0) {
|
||||||
|
r |= SSH_READ_PENDING;
|
||||||
|
}
|
||||||
|
if (s->poll_out != NULL && (ssh_poll_get_events (s->poll_out) & POLLOUT) > 0) {
|
||||||
|
r |= SSH_WRITE_PENDING;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
int ssh_socket_set_nonblocking(socket_t fd) {
|
int ssh_socket_set_nonblocking(socket_t fd) {
|
||||||
u_long nonblocking = 1;
|
u_long nonblocking = 1;
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user