mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-11 10:40:27 +09:00
Support for sending signals (RFC 4254, section 6.9).
Added function int channel_request_send_signal(ssh_channel channel, const char *signal); which implements signals delivery (as described in RFC 4254). Only SSH-v2 is currently supported. Signed-off-by: Dmitry V. Krivenok <krivenok@orangesystem.ru> Signed-off-by: Andreas Schneider <mail@cynapses.org>
This commit is contained in:
committed by
Andreas Schneider
parent
97b6036cbf
commit
df4c62212c
@@ -332,6 +332,7 @@ LIBSSH_API int channel_request_shell(ssh_channel channel);
|
|||||||
LIBSSH_API int channel_request_subsystem(ssh_channel channel, const char *system);
|
LIBSSH_API int channel_request_subsystem(ssh_channel channel, const char *system);
|
||||||
LIBSSH_API int channel_request_env(ssh_channel channel, const char *name, const char *value);
|
LIBSSH_API int channel_request_env(ssh_channel channel, const char *name, const char *value);
|
||||||
LIBSSH_API int channel_request_exec(ssh_channel channel, const char *cmd);
|
LIBSSH_API int channel_request_exec(ssh_channel channel, const char *cmd);
|
||||||
|
LIBSSH_API int channel_request_send_signal(ssh_channel channel, const char *signal);
|
||||||
LIBSSH_API int channel_request_sftp(ssh_channel channel);
|
LIBSSH_API int channel_request_sftp(ssh_channel channel);
|
||||||
LIBSSH_API int channel_request_x11(ssh_channel channel, int single_connection, const char *protocol,
|
LIBSSH_API int channel_request_x11(ssh_channel channel, int single_connection, const char *protocol,
|
||||||
const char *cookie, int screen_number);
|
const char *cookie, int screen_number);
|
||||||
|
|||||||
@@ -1654,6 +1654,57 @@ error:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a signal to remote process (as described in RFC 4254, section 6.9).
|
||||||
|
*
|
||||||
|
* Sends a signal 'signal' to the remote process.
|
||||||
|
* Note, that remote system may not support signals concept.
|
||||||
|
* In such a case this request will be silently ignored.
|
||||||
|
* Only SSH-v2 is supported (I'm not sure about SSH-v1).
|
||||||
|
*
|
||||||
|
* @param channel The channel to send signal.
|
||||||
|
*
|
||||||
|
* @param signal The signal to send (without SIG prefix)
|
||||||
|
* (e.g. "TERM" or "KILL").
|
||||||
|
*
|
||||||
|
* @return SSH_SUCCESS on success, SSH_ERROR on error (including attempt to send signal via SSH-v1 session).
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int channel_request_send_signal(ssh_channel channel, const char *signal) {
|
||||||
|
ssh_buffer buffer = NULL;
|
||||||
|
ssh_string encoded_signal = NULL;
|
||||||
|
int rc = SSH_ERROR;
|
||||||
|
|
||||||
|
#ifdef WITH_SSH1
|
||||||
|
if (channel->version == 1) {
|
||||||
|
return SSH_ERROR; // TODO: Add support for SSH-v1 if possible.
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
buffer = buffer_new();
|
||||||
|
if (buffer == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
encoded_signal = string_from_char(signal);
|
||||||
|
if (encoded_signal == NULL) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer_add_ssh_string(buffer, encoded_signal) < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = channel_request(channel, "signal", buffer, 0);
|
||||||
|
error:
|
||||||
|
buffer_free(buffer);
|
||||||
|
string_free(encoded_signal);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* TODO : fix the delayed close thing */
|
/* TODO : fix the delayed close thing */
|
||||||
/* TODO : fix the blocking behaviours */
|
/* TODO : fix the blocking behaviours */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user