summaryrefslogtreecommitdiffstats
path: root/libssh/channels.c
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-05-03 18:04:57 +0000
committerAndreas Schneider <mail@cynapses.org>2009-05-03 18:04:57 +0000
commit783825254a8e645c9c7e10c500771063b71863ef (patch)
treee3c4374644efcfdd1a0be095021942b73d90d9f9 /libssh/channels.c
parente7fc9ab369aa46a9335aef2089b702306fd40645 (diff)
downloadlibssh-783825254a8e645c9c7e10c500771063b71863ef.tar.gz
libssh-783825254a8e645c9c7e10c500771063b71863ef.tar.xz
libssh-783825254a8e645c9c7e10c500771063b71863ef.zip
Improve channel_rcv_request().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@681 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/channels.c')
-rw-r--r--libssh/channels.c131
1 files changed, 75 insertions, 56 deletions
diff --git a/libssh/channels.c b/libssh/channels.c
index 79e162a..7854add 100644
--- a/libssh/channels.c
+++ b/libssh/channels.c
@@ -464,66 +464,85 @@ static void channel_rcv_close(SSH_SESSION *session) {
leave_function();
}
-static void channel_rcv_request(SSH_SESSION *session){
- STRING *request_s;
- char *request;
- u32 status;
- CHANNEL *channel=channel_from_msg(session);
- enter_function();
- if(!channel){
- ssh_log(session, SSH_LOG_FUNCTIONS, "%s", ssh_get_error(session));
- leave_function();
- return;
- }
- request_s=buffer_get_ssh_string(session->in_buffer);
- if(!request_s){
- ssh_log(session, SSH_LOG_PACKET, "Invalid MSG_CHANNEL_REQUEST");
- leave_function();
- return;
+static void channel_rcv_request(SSH_SESSION *session) {
+ CHANNEL *channel;
+ STRING *request_s;
+ char *request;
+ u32 status;
+
+ enter_function();
+
+ channel = channel_from_msg(session);
+ if (channel == NULL) {
+ ssh_log(session, SSH_LOG_FUNCTIONS, ssh_get_error(session));
+ leave_function();
+ return;
+ }
+
+ request_s = buffer_get_ssh_string(session->in_buffer);
+ if (request_s == NULL) {
+ ssh_log(session, SSH_LOG_PACKET, "Invalid MSG_CHANNEL_REQUEST");
+ leave_function();
+ return;
+ }
+
+ request = string_to_char(request_s);
+ string_free(request_s);
+ if (request == NULL) {
+ leave_function();
+ return;
+ }
+
+ buffer_get_u8(session->in_buffer, (u8 *) &status);
+
+ if (strcmp(request,"exit-status") == 0) {
+ SAFE_FREE(request);
+ ssh_log(session, SSH_LOG_PACKET, "received exit-status");
+ buffer_get_u32(session->in_buffer, &status);
+ channel->exit_status = ntohl(status);
+
+ leave_function();
+ return ;
+ }
+
+ if (strcmp(request, "exit-signal") == 0) {
+ const char *core = "(core dumped)";
+ STRING *signal_s;
+ char *signal;
+ u8 i;
+
+ SAFE_FREE(request);
+
+ signal_s = buffer_get_ssh_string(session->in_buffer);
+ if (signal_s == NULL) {
+ ssh_log(session, SSH_LOG_PACKET, "Invalid MSG_CHANNEL_REQUEST");
+ leave_function();
+ return;
}
- buffer_get_u8(session->in_buffer,(u8 *)&status);
- request=string_to_char(request_s);
- if(!strcmp(request,"exit-status")){
- ssh_log(session, SSH_LOG_PACKET, "received exit-status");
- buffer_get_u32(session->in_buffer,&status);
- status=ntohl(status);
- channel->exit_status=status;
-/* TODO do something with status, we might need it */
- free(request_s);
- free(request);
- leave_function();
- return ;
+
+ signal = string_to_char(signal_s);
+ string_free(signal_s);
+ if (signal == NULL) {
+ leave_function();
+ return;
}
- if(!strcmp(request,"exit-signal")){
- STRING *signal_s;
- char *signal;
- const char *core = "(core dumped)";
- u8 i;
- signal_s=buffer_get_ssh_string(session->in_buffer);
- if(!signal_s){
- ssh_log(session, SSH_LOG_PACKET, "Invalid MSG_CHANNEL_REQUEST");
- free(request_s);
- free(request);
- leave_function();
- return;
- }
- signal=string_to_char(signal_s);
- buffer_get_u8(session->in_buffer,&i);
- if(!i)
- core="";
- ssh_log(session, SSH_LOG_PACKET,
- "Remote connection closed by signal SIG %s %s", signal, core);
- free(signal_s);
- free(signal);
- free(request_s);
- free(request);
- leave_function();
- return;
+
+ buffer_get_u8(session->in_buffer, &i);
+ if (i == 0) {
+ core = "";
}
- ssh_log(session, SSH_LOG_PACKET, "Unknown request %s", request);
- free(request_s);
- free(request);
+
+ ssh_log(session, SSH_LOG_PACKET,
+ "Remote connection closed by signal SIG %s %s", signal, core);
+ SAFE_FREE(signal);
+
leave_function();
+ return;
+ }
+ ssh_log(session, SSH_LOG_PACKET, "Unknown request %s", request);
+ SAFE_FREE(request);
+
+ leave_function();
}
/* channel_handle is called by wait_packet, ie, when there is channel informations to handle . */