mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-11-29 01:03:57 +03:00
Reformat most of the function headers
Signed-off-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org>
This commit is contained in:
committed by
Andreas Schneider
parent
daabd78742
commit
2aa137947a
66
src/auth.c
66
src/auth.c
@@ -66,7 +66,8 @@
|
|||||||
* @returns SSH_AGAIN on nonblocking mode, if calling that function
|
* @returns SSH_AGAIN on nonblocking mode, if calling that function
|
||||||
* again is necessary
|
* again is necessary
|
||||||
*/
|
*/
|
||||||
static int ssh_userauth_request_service(ssh_session session) {
|
static int ssh_userauth_request_service(ssh_session session)
|
||||||
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = ssh_service_request(session, "ssh-userauth");
|
rc = ssh_service_request(session, "ssh-userauth");
|
||||||
@@ -78,7 +79,8 @@ static int ssh_userauth_request_service(ssh_session session) {
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssh_auth_response_termination(void *user) {
|
static int ssh_auth_response_termination(void *user)
|
||||||
|
{
|
||||||
ssh_session session = (ssh_session)user;
|
ssh_session session = (ssh_session)user;
|
||||||
switch (session->auth.state) {
|
switch (session->auth.state) {
|
||||||
case SSH_AUTH_STATE_NONE:
|
case SSH_AUTH_STATE_NONE:
|
||||||
@@ -139,7 +141,8 @@ static const char *ssh_auth_get_current_method(ssh_session session)
|
|||||||
* SSH_AUTH_AGAIN In nonblocking mode, call has to be made again
|
* SSH_AUTH_AGAIN In nonblocking mode, call has to be made again
|
||||||
* SSH_AUTH_ERROR Error during the process.
|
* SSH_AUTH_ERROR Error during the process.
|
||||||
*/
|
*/
|
||||||
static int ssh_userauth_get_response(ssh_session session) {
|
static int ssh_userauth_get_response(ssh_session session)
|
||||||
|
{
|
||||||
int rc = SSH_AUTH_ERROR;
|
int rc = SSH_AUTH_ERROR;
|
||||||
|
|
||||||
rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_USER,
|
rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_USER,
|
||||||
@@ -403,10 +406,11 @@ int ssh_userauth_list(ssh_session session, const char *username)
|
|||||||
* authentication. The username should only be set with ssh_options_set() only
|
* authentication. The username should only be set with ssh_options_set() only
|
||||||
* before you connect to the server.
|
* before you connect to the server.
|
||||||
*/
|
*/
|
||||||
int ssh_userauth_none(ssh_session session, const char *username) {
|
int ssh_userauth_none(ssh_session session, const char *username)
|
||||||
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
switch(session->pending_call_state) {
|
switch (session->pending_call_state) {
|
||||||
case SSH_PENDING_CALL_NONE:
|
case SSH_PENDING_CALL_NONE:
|
||||||
break;
|
break;
|
||||||
case SSH_PENDING_CALL_AUTH_NONE:
|
case SSH_PENDING_CALL_AUTH_NONE:
|
||||||
@@ -865,7 +869,8 @@ struct ssh_agent_state_struct {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Internal function */
|
/* Internal function */
|
||||||
void ssh_agent_state_free(void *data) {
|
void ssh_agent_state_free(void *data)
|
||||||
|
{
|
||||||
struct ssh_agent_state_struct *state = data;
|
struct ssh_agent_state_struct *state = data;
|
||||||
|
|
||||||
if (state) {
|
if (state) {
|
||||||
@@ -898,7 +903,8 @@ void ssh_agent_state_free(void *data) {
|
|||||||
* before you connect to the server.
|
* before you connect to the server.
|
||||||
*/
|
*/
|
||||||
int ssh_userauth_agent(ssh_session session,
|
int ssh_userauth_agent(ssh_session session,
|
||||||
const char *username) {
|
const char *username)
|
||||||
|
{
|
||||||
int rc = SSH_AUTH_ERROR;
|
int rc = SSH_AUTH_ERROR;
|
||||||
struct ssh_agent_state_struct *state;
|
struct ssh_agent_state_struct *state;
|
||||||
|
|
||||||
@@ -1326,10 +1332,11 @@ int ssh_userauth_publickey_auto(ssh_session session,
|
|||||||
*/
|
*/
|
||||||
int ssh_userauth_password(ssh_session session,
|
int ssh_userauth_password(ssh_session session,
|
||||||
const char *username,
|
const char *username,
|
||||||
const char *password) {
|
const char *password)
|
||||||
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
switch(session->pending_call_state) {
|
switch (session->pending_call_state) {
|
||||||
case SSH_PENDING_CALL_NONE:
|
case SSH_PENDING_CALL_NONE:
|
||||||
break;
|
break;
|
||||||
case SSH_PENDING_CALL_AUTH_PASSWORD:
|
case SSH_PENDING_CALL_AUTH_PASSWORD:
|
||||||
@@ -1417,7 +1424,8 @@ int ssh_userauth_agent_pubkey(ssh_session session,
|
|||||||
}
|
}
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
ssh_kbdint ssh_kbdint_new(void) {
|
ssh_kbdint ssh_kbdint_new(void)
|
||||||
|
{
|
||||||
ssh_kbdint kbd;
|
ssh_kbdint kbd;
|
||||||
|
|
||||||
kbd = calloc(1, sizeof(struct ssh_kbdint_struct));
|
kbd = calloc(1, sizeof(struct ssh_kbdint_struct));
|
||||||
@@ -1429,7 +1437,8 @@ ssh_kbdint ssh_kbdint_new(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ssh_kbdint_free(ssh_kbdint kbd) {
|
void ssh_kbdint_free(ssh_kbdint kbd)
|
||||||
|
{
|
||||||
size_t i, n;
|
size_t i, n;
|
||||||
|
|
||||||
if (kbd == NULL) {
|
if (kbd == NULL) {
|
||||||
@@ -1465,7 +1474,8 @@ void ssh_kbdint_free(ssh_kbdint kbd) {
|
|||||||
SAFE_FREE(kbd);
|
SAFE_FREE(kbd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ssh_kbdint_clean(ssh_kbdint kbd) {
|
void ssh_kbdint_clean(ssh_kbdint kbd)
|
||||||
|
{
|
||||||
size_t i, n;
|
size_t i, n;
|
||||||
|
|
||||||
if (kbd == NULL) {
|
if (kbd == NULL) {
|
||||||
@@ -1743,7 +1753,8 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_info_request) {
|
|||||||
* @see ssh_userauth_kbdint_setanswer()
|
* @see ssh_userauth_kbdint_setanswer()
|
||||||
*/
|
*/
|
||||||
int ssh_userauth_kbdint(ssh_session session, const char *user,
|
int ssh_userauth_kbdint(ssh_session session, const char *user,
|
||||||
const char *submethods) {
|
const char *submethods)
|
||||||
|
{
|
||||||
int rc = SSH_AUTH_ERROR;
|
int rc = SSH_AUTH_ERROR;
|
||||||
|
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
@@ -1785,7 +1796,8 @@ int ssh_userauth_kbdint(ssh_session session, const char *user,
|
|||||||
*
|
*
|
||||||
* @returns The number of prompts.
|
* @returns The number of prompts.
|
||||||
*/
|
*/
|
||||||
int ssh_userauth_kbdint_getnprompts(ssh_session session) {
|
int ssh_userauth_kbdint_getnprompts(ssh_session session)
|
||||||
|
{
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
@@ -1807,7 +1819,8 @@ int ssh_userauth_kbdint_getnprompts(ssh_session session) {
|
|||||||
*
|
*
|
||||||
* @returns The name of the message block. Do not free it.
|
* @returns The name of the message block. Do not free it.
|
||||||
*/
|
*/
|
||||||
const char *ssh_userauth_kbdint_getname(ssh_session session) {
|
const char *ssh_userauth_kbdint_getname(ssh_session session)
|
||||||
|
{
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -1830,7 +1843,8 @@ const char *ssh_userauth_kbdint_getname(ssh_session session) {
|
|||||||
* @returns The instruction of the message block.
|
* @returns The instruction of the message block.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const char *ssh_userauth_kbdint_getinstruction(ssh_session session) {
|
const char *ssh_userauth_kbdint_getinstruction(ssh_session session)
|
||||||
|
{
|
||||||
if (session == NULL)
|
if (session == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (session->kbdint == NULL) {
|
if (session->kbdint == NULL) {
|
||||||
@@ -1865,8 +1879,9 @@ const char *ssh_userauth_kbdint_getinstruction(ssh_session session) {
|
|||||||
* if (echo) ...
|
* if (echo) ...
|
||||||
* @endcode
|
* @endcode
|
||||||
*/
|
*/
|
||||||
const char *ssh_userauth_kbdint_getprompt(ssh_session session, unsigned int i,
|
const char *
|
||||||
char *echo) {
|
ssh_userauth_kbdint_getprompt(ssh_session session, unsigned int i, char *echo)
|
||||||
|
{
|
||||||
if (session == NULL)
|
if (session == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (session->kbdint == NULL) {
|
if (session->kbdint == NULL) {
|
||||||
@@ -1893,7 +1908,8 @@ const char *ssh_userauth_kbdint_getprompt(ssh_session session, unsigned int i,
|
|||||||
*
|
*
|
||||||
* @returns The number of answers.
|
* @returns The number of answers.
|
||||||
*/
|
*/
|
||||||
int ssh_userauth_kbdint_getnanswers(ssh_session session) {
|
int ssh_userauth_kbdint_getnanswers(ssh_session session)
|
||||||
|
{
|
||||||
if (session == NULL || session->kbdint == NULL) {
|
if (session == NULL || session->kbdint == NULL) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
@@ -1909,7 +1925,8 @@ int ssh_userauth_kbdint_getnanswers(ssh_session session) {
|
|||||||
*
|
*
|
||||||
* @return 0 on success, < 0 on error.
|
* @return 0 on success, < 0 on error.
|
||||||
*/
|
*/
|
||||||
const char *ssh_userauth_kbdint_getanswer(ssh_session session, unsigned int i) {
|
const char *ssh_userauth_kbdint_getanswer(ssh_session session, unsigned int i)
|
||||||
|
{
|
||||||
if (session == NULL || session->kbdint == NULL
|
if (session == NULL || session->kbdint == NULL
|
||||||
|| session->kbdint->answers == NULL) {
|
|| session->kbdint->answers == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1940,8 +1957,10 @@ const char *ssh_userauth_kbdint_getanswer(ssh_session session, unsigned int i) {
|
|||||||
*
|
*
|
||||||
* @return 0 on success, < 0 on error.
|
* @return 0 on success, < 0 on error.
|
||||||
*/
|
*/
|
||||||
int ssh_userauth_kbdint_setanswer(ssh_session session, unsigned int i,
|
int
|
||||||
const char *answer) {
|
ssh_userauth_kbdint_setanswer(ssh_session session, unsigned int i,
|
||||||
|
const char *answer)
|
||||||
|
{
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -1987,7 +2006,8 @@ int ssh_userauth_kbdint_setanswer(ssh_session session, unsigned int i,
|
|||||||
* SSH_AUTH_AGAIN: In nonblocking mode, you've got to call this again
|
* SSH_AUTH_AGAIN: In nonblocking mode, you've got to call this again
|
||||||
* later.
|
* later.
|
||||||
*/
|
*/
|
||||||
int ssh_userauth_gssapi(ssh_session session) {
|
int ssh_userauth_gssapi(ssh_session session)
|
||||||
|
{
|
||||||
int rc = SSH_AUTH_DENIED;
|
int rc = SSH_AUTH_DENIED;
|
||||||
#ifdef WITH_GSSAPI
|
#ifdef WITH_GSSAPI
|
||||||
switch(session->pending_call_state) {
|
switch(session->pending_call_state) {
|
||||||
|
|||||||
187
src/channels.c
187
src/channels.c
@@ -151,7 +151,8 @@ ssh_channel ssh_channel_new(ssh_session session)
|
|||||||
*
|
*
|
||||||
* @return The new channel identifier.
|
* @return The new channel identifier.
|
||||||
*/
|
*/
|
||||||
uint32_t ssh_channel_new_id(ssh_session session) {
|
uint32_t ssh_channel_new_id(ssh_session session)
|
||||||
|
{
|
||||||
return ++(session->maxchannel);
|
return ++(session->maxchannel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,7 +268,8 @@ error:
|
|||||||
return SSH_PACKET_USED;
|
return SSH_PACKET_USED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssh_channel_open_termination(void *c){
|
static int ssh_channel_open_termination(void *c)
|
||||||
|
{
|
||||||
ssh_channel channel = (ssh_channel) c;
|
ssh_channel channel = (ssh_channel) c;
|
||||||
if (channel->state != SSH_CHANNEL_STATE_OPENING ||
|
if (channel->state != SSH_CHANNEL_STATE_OPENING ||
|
||||||
channel->session->session_state == SSH_SESSION_STATE_ERROR)
|
channel->session->session_state == SSH_SESSION_STATE_ERROR)
|
||||||
@@ -414,7 +416,7 @@ static int grow_window(ssh_session session,
|
|||||||
uint32_t new_window = minimumsize > WINDOWBASE ? minimumsize : WINDOWBASE;
|
uint32_t new_window = minimumsize > WINDOWBASE ? minimumsize : WINDOWBASE;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if(new_window <= channel->local_window){
|
if (new_window <= channel->local_window) {
|
||||||
SSH_LOG(SSH_LOG_PROTOCOL,
|
SSH_LOG(SSH_LOG_PROTOCOL,
|
||||||
"growing window (channel %d:%d) to %d bytes : not needed (%d bytes)",
|
"growing window (channel %d:%d) to %d bytes : not needed (%d bytes)",
|
||||||
channel->local_channel, channel->remote_channel, new_window,
|
channel->local_channel, channel->remote_channel, new_window,
|
||||||
@@ -467,7 +469,8 @@ error:
|
|||||||
* @return The related ssh_channel, or NULL if the channel is
|
* @return The related ssh_channel, or NULL if the channel is
|
||||||
* unknown or the packet is invalid.
|
* unknown or the packet is invalid.
|
||||||
*/
|
*/
|
||||||
static ssh_channel channel_from_msg(ssh_session session, ssh_buffer packet) {
|
static ssh_channel channel_from_msg(ssh_session session, ssh_buffer packet)
|
||||||
|
{
|
||||||
ssh_channel channel;
|
ssh_channel channel;
|
||||||
uint32_t chan;
|
uint32_t chan;
|
||||||
int rc;
|
int rc;
|
||||||
@@ -968,8 +971,9 @@ int channel_default_bufferize(ssh_channel channel,
|
|||||||
* @see ssh_channel_request_shell()
|
* @see ssh_channel_request_shell()
|
||||||
* @see ssh_channel_request_exec()
|
* @see ssh_channel_request_exec()
|
||||||
*/
|
*/
|
||||||
int ssh_channel_open_session(ssh_channel channel) {
|
int ssh_channel_open_session(ssh_channel channel)
|
||||||
if(channel == NULL) {
|
{
|
||||||
|
if (channel == NULL) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -995,8 +999,9 @@ int ssh_channel_open_session(ssh_channel channel) {
|
|||||||
*
|
*
|
||||||
* @see ssh_channel_open_forward()
|
* @see ssh_channel_open_forward()
|
||||||
*/
|
*/
|
||||||
int ssh_channel_open_auth_agent(ssh_channel channel){
|
int ssh_channel_open_auth_agent(ssh_channel channel)
|
||||||
if(channel == NULL) {
|
{
|
||||||
|
if (channel == NULL) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1034,13 +1039,14 @@ int ssh_channel_open_auth_agent(ssh_channel channel){
|
|||||||
* use channel_read and channel_write for this.
|
* use channel_read and channel_write for this.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_open_forward(ssh_channel channel, const char *remotehost,
|
int ssh_channel_open_forward(ssh_channel channel, const char *remotehost,
|
||||||
int remoteport, const char *sourcehost, int localport) {
|
int remoteport, const char *sourcehost, int localport)
|
||||||
|
{
|
||||||
ssh_session session;
|
ssh_session session;
|
||||||
ssh_buffer payload = NULL;
|
ssh_buffer payload = NULL;
|
||||||
ssh_string str = NULL;
|
ssh_string str = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
if(channel == NULL) {
|
if (channel == NULL) {
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1387,7 +1393,8 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* this termination function waits for a window growing condition */
|
/* this termination function waits for a window growing condition */
|
||||||
static int ssh_channel_waitwindow_termination(void *c){
|
static int ssh_channel_waitwindow_termination(void *c)
|
||||||
|
{
|
||||||
ssh_channel channel = (ssh_channel) c;
|
ssh_channel channel = (ssh_channel) c;
|
||||||
if (channel->remote_window > 0 ||
|
if (channel->remote_window > 0 ||
|
||||||
channel->session->session_state == SSH_SESSION_STATE_ERROR ||
|
channel->session->session_state == SSH_SESSION_STATE_ERROR ||
|
||||||
@@ -1400,7 +1407,8 @@ static int ssh_channel_waitwindow_termination(void *c){
|
|||||||
/* This termination function waits until the session is not in blocked status
|
/* This termination function waits until the session is not in blocked status
|
||||||
* anymore, e.g. because of a key re-exchange.
|
* anymore, e.g. because of a key re-exchange.
|
||||||
*/
|
*/
|
||||||
static int ssh_waitsession_unblocked(void *s){
|
static int ssh_waitsession_unblocked(void *s)
|
||||||
|
{
|
||||||
ssh_session session = (ssh_session)s;
|
ssh_session session = (ssh_session)s;
|
||||||
switch (session->session_state){
|
switch (session->session_state){
|
||||||
case SSH_SESSION_STATE_DH:
|
case SSH_SESSION_STATE_DH:
|
||||||
@@ -1420,7 +1428,8 @@ static int ssh_waitsession_unblocked(void *s){
|
|||||||
* SSH_ERROR On error.
|
* SSH_ERROR On error.
|
||||||
* SSH_AGAIN Timeout elapsed (or in nonblocking mode).
|
* SSH_AGAIN Timeout elapsed (or in nonblocking mode).
|
||||||
*/
|
*/
|
||||||
int ssh_channel_flush(ssh_channel channel){
|
int ssh_channel_flush(ssh_channel channel)
|
||||||
|
{
|
||||||
return ssh_blocking_flush(channel->session, SSH_TIMEOUT_DEFAULT);
|
return ssh_blocking_flush(channel->session, SSH_TIMEOUT_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1584,7 +1593,8 @@ error:
|
|||||||
* @warning A zero return value means ssh_channel_write (default settings)
|
* @warning A zero return value means ssh_channel_write (default settings)
|
||||||
* will block until the window grows back.
|
* will block until the window grows back.
|
||||||
*/
|
*/
|
||||||
uint32_t ssh_channel_window_size(ssh_channel channel) {
|
uint32_t ssh_channel_window_size(ssh_channel channel)
|
||||||
|
{
|
||||||
return channel->remote_window;
|
return channel->remote_window;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1601,7 +1611,8 @@ uint32_t ssh_channel_window_size(ssh_channel channel) {
|
|||||||
*
|
*
|
||||||
* @see ssh_channel_read()
|
* @see ssh_channel_read()
|
||||||
*/
|
*/
|
||||||
int ssh_channel_write(ssh_channel channel, const void *data, uint32_t len) {
|
int ssh_channel_write(ssh_channel channel, const void *data, uint32_t len)
|
||||||
|
{
|
||||||
return channel_write_common(channel, data, len, 0);
|
return channel_write_common(channel, data, len, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1614,8 +1625,9 @@ int ssh_channel_write(ssh_channel channel, const void *data, uint32_t len) {
|
|||||||
*
|
*
|
||||||
* @see ssh_channel_is_closed()
|
* @see ssh_channel_is_closed()
|
||||||
*/
|
*/
|
||||||
int ssh_channel_is_open(ssh_channel channel) {
|
int ssh_channel_is_open(ssh_channel channel)
|
||||||
if(channel == NULL) {
|
{
|
||||||
|
if (channel == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return (channel->state == SSH_CHANNEL_STATE_OPEN && channel->session->alive != 0);
|
return (channel->state == SSH_CHANNEL_STATE_OPEN && channel->session->alive != 0);
|
||||||
@@ -1630,8 +1642,9 @@ int ssh_channel_is_open(ssh_channel channel) {
|
|||||||
*
|
*
|
||||||
* @see ssh_channel_is_open()
|
* @see ssh_channel_is_open()
|
||||||
*/
|
*/
|
||||||
int ssh_channel_is_closed(ssh_channel channel) {
|
int ssh_channel_is_closed(ssh_channel channel)
|
||||||
if(channel == NULL) {
|
{
|
||||||
|
if (channel == NULL) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
return (channel->state != SSH_CHANNEL_STATE_OPEN || channel->session->alive == 0);
|
return (channel->state != SSH_CHANNEL_STATE_OPEN || channel->session->alive == 0);
|
||||||
@@ -1644,8 +1657,9 @@ int ssh_channel_is_closed(ssh_channel channel) {
|
|||||||
*
|
*
|
||||||
* @return 0 if there is no EOF, nonzero otherwise.
|
* @return 0 if there is no EOF, nonzero otherwise.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_is_eof(ssh_channel channel) {
|
int ssh_channel_is_eof(ssh_channel channel)
|
||||||
if(channel == NULL) {
|
{
|
||||||
|
if (channel == NULL) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
if (ssh_channel_has_unread_data(channel)) {
|
if (ssh_channel_has_unread_data(channel)) {
|
||||||
@@ -1666,11 +1680,12 @@ int ssh_channel_is_eof(ssh_channel channel) {
|
|||||||
* in non-blocking mode.
|
* in non-blocking mode.
|
||||||
* @see ssh_set_blocking()
|
* @see ssh_set_blocking()
|
||||||
*/
|
*/
|
||||||
void ssh_channel_set_blocking(ssh_channel channel, int blocking) {
|
void ssh_channel_set_blocking(ssh_channel channel, int blocking)
|
||||||
if(channel == NULL) {
|
{
|
||||||
|
if (channel == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ssh_set_blocking(channel->session,blocking);
|
ssh_set_blocking(channel->session, blocking);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1734,7 +1749,8 @@ SSH_PACKET_CALLBACK(ssh_packet_channel_failure){
|
|||||||
return SSH_PACKET_USED;
|
return SSH_PACKET_USED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssh_channel_request_termination(void *c){
|
static int ssh_channel_request_termination(void *c)
|
||||||
|
{
|
||||||
ssh_channel channel = (ssh_channel)c;
|
ssh_channel channel = (ssh_channel)c;
|
||||||
if(channel->request_state != SSH_CHANNEL_REQ_STATE_PENDING ||
|
if(channel->request_state != SSH_CHANNEL_REQ_STATE_PENDING ||
|
||||||
channel->session->session_state == SSH_SESSION_STATE_ERROR)
|
channel->session->session_state == SSH_SESSION_STATE_ERROR)
|
||||||
@@ -1744,7 +1760,8 @@ static int ssh_channel_request_termination(void *c){
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int channel_request(ssh_channel channel, const char *request,
|
static int channel_request(ssh_channel channel, const char *request,
|
||||||
ssh_buffer buffer, int reply) {
|
ssh_buffer buffer, int reply)
|
||||||
|
{
|
||||||
ssh_session session = channel->session;
|
ssh_session session = channel->session;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -1844,7 +1861,8 @@ error:
|
|||||||
* to be done again.
|
* to be done again.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_pty_size(ssh_channel channel, const char *terminal,
|
int ssh_channel_request_pty_size(ssh_channel channel, const char *terminal,
|
||||||
int col, int row) {
|
int col, int row)
|
||||||
|
{
|
||||||
ssh_session session;
|
ssh_session session;
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
@@ -1906,7 +1924,8 @@ error:
|
|||||||
*
|
*
|
||||||
* @see ssh_channel_request_pty_size()
|
* @see ssh_channel_request_pty_size()
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_pty(ssh_channel channel) {
|
int ssh_channel_request_pty(ssh_channel channel)
|
||||||
|
{
|
||||||
return ssh_channel_request_pty_size(channel, "xterm", 80, 24);
|
return ssh_channel_request_pty_size(channel, "xterm", 80, 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1925,7 +1944,8 @@ int ssh_channel_request_pty(ssh_channel channel) {
|
|||||||
* libssh function using the same channel/session is running at the
|
* libssh function using the same channel/session is running at the
|
||||||
* same time (not 100% threadsafe).
|
* same time (not 100% threadsafe).
|
||||||
*/
|
*/
|
||||||
int ssh_channel_change_pty_size(ssh_channel channel, int cols, int rows) {
|
int ssh_channel_change_pty_size(ssh_channel channel, int cols, int rows)
|
||||||
|
{
|
||||||
ssh_session session = channel->session;
|
ssh_session session = channel->session;
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
@@ -1964,8 +1984,9 @@ error:
|
|||||||
* SSH_AGAIN if in nonblocking mode and call has
|
* SSH_AGAIN if in nonblocking mode and call has
|
||||||
* to be done again.
|
* to be done again.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_shell(ssh_channel channel) {
|
int ssh_channel_request_shell(ssh_channel channel)
|
||||||
if(channel == NULL) {
|
{
|
||||||
|
if (channel == NULL) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1986,7 +2007,8 @@ int ssh_channel_request_shell(ssh_channel channel) {
|
|||||||
*
|
*
|
||||||
* @warning You normally don't have to call it for sftp, see sftp_new().
|
* @warning You normally don't have to call it for sftp, see sftp_new().
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_subsystem(ssh_channel channel, const char *subsys) {
|
int ssh_channel_request_subsystem(ssh_channel channel, const char *subsys)
|
||||||
|
{
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
@@ -2035,14 +2057,16 @@ error:
|
|||||||
*
|
*
|
||||||
* @note You should use sftp_new() which does this for you.
|
* @note You should use sftp_new() which does this for you.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_sftp( ssh_channel channel){
|
int ssh_channel_request_sftp( ssh_channel channel)
|
||||||
|
{
|
||||||
if(channel == NULL) {
|
if(channel == NULL) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
return ssh_channel_request_subsystem(channel, "sftp");
|
return ssh_channel_request_subsystem(channel, "sftp");
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *generate_cookie(void) {
|
static char *generate_cookie(void)
|
||||||
|
{
|
||||||
static const char *hex = "0123456789abcdef";
|
static const char *hex = "0123456789abcdef";
|
||||||
char s[36];
|
char s[36];
|
||||||
unsigned char rnd[16];
|
unsigned char rnd[16];
|
||||||
@@ -2088,7 +2112,8 @@ static char *generate_cookie(void) {
|
|||||||
* to be done again.
|
* to be done again.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_x11(ssh_channel channel, int single_connection, const char *protocol,
|
int ssh_channel_request_x11(ssh_channel channel, int single_connection, const char *protocol,
|
||||||
const char *cookie, int screen_number) {
|
const char *cookie, int screen_number)
|
||||||
|
{
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
char *c = NULL;
|
char *c = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
@@ -2139,7 +2164,8 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ssh_channel ssh_channel_accept(ssh_session session, int channeltype,
|
static ssh_channel ssh_channel_accept(ssh_session session, int channeltype,
|
||||||
int timeout_ms, int *destination_port, char **originator, int *originator_port) {
|
int timeout_ms, int *destination_port, char **originator, int *originator_port)
|
||||||
|
{
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
static const struct timespec ts = {
|
static const struct timespec ts = {
|
||||||
.tv_sec = 0,
|
.tv_sec = 0,
|
||||||
@@ -2209,7 +2235,8 @@ static ssh_channel ssh_channel_accept(ssh_session session, int channeltype,
|
|||||||
* @return A newly created channel, or NULL if no X11 request from
|
* @return A newly created channel, or NULL if no X11 request from
|
||||||
* the server.
|
* the server.
|
||||||
*/
|
*/
|
||||||
ssh_channel ssh_channel_accept_x11(ssh_channel channel, int timeout_ms) {
|
ssh_channel ssh_channel_accept_x11(ssh_channel channel, int timeout_ms)
|
||||||
|
{
|
||||||
return ssh_channel_accept(channel->session, SSH_CHANNEL_X11, timeout_ms, NULL, NULL, NULL);
|
return ssh_channel_accept(channel->session, SSH_CHANNEL_X11, timeout_ms, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2279,7 +2306,8 @@ SSH_PACKET_CALLBACK(ssh_request_denied){
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssh_global_request_termination(void *s){
|
static int ssh_global_request_termination(void *s)
|
||||||
|
{
|
||||||
ssh_session session = (ssh_session) s;
|
ssh_session session = (ssh_session) s;
|
||||||
if (session->global_req_state != SSH_CHANNEL_REQ_STATE_PENDING ||
|
if (session->global_req_state != SSH_CHANNEL_REQ_STATE_PENDING ||
|
||||||
session->session_state == SSH_SESSION_STATE_ERROR)
|
session->session_state == SSH_SESSION_STATE_ERROR)
|
||||||
@@ -2458,12 +2486,14 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* DEPRECATED */
|
/* DEPRECATED */
|
||||||
int ssh_forward_listen(ssh_session session, const char *address, int port, int *bound_port) {
|
int ssh_forward_listen(ssh_session session, const char *address, int port, int *bound_port)
|
||||||
|
{
|
||||||
return ssh_channel_listen_forward(session, address, port, bound_port);
|
return ssh_channel_listen_forward(session, address, port, bound_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DEPRECATED */
|
/* DEPRECATED */
|
||||||
ssh_channel ssh_forward_accept(ssh_session session, int timeout_ms) {
|
ssh_channel ssh_forward_accept(ssh_session session, int timeout_ms)
|
||||||
|
{
|
||||||
return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms, NULL, NULL, NULL);
|
return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2553,7 +2583,8 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* DEPRECATED */
|
/* DEPRECATED */
|
||||||
int ssh_forward_cancel(ssh_session session, const char *address, int port) {
|
int ssh_forward_cancel(ssh_session session, const char *address, int port)
|
||||||
|
{
|
||||||
return ssh_channel_cancel_forward(session, address, port);
|
return ssh_channel_cancel_forward(session, address, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2572,7 +2603,8 @@ int ssh_forward_cancel(ssh_session session, const char *address, int port) {
|
|||||||
* to be done again.
|
* to be done again.
|
||||||
* @warning Some environment variables may be refused by security reasons.
|
* @warning Some environment variables may be refused by security reasons.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_env(ssh_channel channel, const char *name, const char *value) {
|
int ssh_channel_request_env(ssh_channel channel, const char *name, const char *value)
|
||||||
|
{
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
@@ -2642,7 +2674,8 @@ error:
|
|||||||
*
|
*
|
||||||
* @see ssh_channel_request_shell()
|
* @see ssh_channel_request_shell()
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_exec(ssh_channel channel, const char *cmd) {
|
int ssh_channel_request_exec(ssh_channel channel, const char *cmd)
|
||||||
|
{
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
@@ -2707,14 +2740,15 @@ error:
|
|||||||
*
|
*
|
||||||
* @return SSH_OK on success, SSH_ERROR if an error occurred.
|
* @return SSH_OK on success, SSH_ERROR if an error occurred.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_send_signal(ssh_channel channel, const char *sig) {
|
int ssh_channel_request_send_signal(ssh_channel channel, const char *sig)
|
||||||
|
{
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
if(channel == NULL) {
|
if (channel == NULL) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
if(sig == NULL) {
|
if (sig == NULL) {
|
||||||
ssh_set_error_invalid(channel->session);
|
ssh_set_error_invalid(channel->session);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@@ -2751,7 +2785,8 @@ error:
|
|||||||
*
|
*
|
||||||
* @return SSH_OK on success, SSH_ERROR if an error occurred
|
* @return SSH_OK on success, SSH_ERROR if an error occurred
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_send_break(ssh_channel channel, uint32_t length) {
|
int ssh_channel_request_send_break(ssh_channel channel, uint32_t length)
|
||||||
|
{
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
@@ -2784,7 +2819,7 @@ error:
|
|||||||
*
|
*
|
||||||
* @param[in] channel The channel to read from.
|
* @param[in] channel The channel to read from.
|
||||||
*
|
*
|
||||||
* @param[in] buffer The buffer which will get the data.
|
* @param[out] buffer The buffer which will get the data.
|
||||||
*
|
*
|
||||||
* @param[in] count The count of bytes to be read. If it is bigger than 0,
|
* @param[in] count The count of bytes to be read. If it is bigger than 0,
|
||||||
* the exact size will be read, else (bytes=0) it will
|
* the exact size will be read, else (bytes=0) it will
|
||||||
@@ -2799,7 +2834,8 @@ error:
|
|||||||
* @see ssh_channel_read
|
* @see ssh_channel_read
|
||||||
*/
|
*/
|
||||||
int channel_read_buffer(ssh_channel channel, ssh_buffer buffer, uint32_t count,
|
int channel_read_buffer(ssh_channel channel, ssh_buffer buffer, uint32_t count,
|
||||||
int is_stderr) {
|
int is_stderr)
|
||||||
|
{
|
||||||
ssh_session session;
|
ssh_session session;
|
||||||
char *buffer_tmp = NULL;
|
char *buffer_tmp = NULL;
|
||||||
int r;
|
int r;
|
||||||
@@ -2874,7 +2910,8 @@ struct ssh_channel_read_termination_struct {
|
|||||||
ssh_buffer buffer;
|
ssh_buffer buffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ssh_channel_read_termination(void *s){
|
static int ssh_channel_read_termination(void *s)
|
||||||
|
{
|
||||||
struct ssh_channel_read_termination_struct *ctx = s;
|
struct ssh_channel_read_termination_struct *ctx = s;
|
||||||
if (ssh_buffer_get_len(ctx->buffer) >= ctx->count ||
|
if (ssh_buffer_get_len(ctx->buffer) >= ctx->count ||
|
||||||
ctx->channel->remote_eof ||
|
ctx->channel->remote_eof ||
|
||||||
@@ -2891,14 +2928,14 @@ static int ssh_channel_read_termination(void *s){
|
|||||||
*
|
*
|
||||||
* @param[in] channel The channel to read from.
|
* @param[in] channel The channel to read from.
|
||||||
*
|
*
|
||||||
* @param[in] dest The destination buffer which will get the data.
|
* @param[out] dest The destination buffer which will get the data.
|
||||||
*
|
*
|
||||||
* @param[in] count The count of bytes to be read.
|
* @param[in] count The count of bytes to be read.
|
||||||
*
|
*
|
||||||
* @param[in] is_stderr A boolean value to mark reading from the stderr flow.
|
* @param[in] is_stderr A boolean value to mark reading from the stderr flow.
|
||||||
*
|
*
|
||||||
* @return The number of bytes read, 0 on end of file or SSH_ERROR
|
* @return The number of bytes read, 0 on end of file or SSH_ERROR
|
||||||
* on error. In nonblocking mode it Can return 0 if no data
|
* on error. In nonblocking mode it can return 0 if no data
|
||||||
* is available or SSH_AGAIN.
|
* is available or SSH_AGAIN.
|
||||||
*
|
*
|
||||||
* @warning This function may return less than count bytes of data, and won't
|
* @warning This function may return less than count bytes of data, and won't
|
||||||
@@ -2920,7 +2957,7 @@ int ssh_channel_read(ssh_channel channel, void *dest, uint32_t count, int is_std
|
|||||||
*
|
*
|
||||||
* @param[in] channel The channel to read from.
|
* @param[in] channel The channel to read from.
|
||||||
*
|
*
|
||||||
* @param[in] dest The destination buffer which will get the data.
|
* @param[out] dest The destination buffer which will get the data.
|
||||||
*
|
*
|
||||||
* @param[in] count The count of bytes to be read.
|
* @param[in] count The count of bytes to be read.
|
||||||
*
|
*
|
||||||
@@ -3050,7 +3087,7 @@ int ssh_channel_read_timeout(ssh_channel channel,
|
|||||||
*
|
*
|
||||||
* @param[in] channel The channel to read from.
|
* @param[in] channel The channel to read from.
|
||||||
*
|
*
|
||||||
* @param[in] dest A pointer to a destination buffer.
|
* @param[out] dest A pointer to a destination buffer.
|
||||||
*
|
*
|
||||||
* @param[in] count The count of bytes of data to be read.
|
* @param[in] count The count of bytes of data to be read.
|
||||||
*
|
*
|
||||||
@@ -3120,7 +3157,8 @@ int ssh_channel_read_nonblocking(ssh_channel channel,
|
|||||||
*
|
*
|
||||||
* @see ssh_channel_is_eof()
|
* @see ssh_channel_is_eof()
|
||||||
*/
|
*/
|
||||||
int ssh_channel_poll(ssh_channel channel, int is_stderr){
|
int ssh_channel_poll(ssh_channel channel, int is_stderr)
|
||||||
|
{
|
||||||
ssh_buffer stdbuf;
|
ssh_buffer stdbuf;
|
||||||
|
|
||||||
if ((channel == NULL) || (channel->flags & SSH_CHANNEL_FLAG_FREED_LOCAL)) {
|
if ((channel == NULL) || (channel->flags & SSH_CHANNEL_FLAG_FREED_LOCAL)) {
|
||||||
@@ -3233,15 +3271,17 @@ out:
|
|||||||
*
|
*
|
||||||
* @return The session pointer.
|
* @return The session pointer.
|
||||||
*/
|
*/
|
||||||
ssh_session ssh_channel_get_session(ssh_channel channel) {
|
ssh_session ssh_channel_get_session(ssh_channel channel)
|
||||||
if(channel == NULL) {
|
{
|
||||||
|
if (channel == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return channel->session;
|
return channel->session;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssh_channel_exit_status_termination(void *c){
|
static int ssh_channel_exit_status_termination(void *c)
|
||||||
|
{
|
||||||
ssh_channel channel = c;
|
ssh_channel channel = c;
|
||||||
if(channel->exit_status != -1 ||
|
if(channel->exit_status != -1 ||
|
||||||
/* When a channel is closed, no exit status message can
|
/* When a channel is closed, no exit status message can
|
||||||
@@ -3271,7 +3311,8 @@ static int ssh_channel_exit_status_termination(void *c){
|
|||||||
*
|
*
|
||||||
* @see ssh_channel_exit_status_callback
|
* @see ssh_channel_exit_status_callback
|
||||||
*/
|
*/
|
||||||
int ssh_channel_get_exit_status(ssh_channel channel) {
|
int ssh_channel_get_exit_status(ssh_channel channel)
|
||||||
|
{
|
||||||
int rc;
|
int rc;
|
||||||
if ((channel == NULL) || (channel->flags & SSH_CHANNEL_FLAG_FREED_LOCAL)) {
|
if ((channel == NULL) || (channel->flags & SSH_CHANNEL_FLAG_FREED_LOCAL)) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
@@ -3295,8 +3336,11 @@ int ssh_channel_get_exit_status(ssh_channel channel) {
|
|||||||
* This is made in two parts: protocol select and network select. The protocol
|
* This is made in two parts: protocol select and network select. The protocol
|
||||||
* select does not use the network functions at all
|
* select does not use the network functions at all
|
||||||
*/
|
*/
|
||||||
static int channel_protocol_select(ssh_channel *rchans, ssh_channel *wchans,
|
static int
|
||||||
ssh_channel *echans, ssh_channel *rout, ssh_channel *wout, ssh_channel *eout) {
|
channel_protocol_select(ssh_channel *rchans, ssh_channel *wchans,
|
||||||
|
ssh_channel *echans, ssh_channel *rout,
|
||||||
|
ssh_channel *wout, ssh_channel *eout)
|
||||||
|
{
|
||||||
ssh_channel chan;
|
ssh_channel chan;
|
||||||
int i;
|
int i;
|
||||||
int j = 0;
|
int j = 0;
|
||||||
@@ -3376,7 +3420,8 @@ static size_t count_ptrs(ssh_channel *ptrs)
|
|||||||
* function, or SSH_ERROR on error.
|
* function, or SSH_ERROR on error.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_select(ssh_channel *readchans, ssh_channel *writechans,
|
int ssh_channel_select(ssh_channel *readchans, ssh_channel *writechans,
|
||||||
ssh_channel *exceptchans, struct timeval * timeout) {
|
ssh_channel *exceptchans, struct timeval * timeout)
|
||||||
|
{
|
||||||
ssh_channel *rchans, *wchans, *echans;
|
ssh_channel *rchans, *wchans, *echans;
|
||||||
ssh_channel dummy = NULL;
|
ssh_channel dummy = NULL;
|
||||||
ssh_event event = NULL;
|
ssh_event event = NULL;
|
||||||
@@ -3510,7 +3555,8 @@ int ssh_channel_select(ssh_channel *readchans, ssh_channel *writechans,
|
|||||||
* @param[in] counter Counter for bytes handled by the channel.
|
* @param[in] counter Counter for bytes handled by the channel.
|
||||||
*/
|
*/
|
||||||
void ssh_channel_set_counter(ssh_channel channel,
|
void ssh_channel_set_counter(ssh_channel channel,
|
||||||
ssh_counter counter) {
|
ssh_counter counter)
|
||||||
|
{
|
||||||
if (channel != NULL) {
|
if (channel != NULL) {
|
||||||
channel->counter = counter;
|
channel->counter = counter;
|
||||||
}
|
}
|
||||||
@@ -3529,7 +3575,8 @@ void ssh_channel_set_counter(ssh_channel channel,
|
|||||||
*
|
*
|
||||||
* @see ssh_channel_read()
|
* @see ssh_channel_read()
|
||||||
*/
|
*/
|
||||||
int ssh_channel_write_stderr(ssh_channel channel, const void *data, uint32_t len) {
|
int ssh_channel_write_stderr(ssh_channel channel, const void *data, uint32_t len)
|
||||||
|
{
|
||||||
return channel_write_common(channel, data, len, 1);
|
return channel_write_common(channel, data, len, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3560,7 +3607,8 @@ int ssh_channel_write_stderr(ssh_channel channel, const void *data, uint32_t len
|
|||||||
* use channel_read and channel_write for this.
|
* use channel_read and channel_write for this.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_open_reverse_forward(ssh_channel channel, const char *remotehost,
|
int ssh_channel_open_reverse_forward(ssh_channel channel, const char *remotehost,
|
||||||
int remoteport, const char *sourcehost, int localport) {
|
int remoteport, const char *sourcehost, int localport)
|
||||||
|
{
|
||||||
ssh_session session;
|
ssh_session session;
|
||||||
ssh_buffer payload = NULL;
|
ssh_buffer payload = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
@@ -3623,7 +3671,8 @@ error:
|
|||||||
* use channel_read and channel_write for this.
|
* use channel_read and channel_write for this.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_open_x11(ssh_channel channel,
|
int ssh_channel_open_x11(ssh_channel channel,
|
||||||
const char *orig_addr, int orig_port) {
|
const char *orig_addr, int orig_port)
|
||||||
|
{
|
||||||
ssh_session session;
|
ssh_session session;
|
||||||
ssh_buffer payload = NULL;
|
ssh_buffer payload = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
@@ -3679,7 +3728,8 @@ error:
|
|||||||
*
|
*
|
||||||
* @return SSH_OK on success, SSH_ERROR if an error occurred.
|
* @return SSH_OK on success, SSH_ERROR if an error occurred.
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_send_exit_status(ssh_channel channel, int exit_status) {
|
int ssh_channel_request_send_exit_status(ssh_channel channel, int exit_status)
|
||||||
|
{
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
@@ -3723,7 +3773,8 @@ error:
|
|||||||
* @return SSH_OK on success, SSH_ERROR if an error occurred
|
* @return SSH_OK on success, SSH_ERROR if an error occurred
|
||||||
*/
|
*/
|
||||||
int ssh_channel_request_send_exit_signal(ssh_channel channel, const char *sig,
|
int ssh_channel_request_send_exit_signal(ssh_channel channel, const char *sig,
|
||||||
int core, const char *errmsg, const char *lang) {
|
int core, const char *errmsg, const char *lang)
|
||||||
|
{
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
|
|||||||
37
src/client.c
37
src/client.c
@@ -60,7 +60,8 @@
|
|||||||
* @param code one of SSH_SOCKET_CONNECTED_OK or SSH_SOCKET_CONNECTED_ERROR
|
* @param code one of SSH_SOCKET_CONNECTED_OK or SSH_SOCKET_CONNECTED_ERROR
|
||||||
* @param user is a pointer to session
|
* @param user is a pointer to session
|
||||||
*/
|
*/
|
||||||
static void socket_callback_connected(int code, int errno_code, void *user){
|
static void socket_callback_connected(int code, int errno_code, void *user)
|
||||||
|
{
|
||||||
ssh_session session=(ssh_session)user;
|
ssh_session session=(ssh_session)user;
|
||||||
|
|
||||||
if (session->session_state != SSH_SESSION_STATE_CONNECTING &&
|
if (session->session_state != SSH_SESSION_STATE_CONNECTING &&
|
||||||
@@ -96,10 +97,10 @@ static void socket_callback_connected(int code, int errno_code, void *user){
|
|||||||
static int callback_receive_banner(const void *data, size_t len, void *user)
|
static int callback_receive_banner(const void *data, size_t len, void *user)
|
||||||
{
|
{
|
||||||
char *buffer = (char *)data;
|
char *buffer = (char *)data;
|
||||||
ssh_session session=(ssh_session) user;
|
ssh_session session = (ssh_session) user;
|
||||||
char *str = NULL;
|
char *str = NULL;
|
||||||
size_t i;
|
size_t i;
|
||||||
int ret=0;
|
int ret = 0;
|
||||||
|
|
||||||
if (session->session_state != SSH_SESSION_STATE_SOCKET_CONNECTED) {
|
if (session->session_state != SSH_SESSION_STATE_SOCKET_CONNECTED) {
|
||||||
ssh_set_error(session,SSH_FATAL,
|
ssh_set_error(session,SSH_FATAL,
|
||||||
@@ -243,8 +244,8 @@ end:
|
|||||||
* @warning this function returning is no proof that DH handshake is
|
* @warning this function returning is no proof that DH handshake is
|
||||||
* completed
|
* completed
|
||||||
*/
|
*/
|
||||||
static int dh_handshake(ssh_session session) {
|
static int dh_handshake(ssh_session session)
|
||||||
|
{
|
||||||
int rc = SSH_AGAIN;
|
int rc = SSH_AGAIN;
|
||||||
|
|
||||||
switch (session->dh_handshake_state) {
|
switch (session->dh_handshake_state) {
|
||||||
@@ -299,9 +300,11 @@ static int dh_handshake(ssh_session session) {
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssh_service_request_termination(void *s){
|
static int ssh_service_request_termination(void *s)
|
||||||
|
{
|
||||||
ssh_session session = (ssh_session)s;
|
ssh_session session = (ssh_session)s;
|
||||||
if(session->session_state == SSH_SESSION_STATE_ERROR ||
|
|
||||||
|
if (session->session_state == SSH_SESSION_STATE_ERROR ||
|
||||||
session->auth.service_state != SSH_AUTH_SERVICE_SENT)
|
session->auth.service_state != SSH_AUTH_SERVICE_SENT)
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else
|
||||||
@@ -323,8 +326,9 @@ static int ssh_service_request_termination(void *s){
|
|||||||
* @return SSH_AGAIN No response received yet
|
* @return SSH_AGAIN No response received yet
|
||||||
* @bug actually only works with ssh-userauth
|
* @bug actually only works with ssh-userauth
|
||||||
*/
|
*/
|
||||||
int ssh_service_request(ssh_session session, const char *service) {
|
int ssh_service_request(ssh_session session, const char *service)
|
||||||
int rc=SSH_ERROR;
|
{
|
||||||
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
if(session->auth.service_state != SSH_AUTH_SERVICE_NONE)
|
if(session->auth.service_state != SSH_AUTH_SERVICE_NONE)
|
||||||
goto pending;
|
goto pending;
|
||||||
@@ -481,9 +485,11 @@ error:
|
|||||||
/** @internal
|
/** @internal
|
||||||
* @brief describe under which conditions the ssh_connect function may stop
|
* @brief describe under which conditions the ssh_connect function may stop
|
||||||
*/
|
*/
|
||||||
static int ssh_connect_termination(void *user){
|
static int ssh_connect_termination(void *user)
|
||||||
|
{
|
||||||
ssh_session session = (ssh_session)user;
|
ssh_session session = (ssh_session)user;
|
||||||
switch(session->session_state){
|
|
||||||
|
switch (session->session_state) {
|
||||||
case SSH_SESSION_STATE_ERROR:
|
case SSH_SESSION_STATE_ERROR:
|
||||||
case SSH_SESSION_STATE_AUTHENTICATING:
|
case SSH_SESSION_STATE_AUTHENTICATING:
|
||||||
case SSH_SESSION_STATE_DISCONNECTED:
|
case SSH_SESSION_STATE_DISCONNECTED:
|
||||||
@@ -649,7 +655,8 @@ pending:
|
|||||||
*
|
*
|
||||||
* @return A newly allocated string with the banner, NULL on error.
|
* @return A newly allocated string with the banner, NULL on error.
|
||||||
*/
|
*/
|
||||||
char *ssh_get_issue_banner(ssh_session session) {
|
char *ssh_get_issue_banner(ssh_session session)
|
||||||
|
{
|
||||||
if (session == NULL || session->banner == NULL) {
|
if (session == NULL || session->banner == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -675,7 +682,8 @@ char *ssh_get_issue_banner(ssh_session session) {
|
|||||||
* }
|
* }
|
||||||
* @endcode
|
* @endcode
|
||||||
*/
|
*/
|
||||||
int ssh_get_openssh_version(ssh_session session) {
|
int ssh_get_openssh_version(ssh_session session)
|
||||||
|
{
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -774,7 +782,8 @@ error:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *ssh_copyright(void) {
|
const char *ssh_copyright(void)
|
||||||
|
{
|
||||||
return SSH_STRINGIFY(LIBSSH_VERSION) " (c) 2003-2022 "
|
return SSH_STRINGIFY(LIBSSH_VERSION) " (c) 2003-2022 "
|
||||||
"Aris Adamantiadis, Andreas Schneider "
|
"Aris Adamantiadis, Andreas Schneider "
|
||||||
"and libssh contributors. "
|
"and libssh contributors. "
|
||||||
|
|||||||
@@ -44,7 +44,8 @@
|
|||||||
*
|
*
|
||||||
* @return 1 on success, 0 on error.
|
* @return 1 on success, 0 on error.
|
||||||
*/
|
*/
|
||||||
static int ssh_gets(const char *prompt, char *buf, size_t len, int verify) {
|
static int ssh_gets(const char *prompt, char *buf, size_t len, int verify)
|
||||||
|
{
|
||||||
char *tmp;
|
char *tmp;
|
||||||
char *ptr = NULL;
|
char *ptr = NULL;
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
@@ -121,7 +122,8 @@ int ssh_getpass(const char *prompt,
|
|||||||
char *buf,
|
char *buf,
|
||||||
size_t len,
|
size_t len,
|
||||||
int echo,
|
int echo,
|
||||||
int verify) {
|
int verify)
|
||||||
|
{
|
||||||
HANDLE h;
|
HANDLE h;
|
||||||
DWORD mode = 0;
|
DWORD mode = 0;
|
||||||
int ok;
|
int ok;
|
||||||
@@ -213,7 +215,8 @@ int ssh_getpass(const char *prompt,
|
|||||||
char *buf,
|
char *buf,
|
||||||
size_t len,
|
size_t len,
|
||||||
int echo,
|
int echo,
|
||||||
int verify) {
|
int verify)
|
||||||
|
{
|
||||||
struct termios attr;
|
struct termios attr;
|
||||||
struct termios old_attr;
|
struct termios old_attr;
|
||||||
int ok = 0;
|
int ok = 0;
|
||||||
|
|||||||
32
src/gssapi.c
32
src/gssapi.c
@@ -68,7 +68,8 @@ struct ssh_gssapi_struct{
|
|||||||
/** @internal
|
/** @internal
|
||||||
* @initializes a gssapi context for authentication
|
* @initializes a gssapi context for authentication
|
||||||
*/
|
*/
|
||||||
static int ssh_gssapi_init(ssh_session session){
|
static int ssh_gssapi_init(ssh_session session)
|
||||||
|
{
|
||||||
if (session->gssapi != NULL)
|
if (session->gssapi != NULL)
|
||||||
return SSH_OK;
|
return SSH_OK;
|
||||||
session->gssapi = malloc(sizeof(struct ssh_gssapi_struct));
|
session->gssapi = malloc(sizeof(struct ssh_gssapi_struct));
|
||||||
@@ -87,7 +88,8 @@ static int ssh_gssapi_init(ssh_session session){
|
|||||||
/** @internal
|
/** @internal
|
||||||
* @frees a gssapi context
|
* @frees a gssapi context
|
||||||
*/
|
*/
|
||||||
static void ssh_gssapi_free(ssh_session session){
|
static void ssh_gssapi_free(ssh_session session)
|
||||||
|
{
|
||||||
OM_uint32 min;
|
OM_uint32 min;
|
||||||
if (session->gssapi == NULL)
|
if (session->gssapi == NULL)
|
||||||
return;
|
return;
|
||||||
@@ -114,7 +116,8 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_token){
|
|||||||
* @brief sends a SSH_MSG_USERAUTH_GSSAPI_RESPONSE packet
|
* @brief sends a SSH_MSG_USERAUTH_GSSAPI_RESPONSE packet
|
||||||
* @param[in] oid the OID that was selected for authentication
|
* @param[in] oid the OID that was selected for authentication
|
||||||
*/
|
*/
|
||||||
static int ssh_gssapi_send_response(ssh_session session, ssh_string oid){
|
static int ssh_gssapi_send_response(ssh_session session, ssh_string oid)
|
||||||
|
{
|
||||||
if (ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_USERAUTH_GSSAPI_RESPONSE) < 0 ||
|
if (ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_USERAUTH_GSSAPI_RESPONSE) < 0 ||
|
||||||
ssh_buffer_add_ssh_string(session->out_buffer,oid) < 0) {
|
ssh_buffer_add_ssh_string(session->out_buffer,oid) < 0) {
|
||||||
ssh_set_error_oom(session);
|
ssh_set_error_oom(session);
|
||||||
@@ -184,8 +187,11 @@ out:
|
|||||||
/** @internal
|
/** @internal
|
||||||
* @brief handles an user authentication using GSSAPI
|
* @brief handles an user authentication using GSSAPI
|
||||||
*/
|
*/
|
||||||
int ssh_gssapi_handle_userauth(ssh_session session, const char *user, uint32_t n_oid, ssh_string *oids){
|
int
|
||||||
char service_name[]="host";
|
ssh_gssapi_handle_userauth(ssh_session session, const char *user,
|
||||||
|
uint32_t n_oid, ssh_string *oids)
|
||||||
|
{
|
||||||
|
char service_name[] = "host";
|
||||||
gss_buffer_desc name_buf;
|
gss_buffer_desc name_buf;
|
||||||
gss_name_t server_name; /* local server fqdn */
|
gss_name_t server_name; /* local server fqdn */
|
||||||
OM_uint32 maj_stat, min_stat;
|
OM_uint32 maj_stat, min_stat;
|
||||||
@@ -327,7 +333,8 @@ int ssh_gssapi_handle_userauth(ssh_session session, const char *user, uint32_t n
|
|||||||
return ssh_gssapi_send_response(session, oids[i]);
|
return ssh_gssapi_send_response(session, oids[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *ssh_gssapi_name_to_char(gss_name_t name){
|
static char *ssh_gssapi_name_to_char(gss_name_t name)
|
||||||
|
{
|
||||||
gss_buffer_desc buffer;
|
gss_buffer_desc buffer;
|
||||||
OM_uint32 maj_stat, min_stat;
|
OM_uint32 maj_stat, min_stat;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
@@ -572,7 +579,8 @@ end:
|
|||||||
* @returns gssapi credentials handle.
|
* @returns gssapi credentials handle.
|
||||||
* @returns NULL if no forwardable token is available.
|
* @returns NULL if no forwardable token is available.
|
||||||
*/
|
*/
|
||||||
ssh_gssapi_creds ssh_gssapi_get_creds(ssh_session session){
|
ssh_gssapi_creds ssh_gssapi_get_creds(ssh_session session)
|
||||||
|
{
|
||||||
if (!session || !session->gssapi || session->gssapi->client_creds == GSS_C_NO_CREDENTIAL)
|
if (!session || !session->gssapi || session->gssapi->client_creds == GSS_C_NO_CREDENTIAL)
|
||||||
return NULL;
|
return NULL;
|
||||||
return (ssh_gssapi_creds)session->gssapi->client_creds;
|
return (ssh_gssapi_creds)session->gssapi->client_creds;
|
||||||
@@ -602,7 +610,9 @@ void ssh_gssapi_set_creds(ssh_session session, const ssh_gssapi_creds creds)
|
|||||||
session->gssapi->client.client_deleg_creds = (gss_cred_id_t)creds;
|
session->gssapi->client.client_deleg_creds = (gss_cred_id_t)creds;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssh_gssapi_send_auth_mic(ssh_session session, ssh_string *oid_set, int n_oid){
|
static int
|
||||||
|
ssh_gssapi_send_auth_mic(ssh_session session, ssh_string *oid_set, int n_oid)
|
||||||
|
{
|
||||||
int rc;
|
int rc;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -711,7 +721,8 @@ end:
|
|||||||
* SSH_AUTH_AGAIN: In nonblocking mode, you've got to call this again
|
* SSH_AUTH_AGAIN: In nonblocking mode, you've got to call this again
|
||||||
* later.
|
* later.
|
||||||
*/
|
*/
|
||||||
int ssh_gssapi_auth_mic(ssh_session session){
|
int ssh_gssapi_auth_mic(ssh_session session)
|
||||||
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
gss_OID_set selected; /* oid selected for authentication */
|
gss_OID_set selected; /* oid selected for authentication */
|
||||||
ssh_string *oids = NULL;
|
ssh_string *oids = NULL;
|
||||||
@@ -902,7 +913,8 @@ error:
|
|||||||
return SSH_PACKET_USED;
|
return SSH_PACKET_USED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssh_gssapi_send_mic(ssh_session session){
|
static int ssh_gssapi_send_mic(ssh_session session)
|
||||||
|
{
|
||||||
OM_uint32 maj_stat, min_stat;
|
OM_uint32 maj_stat, min_stat;
|
||||||
gss_buffer_desc mic_buf = GSS_C_EMPTY_BUFFER;
|
gss_buffer_desc mic_buf = GSS_C_EMPTY_BUFFER;
|
||||||
gss_buffer_desc mic_token_buf = GSS_C_EMPTY_BUFFER;
|
gss_buffer_desc mic_token_buf = GSS_C_EMPTY_BUFFER;
|
||||||
|
|||||||
141
src/misc.c
141
src/misc.c
@@ -104,7 +104,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
char *ssh_get_user_home_dir(void) {
|
char *ssh_get_user_home_dir(void)
|
||||||
|
{
|
||||||
char tmp[PATH_MAX] = {0};
|
char tmp[PATH_MAX] = {0};
|
||||||
char *szPath = NULL;
|
char *szPath = NULL;
|
||||||
|
|
||||||
@@ -122,7 +123,8 @@ char *ssh_get_user_home_dir(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* we have read access on file */
|
/* we have read access on file */
|
||||||
int ssh_file_readaccess_ok(const char *file) {
|
int ssh_file_readaccess_ok(const char *file)
|
||||||
|
{
|
||||||
if (_access(file, 4) < 0) {
|
if (_access(file, 4) < 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -158,7 +160,8 @@ int ssh_dir_writeable(const char *path)
|
|||||||
#define SSH_USEC_IN_SEC 1000000LL
|
#define SSH_USEC_IN_SEC 1000000LL
|
||||||
#define SSH_SECONDS_SINCE_1601 11644473600LL
|
#define SSH_SECONDS_SINCE_1601 11644473600LL
|
||||||
|
|
||||||
int gettimeofday(struct timeval *__p, void *__t) {
|
int gettimeofday(struct timeval *__p, void *__t)
|
||||||
|
{
|
||||||
union {
|
union {
|
||||||
unsigned long long ns100; /* time since 1 Jan 1601 in 100ns units */
|
unsigned long long ns100; /* time since 1 Jan 1601 in 100ns units */
|
||||||
FILETIME ft;
|
FILETIME ft;
|
||||||
@@ -171,7 +174,8 @@ int gettimeofday(struct timeval *__p, void *__t) {
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *ssh_get_local_username(void) {
|
char *ssh_get_local_username(void)
|
||||||
|
{
|
||||||
DWORD size = 0;
|
DWORD size = 0;
|
||||||
char *user;
|
char *user;
|
||||||
|
|
||||||
@@ -190,7 +194,8 @@ char *ssh_get_local_username(void) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_is_ipaddr_v4(const char *str) {
|
int ssh_is_ipaddr_v4(const char *str)
|
||||||
|
{
|
||||||
struct sockaddr_storage ss;
|
struct sockaddr_storage ss;
|
||||||
int sslen = sizeof(ss);
|
int sslen = sizeof(ss);
|
||||||
int rc = SOCKET_ERROR;
|
int rc = SOCKET_ERROR;
|
||||||
@@ -212,7 +217,8 @@ int ssh_is_ipaddr_v4(const char *str) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_is_ipaddr(const char *str) {
|
int ssh_is_ipaddr(const char *str)
|
||||||
|
{
|
||||||
int rc = SOCKET_ERROR;
|
int rc = SOCKET_ERROR;
|
||||||
|
|
||||||
if (strchr(str, ':')) {
|
if (strchr(str, ':')) {
|
||||||
@@ -319,7 +325,8 @@ char *ssh_get_local_username(void)
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_is_ipaddr_v4(const char *str) {
|
int ssh_is_ipaddr_v4(const char *str)
|
||||||
|
{
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
struct in_addr dest;
|
struct in_addr dest;
|
||||||
|
|
||||||
@@ -331,7 +338,8 @@ int ssh_is_ipaddr_v4(const char *str) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_is_ipaddr(const char *str) {
|
int ssh_is_ipaddr(const char *str)
|
||||||
|
{
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
|
|
||||||
if (strchr(str, ':')) {
|
if (strchr(str, ':')) {
|
||||||
@@ -349,7 +357,8 @@ int ssh_is_ipaddr(const char *str) {
|
|||||||
|
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
char *ssh_lowercase(const char* str) {
|
char *ssh_lowercase(const char* str)
|
||||||
|
{
|
||||||
char *new, *p;
|
char *new, *p;
|
||||||
|
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
@@ -392,15 +401,17 @@ char *ssh_hostport(const char *host, int port)
|
|||||||
* @brief Convert a buffer into a colon separated hex string.
|
* @brief Convert a buffer into a colon separated hex string.
|
||||||
* The caller has to free the memory.
|
* The caller has to free the memory.
|
||||||
*
|
*
|
||||||
* @param what What should be converted to a hex string.
|
* @param[in] what What should be converted to a hex string.
|
||||||
*
|
*
|
||||||
* @param len Length of the buffer to convert.
|
* @param[in] len Length of the buffer to convert.
|
||||||
*
|
*
|
||||||
* @return The hex string or NULL on error.
|
* @return The hex string or NULL on error. The memory needs
|
||||||
|
* to be freed using ssh_string_free_char().
|
||||||
*
|
*
|
||||||
* @see ssh_string_free_char()
|
* @see ssh_string_free_char()
|
||||||
*/
|
*/
|
||||||
char *ssh_get_hexa(const unsigned char *what, size_t len) {
|
char *ssh_get_hexa(const unsigned char *what, size_t len)
|
||||||
|
{
|
||||||
const char h[] = "0123456789abcdef";
|
const char h[] = "0123456789abcdef";
|
||||||
char *hexa;
|
char *hexa;
|
||||||
size_t i;
|
size_t i;
|
||||||
@@ -428,7 +439,8 @@ char *ssh_get_hexa(const unsigned char *what, size_t len) {
|
|||||||
/**
|
/**
|
||||||
* @deprecated Please use ssh_print_hash() instead
|
* @deprecated Please use ssh_print_hash() instead
|
||||||
*/
|
*/
|
||||||
void ssh_print_hexa(const char *descr, const unsigned char *what, size_t len) {
|
void ssh_print_hexa(const char *descr, const unsigned char *what, size_t len)
|
||||||
|
{
|
||||||
char *hexa = ssh_get_hexa(what, len);
|
char *hexa = ssh_get_hexa(what, len);
|
||||||
|
|
||||||
if (hexa == NULL) {
|
if (hexa == NULL) {
|
||||||
@@ -649,46 +661,52 @@ error:
|
|||||||
* }
|
* }
|
||||||
* @endcode
|
* @endcode
|
||||||
*/
|
*/
|
||||||
const char *ssh_version(int req_version) {
|
const char *ssh_version(int req_version)
|
||||||
|
{
|
||||||
if (req_version <= LIBSSH_VERSION_INT) {
|
if (req_version <= LIBSSH_VERSION_INT) {
|
||||||
return SSH_STRINGIFY(LIBSSH_VERSION) GCRYPT_STRING CRYPTO_STRING MBED_STRING
|
return SSH_STRINGIFY(LIBSSH_VERSION) GCRYPT_STRING CRYPTO_STRING
|
||||||
ZLIB_STRING;
|
MBED_STRING ZLIB_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ssh_list *ssh_list_new(void) {
|
struct ssh_list *ssh_list_new(void)
|
||||||
struct ssh_list *ret=malloc(sizeof(struct ssh_list));
|
{
|
||||||
if(!ret)
|
struct ssh_list *ret = malloc(sizeof(struct ssh_list));
|
||||||
|
if (!ret)
|
||||||
return NULL;
|
return NULL;
|
||||||
ret->root=ret->end=NULL;
|
ret->root = ret->end = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ssh_list_free(struct ssh_list *list){
|
void ssh_list_free(struct ssh_list *list)
|
||||||
struct ssh_iterator *ptr,*next;
|
{
|
||||||
if(!list)
|
struct ssh_iterator *ptr, *next;
|
||||||
|
if (!list)
|
||||||
return;
|
return;
|
||||||
ptr=list->root;
|
ptr = list->root;
|
||||||
while(ptr){
|
while (ptr) {
|
||||||
next=ptr->next;
|
next = ptr->next;
|
||||||
SAFE_FREE(ptr);
|
SAFE_FREE(ptr);
|
||||||
ptr=next;
|
ptr = next;
|
||||||
}
|
}
|
||||||
SAFE_FREE(list);
|
SAFE_FREE(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ssh_iterator *ssh_list_get_iterator(const struct ssh_list *list){
|
struct ssh_iterator *ssh_list_get_iterator(const struct ssh_list *list)
|
||||||
if(!list)
|
{
|
||||||
|
if (!list)
|
||||||
return NULL;
|
return NULL;
|
||||||
return list->root;
|
return list->root;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ssh_iterator *ssh_list_find(const struct ssh_list *list, void *value){
|
struct ssh_iterator *ssh_list_find(const struct ssh_list *list, void *value)
|
||||||
|
{
|
||||||
struct ssh_iterator *it;
|
struct ssh_iterator *it;
|
||||||
for(it = ssh_list_get_iterator(list); it != NULL ;it=it->next)
|
|
||||||
if(it->data==value)
|
for (it = ssh_list_get_iterator(list); it != NULL ; it = it->next)
|
||||||
|
if (it->data == value)
|
||||||
return it;
|
return it;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -712,16 +730,19 @@ size_t ssh_list_count(const struct ssh_list *list)
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct ssh_iterator *ssh_iterator_new(const void *data){
|
static struct ssh_iterator *ssh_iterator_new(const void *data)
|
||||||
struct ssh_iterator *iterator=malloc(sizeof(struct ssh_iterator));
|
{
|
||||||
if(!iterator)
|
struct ssh_iterator *iterator = malloc(sizeof(struct ssh_iterator));
|
||||||
|
|
||||||
|
if (!iterator)
|
||||||
return NULL;
|
return NULL;
|
||||||
iterator->next=NULL;
|
iterator->next = NULL;
|
||||||
iterator->data=data;
|
iterator->data = data;
|
||||||
return iterator;
|
return iterator;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_list_append(struct ssh_list *list,const void *data){
|
int ssh_list_append(struct ssh_list *list,const void *data)
|
||||||
|
{
|
||||||
struct ssh_iterator *iterator = NULL;
|
struct ssh_iterator *iterator = NULL;
|
||||||
|
|
||||||
if (list == NULL) {
|
if (list == NULL) {
|
||||||
@@ -744,7 +765,8 @@ int ssh_list_append(struct ssh_list *list,const void *data){
|
|||||||
return SSH_OK;
|
return SSH_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_list_prepend(struct ssh_list *list, const void *data){
|
int ssh_list_prepend(struct ssh_list *list, const void *data)
|
||||||
|
{
|
||||||
struct ssh_iterator *it = NULL;
|
struct ssh_iterator *it = NULL;
|
||||||
|
|
||||||
if (list == NULL) {
|
if (list == NULL) {
|
||||||
@@ -768,8 +790,9 @@ int ssh_list_prepend(struct ssh_list *list, const void *data){
|
|||||||
return SSH_OK;
|
return SSH_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ssh_list_remove(struct ssh_list *list, struct ssh_iterator *iterator){
|
void ssh_list_remove(struct ssh_list *list, struct ssh_iterator *iterator)
|
||||||
struct ssh_iterator *ptr,*prev;
|
{
|
||||||
|
struct ssh_iterator *ptr, *prev;
|
||||||
|
|
||||||
if (list == NULL) {
|
if (list == NULL) {
|
||||||
return;
|
return;
|
||||||
@@ -808,7 +831,8 @@ void ssh_list_remove(struct ssh_list *list, struct ssh_iterator *iterator){
|
|||||||
* @returns A pointer to the element being stored in head, or NULL
|
* @returns A pointer to the element being stored in head, or NULL
|
||||||
* if the list is empty.
|
* if the list is empty.
|
||||||
*/
|
*/
|
||||||
const void *_ssh_list_pop_head(struct ssh_list *list){
|
const void *_ssh_list_pop_head(struct ssh_list *list)
|
||||||
|
{
|
||||||
struct ssh_iterator *iterator = NULL;
|
struct ssh_iterator *iterator = NULL;
|
||||||
const void *data = NULL;
|
const void *data = NULL;
|
||||||
|
|
||||||
@@ -847,7 +871,8 @@ const void *_ssh_list_pop_head(struct ssh_list *list){
|
|||||||
*
|
*
|
||||||
* @see ssh_string_free_char()
|
* @see ssh_string_free_char()
|
||||||
*/
|
*/
|
||||||
char *ssh_dirname (const char *path) {
|
char *ssh_dirname (const char *path)
|
||||||
|
{
|
||||||
char *new = NULL;
|
char *new = NULL;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
@@ -905,7 +930,8 @@ char *ssh_dirname (const char *path) {
|
|||||||
*
|
*
|
||||||
* @see ssh_string_free_char()
|
* @see ssh_string_free_char()
|
||||||
*/
|
*/
|
||||||
char *ssh_basename (const char *path) {
|
char *ssh_basename (const char *path)
|
||||||
|
{
|
||||||
char *new = NULL;
|
char *new = NULL;
|
||||||
const char *s;
|
const char *s;
|
||||||
size_t len;
|
size_t len;
|
||||||
@@ -1043,7 +1069,8 @@ int ssh_mkdirs(const char *pathname, mode_t mode)
|
|||||||
*
|
*
|
||||||
* @see ssh_string_free_char()
|
* @see ssh_string_free_char()
|
||||||
*/
|
*/
|
||||||
char *ssh_path_expand_tilde(const char *d) {
|
char *ssh_path_expand_tilde(const char *d)
|
||||||
|
{
|
||||||
char *h = NULL, *r;
|
char *h = NULL, *r;
|
||||||
const char *p;
|
const char *p;
|
||||||
size_t ld;
|
size_t ld;
|
||||||
@@ -1115,7 +1142,8 @@ char *ssh_path_expand_tilde(const char *d) {
|
|||||||
*
|
*
|
||||||
* @see ssh_string_free_char()
|
* @see ssh_string_free_char()
|
||||||
*/
|
*/
|
||||||
char *ssh_path_expand_escape(ssh_session session, const char *s) {
|
char *ssh_path_expand_escape(ssh_session session, const char *s)
|
||||||
|
{
|
||||||
char host[NI_MAXHOST] = {0};
|
char host[NI_MAXHOST] = {0};
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
char *r = NULL;
|
char *r = NULL;
|
||||||
@@ -1376,7 +1404,8 @@ done:
|
|||||||
* @brief initializes a timestamp to the current time
|
* @brief initializes a timestamp to the current time
|
||||||
* @param[out] ts pointer to an allocated ssh_timestamp structure
|
* @param[out] ts pointer to an allocated ssh_timestamp structure
|
||||||
*/
|
*/
|
||||||
void ssh_timestamp_init(struct ssh_timestamp *ts){
|
void ssh_timestamp_init(struct ssh_timestamp *ts)
|
||||||
|
{
|
||||||
#ifdef HAVE_CLOCK_GETTIME
|
#ifdef HAVE_CLOCK_GETTIME
|
||||||
struct timespec tp;
|
struct timespec tp;
|
||||||
clock_gettime(CLOCK, &tp);
|
clock_gettime(CLOCK, &tp);
|
||||||
@@ -1399,8 +1428,9 @@ void ssh_timestamp_init(struct ssh_timestamp *ts){
|
|||||||
* @returns difference in milliseconds
|
* @returns difference in milliseconds
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int ssh_timestamp_difference(struct ssh_timestamp *old,
|
static int
|
||||||
struct ssh_timestamp *new){
|
ssh_timestamp_difference(struct ssh_timestamp *old, struct ssh_timestamp *new)
|
||||||
|
{
|
||||||
long seconds, usecs, msecs;
|
long seconds, usecs, msecs;
|
||||||
seconds = new->seconds - old->seconds;
|
seconds = new->seconds - old->seconds;
|
||||||
usecs = new->useconds - old->useconds;
|
usecs = new->useconds - old->useconds;
|
||||||
@@ -1420,7 +1450,8 @@ static int ssh_timestamp_difference(struct ssh_timestamp *old,
|
|||||||
* @param[in] usec number of microseconds
|
* @param[in] usec number of microseconds
|
||||||
* @returns milliseconds, or 10000 if user supplied values are equal to zero
|
* @returns milliseconds, or 10000 if user supplied values are equal to zero
|
||||||
*/
|
*/
|
||||||
int ssh_make_milliseconds(long sec, long usec) {
|
int ssh_make_milliseconds(long sec, long usec)
|
||||||
|
{
|
||||||
int res = usec ? (usec / 1000) : 0;
|
int res = usec ? (usec / 1000) : 0;
|
||||||
res += (sec * 1000);
|
res += (sec * 1000);
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
@@ -1440,7 +1471,8 @@ int ssh_make_milliseconds(long sec, long usec) {
|
|||||||
* @returns 1 if timeout is elapsed
|
* @returns 1 if timeout is elapsed
|
||||||
* 0 otherwise
|
* 0 otherwise
|
||||||
*/
|
*/
|
||||||
int ssh_timeout_elapsed(struct ssh_timestamp *ts, int timeout) {
|
int ssh_timeout_elapsed(struct ssh_timestamp *ts, int timeout)
|
||||||
|
{
|
||||||
struct ssh_timestamp now;
|
struct ssh_timestamp now;
|
||||||
|
|
||||||
switch(timeout) {
|
switch(timeout) {
|
||||||
@@ -1472,7 +1504,8 @@ int ssh_timeout_elapsed(struct ssh_timestamp *ts, int timeout) {
|
|||||||
* timeout
|
* timeout
|
||||||
* @returns remaining time in milliseconds, 0 if elapsed, -1 if never.
|
* @returns remaining time in milliseconds, 0 if elapsed, -1 if never.
|
||||||
*/
|
*/
|
||||||
int ssh_timeout_update(struct ssh_timestamp *ts, int timeout){
|
int ssh_timeout_update(struct ssh_timestamp *ts, int timeout)
|
||||||
|
{
|
||||||
struct ssh_timestamp now;
|
struct ssh_timestamp now;
|
||||||
int ms, ret;
|
int ms, ret;
|
||||||
if (timeout <= 0) {
|
if (timeout <= 0) {
|
||||||
@@ -1795,7 +1828,7 @@ int ssh_newline_vis(const char *string, char *buf, size_t buf_len)
|
|||||||
*
|
*
|
||||||
* @brief Replaces the last 6 characters of a string from 'X' to 6 random hexdigits.
|
* @brief Replaces the last 6 characters of a string from 'X' to 6 random hexdigits.
|
||||||
*
|
*
|
||||||
* @param[in] template Any input string with last 6 characters as 'X'.
|
* @param[in,out] template Any input string with last 6 characters as 'X'.
|
||||||
* @returns -1 as error when the last 6 characters of the input to be replaced are not 'X'
|
* @returns -1 as error when the last 6 characters of the input to be replaced are not 'X'
|
||||||
* 0 otherwise.
|
* 0 otherwise.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -483,7 +483,8 @@ int ssh_options_set_algo(ssh_session session,
|
|||||||
* @return 0 on success, < 0 on error.
|
* @return 0 on success, < 0 on error.
|
||||||
*/
|
*/
|
||||||
int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
||||||
const void *value) {
|
const void *value)
|
||||||
|
{
|
||||||
const char *v;
|
const char *v;
|
||||||
char *p, *q;
|
char *p, *q;
|
||||||
long int i;
|
long int i;
|
||||||
@@ -1406,7 +1407,8 @@ int ssh_options_getopt(ssh_session session, int *argcptr, char **argv)
|
|||||||
*
|
*
|
||||||
* @see ssh_options_set()
|
* @see ssh_options_set()
|
||||||
*/
|
*/
|
||||||
int ssh_options_parse_config(ssh_session session, const char *filename) {
|
int ssh_options_parse_config(ssh_session session, const char *filename)
|
||||||
|
{
|
||||||
char *expanded_filename;
|
char *expanded_filename;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
@@ -1451,7 +1453,8 @@ out:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_options_apply(ssh_session session) {
|
int ssh_options_apply(ssh_session session)
|
||||||
|
{
|
||||||
struct ssh_iterator *it;
|
struct ssh_iterator *it;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
int rc;
|
int rc;
|
||||||
@@ -1544,8 +1547,9 @@ static bool ssh_bind_key_size_allowed(ssh_bind sshbind, ssh_key key)
|
|||||||
* @addtogroup libssh_server
|
* @addtogroup libssh_server
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
static int ssh_bind_set_key(ssh_bind sshbind, char **key_loc,
|
static int
|
||||||
const void *value) {
|
ssh_bind_set_key(ssh_bind sshbind, char **key_loc, const void *value)
|
||||||
|
{
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
ssh_set_error_invalid(sshbind);
|
ssh_set_error_invalid(sshbind);
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
53
src/pki.c
53
src/pki.c
@@ -122,9 +122,11 @@ const char *ssh_pki_key_ecdsa_name(const ssh_key key)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief creates a new empty SSH key
|
* @brief creates a new empty SSH key
|
||||||
|
*
|
||||||
* @returns an empty ssh_key handle, or NULL on error.
|
* @returns an empty ssh_key handle, or NULL on error.
|
||||||
*/
|
*/
|
||||||
ssh_key ssh_key_new (void) {
|
ssh_key ssh_key_new (void)
|
||||||
|
{
|
||||||
ssh_key ptr = malloc (sizeof (struct ssh_key_struct));
|
ssh_key ptr = malloc (sizeof (struct ssh_key_struct));
|
||||||
if (ptr == NULL) {
|
if (ptr == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -146,8 +148,9 @@ ssh_key ssh_key_dup(const ssh_key key)
|
|||||||
* @brief clean up the key and deallocate all existing keys
|
* @brief clean up the key and deallocate all existing keys
|
||||||
* @param[in] key ssh_key to clean
|
* @param[in] key ssh_key to clean
|
||||||
*/
|
*/
|
||||||
void ssh_key_clean (ssh_key key){
|
void ssh_key_clean (ssh_key key)
|
||||||
if(key == NULL)
|
{
|
||||||
|
if (key == NULL)
|
||||||
return;
|
return;
|
||||||
#ifdef HAVE_LIBGCRYPT
|
#ifdef HAVE_LIBGCRYPT
|
||||||
if(key->dsa) gcry_sexp_release(key->dsa);
|
if(key->dsa) gcry_sexp_release(key->dsa);
|
||||||
@@ -206,8 +209,9 @@ void ssh_key_clean (ssh_key key){
|
|||||||
* @brief deallocate a SSH key
|
* @brief deallocate a SSH key
|
||||||
* @param[in] key ssh_key handle to free
|
* @param[in] key ssh_key handle to free
|
||||||
*/
|
*/
|
||||||
void ssh_key_free (ssh_key key){
|
void ssh_key_free (ssh_key key)
|
||||||
if(key){
|
{
|
||||||
|
if (key) {
|
||||||
ssh_key_clean(key);
|
ssh_key_clean(key);
|
||||||
SAFE_FREE(key);
|
SAFE_FREE(key);
|
||||||
}
|
}
|
||||||
@@ -224,7 +228,8 @@ void ssh_key_free (ssh_key key){
|
|||||||
* SSH_KEYTYPE_ED25519_CERT01.
|
* SSH_KEYTYPE_ED25519_CERT01.
|
||||||
* @returns SSH_KEYTYPE_UNKNOWN if the type is unknown
|
* @returns SSH_KEYTYPE_UNKNOWN if the type is unknown
|
||||||
*/
|
*/
|
||||||
enum ssh_keytypes_e ssh_key_type(const ssh_key key){
|
enum ssh_keytypes_e ssh_key_type(const ssh_key key)
|
||||||
|
{
|
||||||
if (key == NULL) {
|
if (key == NULL) {
|
||||||
return SSH_KEYTYPE_UNKNOWN;
|
return SSH_KEYTYPE_UNKNOWN;
|
||||||
}
|
}
|
||||||
@@ -573,7 +578,8 @@ enum ssh_keytypes_e ssh_key_type_from_signature_name(const char *name) {
|
|||||||
*
|
*
|
||||||
* @return The enum ssh key type.
|
* @return The enum ssh key type.
|
||||||
*/
|
*/
|
||||||
enum ssh_keytypes_e ssh_key_type_from_name(const char *name) {
|
enum ssh_keytypes_e ssh_key_type_from_name(const char *name)
|
||||||
|
{
|
||||||
if (name == NULL) {
|
if (name == NULL) {
|
||||||
return SSH_KEYTYPE_UNKNOWN;
|
return SSH_KEYTYPE_UNKNOWN;
|
||||||
}
|
}
|
||||||
@@ -628,7 +634,8 @@ enum ssh_keytypes_e ssh_key_type_from_name(const char *name) {
|
|||||||
*
|
*
|
||||||
* @return The matching public key type.
|
* @return The matching public key type.
|
||||||
*/
|
*/
|
||||||
enum ssh_keytypes_e ssh_key_type_plain(enum ssh_keytypes_e type) {
|
enum ssh_keytypes_e ssh_key_type_plain(enum ssh_keytypes_e type)
|
||||||
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SSH_KEYTYPE_DSS_CERT01:
|
case SSH_KEYTYPE_DSS_CERT01:
|
||||||
return SSH_KEYTYPE_DSS;
|
return SSH_KEYTYPE_DSS;
|
||||||
@@ -658,7 +665,8 @@ enum ssh_keytypes_e ssh_key_type_plain(enum ssh_keytypes_e type) {
|
|||||||
*
|
*
|
||||||
* @return 1 if it is a public key, 0 if not.
|
* @return 1 if it is a public key, 0 if not.
|
||||||
*/
|
*/
|
||||||
int ssh_key_is_public(const ssh_key k) {
|
int ssh_key_is_public(const ssh_key k)
|
||||||
|
{
|
||||||
if (k == NULL) {
|
if (k == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1091,7 +1099,8 @@ int ssh_pki_export_privkey_file(const ssh_key privkey,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* temporary function to migrate seemlessly to ssh_key */
|
/* temporary function to migrate seemlessly to ssh_key */
|
||||||
ssh_public_key ssh_pki_convert_key_to_publickey(const ssh_key key) {
|
ssh_public_key ssh_pki_convert_key_to_publickey(const ssh_key key)
|
||||||
|
{
|
||||||
ssh_public_key pub;
|
ssh_public_key pub;
|
||||||
ssh_key tmp;
|
ssh_key tmp;
|
||||||
|
|
||||||
@@ -1124,7 +1133,8 @@ ssh_public_key ssh_pki_convert_key_to_publickey(const ssh_key key) {
|
|||||||
return pub;
|
return pub;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssh_private_key ssh_pki_convert_key_to_privatekey(const ssh_key key) {
|
ssh_private_key ssh_pki_convert_key_to_privatekey(const ssh_key key)
|
||||||
|
{
|
||||||
ssh_private_key privkey;
|
ssh_private_key privkey;
|
||||||
|
|
||||||
privkey = malloc(sizeof(struct ssh_private_key_struct));
|
privkey = malloc(sizeof(struct ssh_private_key_struct));
|
||||||
@@ -1326,7 +1336,8 @@ fail:
|
|||||||
|
|
||||||
static int pki_import_pubkey_buffer(ssh_buffer buffer,
|
static int pki_import_pubkey_buffer(ssh_buffer buffer,
|
||||||
enum ssh_keytypes_e type,
|
enum ssh_keytypes_e type,
|
||||||
ssh_key *pkey) {
|
ssh_key *pkey)
|
||||||
|
{
|
||||||
ssh_key key = NULL;
|
ssh_key key = NULL;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@@ -1508,7 +1519,8 @@ fail:
|
|||||||
|
|
||||||
static int pki_import_cert_buffer(ssh_buffer buffer,
|
static int pki_import_cert_buffer(ssh_buffer buffer,
|
||||||
enum ssh_keytypes_e type,
|
enum ssh_keytypes_e type,
|
||||||
ssh_key *pkey) {
|
ssh_key *pkey)
|
||||||
|
{
|
||||||
ssh_buffer cert;
|
ssh_buffer cert;
|
||||||
ssh_string tmp_s;
|
ssh_string tmp_s;
|
||||||
const char *type_c;
|
const char *type_c;
|
||||||
@@ -1610,7 +1622,8 @@ fail:
|
|||||||
*/
|
*/
|
||||||
int ssh_pki_import_pubkey_base64(const char *b64_key,
|
int ssh_pki_import_pubkey_base64(const char *b64_key,
|
||||||
enum ssh_keytypes_e type,
|
enum ssh_keytypes_e type,
|
||||||
ssh_key *pkey) {
|
ssh_key *pkey)
|
||||||
|
{
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
ssh_string type_s = NULL;
|
ssh_string type_s = NULL;
|
||||||
int rc;
|
int rc;
|
||||||
@@ -1657,7 +1670,8 @@ int ssh_pki_import_pubkey_base64(const char *b64_key,
|
|||||||
* @see ssh_key_free()
|
* @see ssh_key_free()
|
||||||
*/
|
*/
|
||||||
int ssh_pki_import_pubkey_blob(const ssh_string key_blob,
|
int ssh_pki_import_pubkey_blob(const ssh_string key_blob,
|
||||||
ssh_key *pkey) {
|
ssh_key *pkey)
|
||||||
|
{
|
||||||
ssh_buffer buffer = NULL;
|
ssh_buffer buffer = NULL;
|
||||||
ssh_string type_s = NULL;
|
ssh_string type_s = NULL;
|
||||||
enum ssh_keytypes_e type;
|
enum ssh_keytypes_e type;
|
||||||
@@ -1891,7 +1905,8 @@ int ssh_pki_import_pubkey_file(const char *filename, ssh_key *pkey)
|
|||||||
*/
|
*/
|
||||||
int ssh_pki_import_cert_base64(const char *b64_cert,
|
int ssh_pki_import_cert_base64(const char *b64_cert,
|
||||||
enum ssh_keytypes_e type,
|
enum ssh_keytypes_e type,
|
||||||
ssh_key *pkey) {
|
ssh_key *pkey)
|
||||||
|
{
|
||||||
return ssh_pki_import_pubkey_base64(b64_cert, type, pkey);
|
return ssh_pki_import_pubkey_base64(b64_cert, type, pkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1911,7 +1926,8 @@ int ssh_pki_import_cert_base64(const char *b64_cert,
|
|||||||
* @see ssh_key_free()
|
* @see ssh_key_free()
|
||||||
*/
|
*/
|
||||||
int ssh_pki_import_cert_blob(const ssh_string cert_blob,
|
int ssh_pki_import_cert_blob(const ssh_string cert_blob,
|
||||||
ssh_key *pkey) {
|
ssh_key *pkey)
|
||||||
|
{
|
||||||
return ssh_pki_import_pubkey_blob(cert_blob, pkey);
|
return ssh_pki_import_pubkey_blob(cert_blob, pkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1951,7 +1967,8 @@ int ssh_pki_import_cert_file(const char *filename, ssh_key *pkey)
|
|||||||
* @see ssh_key_free()
|
* @see ssh_key_free()
|
||||||
*/
|
*/
|
||||||
int ssh_pki_generate(enum ssh_keytypes_e type, int parameter,
|
int ssh_pki_generate(enum ssh_keytypes_e type, int parameter,
|
||||||
ssh_key *pkey){
|
ssh_key *pkey)
|
||||||
|
{
|
||||||
int rc;
|
int rc;
|
||||||
ssh_key key = ssh_key_new();
|
ssh_key key = ssh_key_new();
|
||||||
|
|
||||||
|
|||||||
136
src/poll.c
136
src/poll.c
@@ -84,15 +84,18 @@ struct ssh_poll_ctx_struct {
|
|||||||
#ifdef HAVE_POLL
|
#ifdef HAVE_POLL
|
||||||
#include <poll.h>
|
#include <poll.h>
|
||||||
|
|
||||||
void ssh_poll_init(void) {
|
void ssh_poll_init(void)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ssh_poll_cleanup(void) {
|
void ssh_poll_cleanup(void)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout) {
|
int ssh_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout)
|
||||||
|
{
|
||||||
return poll((struct pollfd *) fds, nfds, timeout);
|
return poll((struct pollfd *) fds, nfds, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,21 +336,24 @@ int ssh_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout) {
|
|||||||
/**
|
/**
|
||||||
* @brief Allocate a new poll object, which could be used within a poll context.
|
* @brief Allocate a new poll object, which could be used within a poll context.
|
||||||
*
|
*
|
||||||
* @param fd Socket that will be polled.
|
* @param[in] fd Socket that will be polled.
|
||||||
* @param events Poll events that will be monitored for the socket. i.e.
|
* @param[in] events Poll events that will be monitored for the socket.
|
||||||
* POLLIN, POLLPRI, POLLOUT
|
* i.e. POLLIN, POLLPRI, POLLOUT
|
||||||
* @param cb Function to be called if any of the events are set.
|
* @param[in] cb Function to be called if any of the events are set.
|
||||||
* The prototype of cb is:
|
* The prototype of cb is:
|
||||||
* int (*ssh_poll_callback)(ssh_poll_handle p, socket_t fd,
|
* int (*ssh_poll_callback)(ssh_poll_handle p,
|
||||||
* int revents, void *userdata);
|
* socket_t fd,
|
||||||
* @param userdata Userdata to be passed to the callback function. NULL if
|
* int revents,
|
||||||
* not needed.
|
* void *userdata);
|
||||||
|
* @param[in] userdata Userdata to be passed to the callback function.
|
||||||
|
* NULL if not needed.
|
||||||
*
|
*
|
||||||
* @return A new poll object, NULL on error
|
* @return A new poll object, NULL on error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ssh_poll_handle ssh_poll_new(socket_t fd, short events, ssh_poll_callback cb,
|
ssh_poll_handle
|
||||||
void *userdata) {
|
ssh_poll_new(socket_t fd, short events, ssh_poll_callback cb, void *userdata)
|
||||||
|
{
|
||||||
ssh_poll_handle p;
|
ssh_poll_handle p;
|
||||||
|
|
||||||
p = malloc(sizeof(struct ssh_poll_handle_struct));
|
p = malloc(sizeof(struct ssh_poll_handle_struct));
|
||||||
@@ -371,10 +377,11 @@ ssh_poll_handle ssh_poll_new(socket_t fd, short events, ssh_poll_callback cb,
|
|||||||
* @param p Pointer to an already allocated poll object.
|
* @param p Pointer to an already allocated poll object.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ssh_poll_free(ssh_poll_handle p) {
|
void ssh_poll_free(ssh_poll_handle p)
|
||||||
if(p->ctx != NULL){
|
{
|
||||||
ssh_poll_ctx_remove(p->ctx,p);
|
if (p->ctx != NULL) {
|
||||||
p->ctx=NULL;
|
ssh_poll_ctx_remove(p->ctx, p);
|
||||||
|
p->ctx = NULL;
|
||||||
}
|
}
|
||||||
SAFE_FREE(p);
|
SAFE_FREE(p);
|
||||||
}
|
}
|
||||||
@@ -386,7 +393,8 @@ void ssh_poll_free(ssh_poll_handle p) {
|
|||||||
*
|
*
|
||||||
* @return Poll context or NULL if the poll object isn't attached.
|
* @return Poll context or NULL if the poll object isn't attached.
|
||||||
*/
|
*/
|
||||||
ssh_poll_ctx ssh_poll_get_ctx(ssh_poll_handle p) {
|
ssh_poll_ctx ssh_poll_get_ctx(ssh_poll_handle p)
|
||||||
|
{
|
||||||
return p->ctx;
|
return p->ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,7 +405,8 @@ ssh_poll_ctx ssh_poll_get_ctx(ssh_poll_handle p) {
|
|||||||
*
|
*
|
||||||
* @return Poll events.
|
* @return Poll events.
|
||||||
*/
|
*/
|
||||||
short ssh_poll_get_events(ssh_poll_handle p) {
|
short ssh_poll_get_events(ssh_poll_handle p)
|
||||||
|
{
|
||||||
return p->events;
|
return p->events;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -408,7 +417,8 @@ short ssh_poll_get_events(ssh_poll_handle p) {
|
|||||||
* @param p Pointer to an already allocated poll object.
|
* @param p Pointer to an already allocated poll object.
|
||||||
* @param events Poll events.
|
* @param events Poll events.
|
||||||
*/
|
*/
|
||||||
void ssh_poll_set_events(ssh_poll_handle p, short events) {
|
void ssh_poll_set_events(ssh_poll_handle p, short events)
|
||||||
|
{
|
||||||
p->events = events;
|
p->events = events;
|
||||||
if (p->ctx != NULL && !p->lock) {
|
if (p->ctx != NULL && !p->lock) {
|
||||||
p->ctx->pollfds[p->x.idx].events = events;
|
p->ctx->pollfds[p->x.idx].events = events;
|
||||||
@@ -422,7 +432,8 @@ void ssh_poll_set_events(ssh_poll_handle p, short events) {
|
|||||||
* @param p Pointer to an already allocated poll object.
|
* @param p Pointer to an already allocated poll object.
|
||||||
* @param fd New file descriptor.
|
* @param fd New file descriptor.
|
||||||
*/
|
*/
|
||||||
void ssh_poll_set_fd(ssh_poll_handle p, socket_t fd) {
|
void ssh_poll_set_fd(ssh_poll_handle p, socket_t fd)
|
||||||
|
{
|
||||||
if (p->ctx != NULL) {
|
if (p->ctx != NULL) {
|
||||||
p->ctx->pollfds[p->x.idx].fd = fd;
|
p->ctx->pollfds[p->x.idx].fd = fd;
|
||||||
} else {
|
} else {
|
||||||
@@ -437,7 +448,8 @@ void ssh_poll_set_fd(ssh_poll_handle p, socket_t fd) {
|
|||||||
* @param p Pointer to an already allocated poll object.
|
* @param p Pointer to an already allocated poll object.
|
||||||
* @param events Poll events.
|
* @param events Poll events.
|
||||||
*/
|
*/
|
||||||
void ssh_poll_add_events(ssh_poll_handle p, short events) {
|
void ssh_poll_add_events(ssh_poll_handle p, short events)
|
||||||
|
{
|
||||||
ssh_poll_set_events(p, ssh_poll_get_events(p) | events);
|
ssh_poll_set_events(p, ssh_poll_get_events(p) | events);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -448,7 +460,8 @@ void ssh_poll_add_events(ssh_poll_handle p, short events) {
|
|||||||
* @param p Pointer to an already allocated poll object.
|
* @param p Pointer to an already allocated poll object.
|
||||||
* @param events Poll events.
|
* @param events Poll events.
|
||||||
*/
|
*/
|
||||||
void ssh_poll_remove_events(ssh_poll_handle p, short events) {
|
void ssh_poll_remove_events(ssh_poll_handle p, short events)
|
||||||
|
{
|
||||||
ssh_poll_set_events(p, ssh_poll_get_events(p) & ~events);
|
ssh_poll_set_events(p, ssh_poll_get_events(p) & ~events);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -460,7 +473,8 @@ void ssh_poll_remove_events(ssh_poll_handle p, short events) {
|
|||||||
* @return Raw socket.
|
* @return Raw socket.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
socket_t ssh_poll_get_fd(ssh_poll_handle p) {
|
socket_t ssh_poll_get_fd(ssh_poll_handle p)
|
||||||
|
{
|
||||||
if (p->ctx != NULL) {
|
if (p->ctx != NULL) {
|
||||||
return p->ctx->pollfds[p->x.idx].fd;
|
return p->ctx->pollfds[p->x.idx].fd;
|
||||||
}
|
}
|
||||||
@@ -475,7 +489,8 @@ socket_t ssh_poll_get_fd(ssh_poll_handle p) {
|
|||||||
* @param userdata Userdata to be passed to the callback function. NULL if
|
* @param userdata Userdata to be passed to the callback function. NULL if
|
||||||
* not needed.
|
* not needed.
|
||||||
*/
|
*/
|
||||||
void ssh_poll_set_callback(ssh_poll_handle p, ssh_poll_callback cb, void *userdata) {
|
void ssh_poll_set_callback(ssh_poll_handle p, ssh_poll_callback cb, void *userdata)
|
||||||
|
{
|
||||||
if (cb != NULL) {
|
if (cb != NULL) {
|
||||||
p->cb = cb;
|
p->cb = cb;
|
||||||
p->cb_data = userdata;
|
p->cb_data = userdata;
|
||||||
@@ -493,7 +508,8 @@ void ssh_poll_set_callback(ssh_poll_handle p, ssh_poll_callback cb, void *userda
|
|||||||
* for the next 5. Set it to 0 if you want to use the
|
* for the next 5. Set it to 0 if you want to use the
|
||||||
* library's default value.
|
* library's default value.
|
||||||
*/
|
*/
|
||||||
ssh_poll_ctx ssh_poll_ctx_new(size_t chunk_size) {
|
ssh_poll_ctx ssh_poll_ctx_new(size_t chunk_size)
|
||||||
|
{
|
||||||
ssh_poll_ctx ctx;
|
ssh_poll_ctx ctx;
|
||||||
|
|
||||||
ctx = malloc(sizeof(struct ssh_poll_ctx_struct));
|
ctx = malloc(sizeof(struct ssh_poll_ctx_struct));
|
||||||
@@ -516,7 +532,8 @@ ssh_poll_ctx ssh_poll_ctx_new(size_t chunk_size) {
|
|||||||
*
|
*
|
||||||
* @param ctx Pointer to an already allocated poll context.
|
* @param ctx Pointer to an already allocated poll context.
|
||||||
*/
|
*/
|
||||||
void ssh_poll_ctx_free(ssh_poll_ctx ctx) {
|
void ssh_poll_ctx_free(ssh_poll_ctx ctx)
|
||||||
|
{
|
||||||
if (ctx->polls_allocated > 0) {
|
if (ctx->polls_allocated > 0) {
|
||||||
while (ctx->polls_used > 0){
|
while (ctx->polls_used > 0){
|
||||||
ssh_poll_handle p = ctx->pollptrs[0];
|
ssh_poll_handle p = ctx->pollptrs[0];
|
||||||
@@ -534,7 +551,8 @@ void ssh_poll_ctx_free(ssh_poll_ctx ctx) {
|
|||||||
SAFE_FREE(ctx);
|
SAFE_FREE(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssh_poll_ctx_resize(ssh_poll_ctx ctx, size_t new_size) {
|
static int ssh_poll_ctx_resize(ssh_poll_ctx ctx, size_t new_size)
|
||||||
|
{
|
||||||
ssh_poll_handle *pollptrs;
|
ssh_poll_handle *pollptrs;
|
||||||
ssh_pollfd_t *pollfds;
|
ssh_pollfd_t *pollfds;
|
||||||
|
|
||||||
@@ -568,7 +586,8 @@ static int ssh_poll_ctx_resize(ssh_poll_ctx ctx, size_t new_size) {
|
|||||||
*
|
*
|
||||||
* @return 0 on success, < 0 on error
|
* @return 0 on success, < 0 on error
|
||||||
*/
|
*/
|
||||||
int ssh_poll_ctx_add(ssh_poll_ctx ctx, ssh_poll_handle p) {
|
int ssh_poll_ctx_add(ssh_poll_ctx ctx, ssh_poll_handle p)
|
||||||
|
{
|
||||||
socket_t fd;
|
socket_t fd;
|
||||||
|
|
||||||
if (p->ctx != NULL) {
|
if (p->ctx != NULL) {
|
||||||
@@ -620,7 +639,8 @@ int ssh_poll_ctx_add_socket (ssh_poll_ctx ctx, ssh_socket s)
|
|||||||
* @param ctx Pointer to an already allocated poll context.
|
* @param ctx Pointer to an already allocated poll context.
|
||||||
* @param p Pointer to an already allocated poll object.
|
* @param p Pointer to an already allocated poll object.
|
||||||
*/
|
*/
|
||||||
void ssh_poll_ctx_remove(ssh_poll_ctx ctx, ssh_poll_handle p) {
|
void ssh_poll_ctx_remove(ssh_poll_ctx ctx, ssh_poll_handle p)
|
||||||
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
|
||||||
i = p->x.idx;
|
i = p->x.idx;
|
||||||
@@ -725,7 +745,8 @@ int ssh_poll_ctx_dopoll(ssh_poll_ctx ctx, int timeout)
|
|||||||
* @param session SSH session
|
* @param session SSH session
|
||||||
* @returns the default ssh_poll_ctx
|
* @returns the default ssh_poll_ctx
|
||||||
*/
|
*/
|
||||||
ssh_poll_ctx ssh_poll_get_default_ctx(ssh_session session){
|
ssh_poll_ctx ssh_poll_get_default_ctx(ssh_session session)
|
||||||
|
{
|
||||||
if(session->default_poll_ctx != NULL)
|
if(session->default_poll_ctx != NULL)
|
||||||
return session->default_poll_ctx;
|
return session->default_poll_ctx;
|
||||||
/* 2 is enough for the default one */
|
/* 2 is enough for the default one */
|
||||||
@@ -755,7 +776,8 @@ struct ssh_event_struct {
|
|||||||
*
|
*
|
||||||
* @return The ssh_event object on success, NULL on failure.
|
* @return The ssh_event object on success, NULL on failure.
|
||||||
*/
|
*/
|
||||||
ssh_event ssh_event_new(void) {
|
ssh_event ssh_event_new(void)
|
||||||
|
{
|
||||||
ssh_event event;
|
ssh_event event;
|
||||||
|
|
||||||
event = malloc(sizeof(struct ssh_event_struct));
|
event = malloc(sizeof(struct ssh_event_struct));
|
||||||
@@ -782,12 +804,14 @@ ssh_event ssh_event_new(void) {
|
|||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssh_event_fd_wrapper_callback(ssh_poll_handle p, socket_t fd, int revents,
|
static int
|
||||||
void *userdata) {
|
ssh_event_fd_wrapper_callback(ssh_poll_handle p, socket_t fd, int revents,
|
||||||
|
void *userdata)
|
||||||
|
{
|
||||||
struct ssh_event_fd_wrapper *pw = (struct ssh_event_fd_wrapper *)userdata;
|
struct ssh_event_fd_wrapper *pw = (struct ssh_event_fd_wrapper *)userdata;
|
||||||
|
|
||||||
(void)p;
|
(void)p;
|
||||||
if(pw->cb != NULL) {
|
if (pw->cb != NULL) {
|
||||||
return pw->cb(fd, revents, pw->userdata);
|
return pw->cb(fd, revents, pw->userdata);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -810,8 +834,10 @@ static int ssh_event_fd_wrapper_callback(ssh_poll_handle p, socket_t fd, int rev
|
|||||||
* @returns SSH_OK on success
|
* @returns SSH_OK on success
|
||||||
* SSH_ERROR on failure
|
* SSH_ERROR on failure
|
||||||
*/
|
*/
|
||||||
int ssh_event_add_fd(ssh_event event, socket_t fd, short events,
|
int
|
||||||
ssh_event_callback cb, void *userdata) {
|
ssh_event_add_fd(ssh_event event, socket_t fd, short events,
|
||||||
|
ssh_event_callback cb, void *userdata)
|
||||||
|
{
|
||||||
ssh_poll_handle p;
|
ssh_poll_handle p;
|
||||||
struct ssh_event_fd_wrapper *pw;
|
struct ssh_event_fd_wrapper *pw;
|
||||||
|
|
||||||
@@ -879,7 +905,8 @@ void ssh_event_remove_poll(ssh_event event, ssh_poll_handle p)
|
|||||||
* @returns SSH_OK on success
|
* @returns SSH_OK on success
|
||||||
* SSH_ERROR on failure
|
* SSH_ERROR on failure
|
||||||
*/
|
*/
|
||||||
int ssh_event_add_session(ssh_event event, ssh_session session) {
|
int ssh_event_add_session(ssh_event event, ssh_session session)
|
||||||
|
{
|
||||||
ssh_poll_handle p;
|
ssh_poll_handle p;
|
||||||
#ifdef WITH_SERVER
|
#ifdef WITH_SERVER
|
||||||
struct ssh_iterator *iterator;
|
struct ssh_iterator *iterator;
|
||||||
@@ -931,7 +958,8 @@ int ssh_event_add_session(ssh_event event, ssh_session session) {
|
|||||||
*
|
*
|
||||||
* @return SSH_ERROR in case of error
|
* @return SSH_ERROR in case of error
|
||||||
*/
|
*/
|
||||||
int ssh_event_add_connector(ssh_event event, ssh_connector connector){
|
int ssh_event_add_connector(ssh_event event, ssh_connector connector)
|
||||||
|
{
|
||||||
return ssh_connector_set_event(connector, event);
|
return ssh_connector_set_event(connector, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -952,10 +980,11 @@ int ssh_event_add_connector(ssh_event event, ssh_connector connector){
|
|||||||
* SSH_ERROR Error happened during the poll.
|
* SSH_ERROR Error happened during the poll.
|
||||||
* SSH_AGAIN Timeout occured
|
* SSH_AGAIN Timeout occured
|
||||||
*/
|
*/
|
||||||
int ssh_event_dopoll(ssh_event event, int timeout) {
|
int ssh_event_dopoll(ssh_event event, int timeout)
|
||||||
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if(event == NULL || event->ctx == NULL) {
|
if (event == NULL || event->ctx == NULL) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
rc = ssh_poll_ctx_dopoll(event->ctx, timeout);
|
rc = ssh_poll_ctx_dopoll(event->ctx, timeout);
|
||||||
@@ -971,7 +1000,8 @@ int ssh_event_dopoll(ssh_event event, int timeout) {
|
|||||||
* @returns SSH_OK on success
|
* @returns SSH_OK on success
|
||||||
* SSH_ERROR on failure
|
* SSH_ERROR on failure
|
||||||
*/
|
*/
|
||||||
int ssh_event_remove_fd(ssh_event event, socket_t fd) {
|
int ssh_event_remove_fd(ssh_event event, socket_t fd)
|
||||||
|
{
|
||||||
register size_t i, used;
|
register size_t i, used;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
@@ -1017,7 +1047,8 @@ int ssh_event_remove_fd(ssh_event event, socket_t fd) {
|
|||||||
* @returns SSH_OK on success
|
* @returns SSH_OK on success
|
||||||
* SSH_ERROR on failure
|
* SSH_ERROR on failure
|
||||||
*/
|
*/
|
||||||
int ssh_event_remove_session(ssh_event event, ssh_session session) {
|
int ssh_event_remove_session(ssh_event event, ssh_session session)
|
||||||
|
{
|
||||||
ssh_poll_handle p;
|
ssh_poll_handle p;
|
||||||
register size_t i, used;
|
register size_t i, used;
|
||||||
int rc = SSH_ERROR;
|
int rc = SSH_ERROR;
|
||||||
@@ -1025,14 +1056,14 @@ int ssh_event_remove_session(ssh_event event, ssh_session session) {
|
|||||||
struct ssh_iterator *iterator;
|
struct ssh_iterator *iterator;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(event == NULL || event->ctx == NULL || session == NULL) {
|
if (event == NULL || event->ctx == NULL || session == NULL) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
used = event->ctx->polls_used;
|
used = event->ctx->polls_used;
|
||||||
for(i = 0; i < used; i++) {
|
for (i = 0; i < used; i++) {
|
||||||
p = event->ctx->pollptrs[i];
|
p = event->ctx->pollptrs[i];
|
||||||
if(p->session == session){
|
if (p->session == session) {
|
||||||
/*
|
/*
|
||||||
* ssh_poll_ctx_remove() decrements
|
* ssh_poll_ctx_remove() decrements
|
||||||
* event->ctx->polls_used
|
* event->ctx->polls_used
|
||||||
@@ -1052,8 +1083,8 @@ int ssh_event_remove_session(ssh_event event, ssh_session session) {
|
|||||||
}
|
}
|
||||||
#ifdef WITH_SERVER
|
#ifdef WITH_SERVER
|
||||||
iterator = ssh_list_get_iterator(event->sessions);
|
iterator = ssh_list_get_iterator(event->sessions);
|
||||||
while(iterator != NULL) {
|
while (iterator != NULL) {
|
||||||
if((ssh_session)iterator->data == session) {
|
if ((ssh_session)iterator->data == session) {
|
||||||
ssh_list_remove(event->sessions, iterator);
|
ssh_list_remove(event->sessions, iterator);
|
||||||
/* there should be only one instance of this session */
|
/* there should be only one instance of this session */
|
||||||
break;
|
break;
|
||||||
@@ -1071,7 +1102,8 @@ int ssh_event_remove_session(ssh_event event, ssh_session session) {
|
|||||||
* @return SSH_OK on success
|
* @return SSH_OK on success
|
||||||
* @return SSH_ERROR on failure
|
* @return SSH_ERROR on failure
|
||||||
*/
|
*/
|
||||||
int ssh_event_remove_connector(ssh_event event, ssh_connector connector){
|
int ssh_event_remove_connector(ssh_event event, ssh_connector connector)
|
||||||
|
{
|
||||||
(void)event;
|
(void)event;
|
||||||
return ssh_connector_remove_event(connector);
|
return ssh_connector_remove_event(connector);
|
||||||
}
|
}
|
||||||
@@ -1089,13 +1121,13 @@ void ssh_event_free(ssh_event event)
|
|||||||
size_t used, i;
|
size_t used, i;
|
||||||
ssh_poll_handle p;
|
ssh_poll_handle p;
|
||||||
|
|
||||||
if(event == NULL) {
|
if (event == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event->ctx != NULL) {
|
if (event->ctx != NULL) {
|
||||||
used = event->ctx->polls_used;
|
used = event->ctx->polls_used;
|
||||||
for(i = 0; i < used; i++) {
|
for (i = 0; i < used; i++) {
|
||||||
p = event->ctx->pollptrs[i];
|
p = event->ctx->pollptrs[i];
|
||||||
if (p->session != NULL) {
|
if (p->session != NULL) {
|
||||||
ssh_poll_ctx_remove(event->ctx, p);
|
ssh_poll_ctx_remove(event->ctx, p);
|
||||||
@@ -1108,7 +1140,7 @@ void ssh_event_free(ssh_event event)
|
|||||||
ssh_poll_ctx_free(event->ctx);
|
ssh_poll_ctx_free(event->ctx);
|
||||||
}
|
}
|
||||||
#ifdef WITH_SERVER
|
#ifdef WITH_SERVER
|
||||||
if(event->sessions != NULL) {
|
if (event->sessions != NULL) {
|
||||||
ssh_list_free(event->sessions);
|
ssh_list_free(event->sessions);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1047,7 +1047,8 @@ int ssh_get_pubkey_hash(ssh_session session, unsigned char **hash)
|
|||||||
*
|
*
|
||||||
* @see ssh_get_pubkey_hash()
|
* @see ssh_get_pubkey_hash()
|
||||||
*/
|
*/
|
||||||
void ssh_clean_pubkey_hash(unsigned char **hash) {
|
void ssh_clean_pubkey_hash(unsigned char **hash)
|
||||||
|
{
|
||||||
SAFE_FREE(*hash);
|
SAFE_FREE(*hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user