1
1

Improve and document ssh_get_banner().

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@483 7dcaeef0-15fb-0310-b436-a5af3365683c
Этот коммит содержится в:
Andreas Schneider 2009-04-16 07:49:44 +00:00
родитель 1f1e9dc15b
Коммит 160f6a08d0

Просмотреть файл

@ -33,34 +33,49 @@
if (opt->connect_status_function) \ if (opt->connect_status_function) \
opt->connect_status_function(opt->connect_status_arg, status); \ opt->connect_status_function(opt->connect_status_arg, status); \
} while (0) } while (0)
/* simply gets a banner from a socket */
/**
* @internal
*
* @brief Get a banner from a socket.
*
* The caller has to free memroy.
*
* @param session The session to get the banner from.
*
* @return A newly allocated string with the banner or NULL on error.
*/
char *ssh_get_banner(SSH_SESSION *session) { char *ssh_get_banner(SSH_SESSION *session) {
char buffer[128]; char buffer[128] = {0};
int i = 0; char *str = NULL;
char *ret; int i;
enter_function(); enter_function();
while (i < 127) {
for (i = 0; i < 127; i++) {
if (ssh_socket_read(session->socket, &buffer[i], 1) != SSH_OK) { if (ssh_socket_read(session->socket, &buffer[i], 1) != SSH_OK) {
ssh_set_error(session, SSH_FATAL, "Remote host closed connection"); ssh_set_error(session, SSH_FATAL, "Remote host closed connection");
leave_function(); leave_function();
return NULL; return NULL;
} }
if (buffer[i] == '\r')
buffer[i] = 0; if (buffer[i] == '\r') {
buffer[i] = '\0';
}
if (buffer[i] == '\n') { if (buffer[i] == '\n') {
buffer[i] = 0; buffer[i] = '\0';
ret = strdup(buffer); str = strdup(buffer);
if (ret == NULL) { if (str == NULL) {
leave_function(); leave_function();
return NULL; return NULL;
} }
leave_function(); leave_function();
return ret; return str;
} }
i++;
} }
ssh_set_error(session, SSH_FATAL, "Too large banner"); ssh_set_error(session, SSH_FATAL, "Too large banner");
leave_function(); leave_function();
return NULL; return NULL;
} }