From 8d3a43db7ad387db6369cbf77323cf21b60c494a Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 7 Apr 2009 14:02:24 +0000 Subject: Improve channel_new(). git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@413 7dcaeef0-15fb-0310-b436-a5af3365683c --- libssh/channels.c | 56 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 21 deletions(-) (limited to 'libssh') diff --git a/libssh/channels.c b/libssh/channels.c index 04242cab..c024799e 100644 --- a/libssh/channels.c +++ b/libssh/channels.c @@ -44,30 +44,44 @@ /** \brief allocate a new channel * \param session ssh session - * \return an allocated channel. As this function doesn't speak with server, it never fails + * \return An allocated channel, NULL on error. */ -CHANNEL *channel_new(SSH_SESSION *session){ - CHANNEL *channel=malloc(sizeof(CHANNEL)); +CHANNEL *channel_new(SSH_SESSION *session) { + CHANNEL *channel = NULL; - if (channel == NULL) { - return NULL; - } - memset(channel,0,sizeof(CHANNEL)); - channel->session=session; - channel->version=session->version; - channel->stdout_buffer=buffer_new(); - channel->stderr_buffer=buffer_new(); - channel->exit_status=-1; - if(!session->channels){ - session->channels=channel; - channel->next=channel->prev=channel; - return channel; - } - channel->next=session->channels; - channel->prev=session->channels->prev; - channel->next->prev=channel; - channel->prev->next=channel; + channel = malloc(sizeof(CHANNEL)); + if (channel == NULL) { + return NULL; + } + memset(channel,0,sizeof(CHANNEL)); + + channel->stdout_buffer = buffer_new(); + if (channel->stdout_buffer == NULL) { + SAFE_FREE(channel); + return NULL; + } + + channel->stderr_buffer = buffer_new(); + if (channel->stderr_buffer == NULL) { + SAFE_FREE(channel); + return NULL; + } + + channel->session = session; + channel->version = session->version; + channel->exit_status = -1; + + if(session->channels == NULL) { + session->channels = channel; + channel->next = channel->prev = channel; return channel; + } + channel->next = session->channels; + channel->prev = session->channels->prev; + channel->next->prev = channel; + channel->prev->next = channel; + + return channel; } u32 ssh_channel_new_id(SSH_SESSION *session){ -- cgit