socket: Reformat the rest of the file
Signed-off-by: Jakub Jelen <jjelen@redhat.com> Reviewed-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
Этот коммит содержится в:
родитель
3cb0a1bf02
Коммит
bd65568749
133
src/socket.c
133
src/socket.c
@ -102,7 +102,8 @@ static ssize_t ssh_socket_unbuffered_write(ssh_socket s,
|
|||||||
* \internal
|
* \internal
|
||||||
* \brief inits the socket system (windows specific)
|
* \brief inits the socket system (windows specific)
|
||||||
*/
|
*/
|
||||||
int ssh_socket_init(void) {
|
int ssh_socket_init(void)
|
||||||
|
{
|
||||||
if (sockets_initialized == 0) {
|
if (sockets_initialized == 0) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
struct WSAData wsaData;
|
struct WSAData wsaData;
|
||||||
@ -111,7 +112,6 @@ int ssh_socket_init(void) {
|
|||||||
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) {
|
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
ssh_poll_init();
|
ssh_poll_init();
|
||||||
|
|
||||||
@ -124,7 +124,8 @@ int ssh_socket_init(void) {
|
|||||||
/**
|
/**
|
||||||
* @brief Cleanup the socket system.
|
* @brief Cleanup the socket system.
|
||||||
*/
|
*/
|
||||||
void ssh_socket_cleanup(void) {
|
void ssh_socket_cleanup(void)
|
||||||
|
{
|
||||||
if (sockets_initialized == 1) {
|
if (sockets_initialized == 1) {
|
||||||
ssh_poll_cleanup();
|
ssh_poll_cleanup();
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -139,7 +140,8 @@ void ssh_socket_cleanup(void) {
|
|||||||
* \internal
|
* \internal
|
||||||
* \brief creates a new Socket object
|
* \brief creates a new Socket object
|
||||||
*/
|
*/
|
||||||
ssh_socket ssh_socket_new(ssh_session session) {
|
ssh_socket ssh_socket_new(ssh_session session)
|
||||||
|
{
|
||||||
ssh_socket s;
|
ssh_socket s;
|
||||||
|
|
||||||
s = calloc(1, sizeof(struct ssh_socket_struct));
|
s = calloc(1, sizeof(struct ssh_socket_struct));
|
||||||
@ -177,7 +179,8 @@ ssh_socket ssh_socket_new(ssh_session session) {
|
|||||||
* @brief Reset the state of a socket so it looks brand-new
|
* @brief Reset the state of a socket so it looks brand-new
|
||||||
* @param[in] s socket to rest
|
* @param[in] s socket to rest
|
||||||
*/
|
*/
|
||||||
void ssh_socket_reset(ssh_socket s){
|
void ssh_socket_reset(ssh_socket s)
|
||||||
|
{
|
||||||
s->fd = SSH_INVALID_SOCKET;
|
s->fd = SSH_INVALID_SOCKET;
|
||||||
s->last_errno = -1;
|
s->last_errno = -1;
|
||||||
s->fd_is_socket = 1;
|
s->fd_is_socket = 1;
|
||||||
@ -198,8 +201,9 @@ void ssh_socket_reset(ssh_socket s){
|
|||||||
* @param callbacks a ssh_socket_callback object reference.
|
* @param callbacks a ssh_socket_callback object reference.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ssh_socket_set_callbacks(ssh_socket s, ssh_socket_callbacks callbacks){
|
void ssh_socket_set_callbacks(ssh_socket s, ssh_socket_callbacks callbacks)
|
||||||
s->callbacks=callbacks;
|
{
|
||||||
|
s->callbacks = callbacks;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -383,7 +387,8 @@ ssh_poll_handle ssh_socket_get_poll_handle(ssh_socket s)
|
|||||||
/** \internal
|
/** \internal
|
||||||
* \brief Deletes a socket object
|
* \brief Deletes a socket object
|
||||||
*/
|
*/
|
||||||
void ssh_socket_free(ssh_socket s){
|
void ssh_socket_free(ssh_socket s)
|
||||||
|
{
|
||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -394,7 +399,8 @@ void ssh_socket_free(ssh_socket s){
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
int ssh_socket_unix(ssh_socket s, const char *path) {
|
int ssh_socket_unix(ssh_socket s, const char *path)
|
||||||
|
{
|
||||||
struct sockaddr_un sunaddr;
|
struct sockaddr_un sunaddr;
|
||||||
socket_t fd;
|
socket_t fd;
|
||||||
sunaddr.sun_family = AF_UNIX;
|
sunaddr.sun_family = AF_UNIX;
|
||||||
@ -416,8 +422,7 @@ int ssh_socket_unix(ssh_socket s, const char *path) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (connect(fd, (struct sockaddr *) &sunaddr,
|
if (connect(fd, (struct sockaddr *) &sunaddr, sizeof(sunaddr)) < 0) {
|
||||||
sizeof(sunaddr)) < 0) {
|
|
||||||
ssh_set_error(s->session, SSH_FATAL, "Error from connect(): %s",
|
ssh_set_error(s->session, SSH_FATAL, "Error from connect(): %s",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
close(fd);
|
close(fd);
|
||||||
@ -431,7 +436,8 @@ int ssh_socket_unix(ssh_socket s, const char *path) {
|
|||||||
/** \internal
|
/** \internal
|
||||||
* \brief closes a socket
|
* \brief closes a socket
|
||||||
*/
|
*/
|
||||||
void ssh_socket_close(ssh_socket s){
|
void ssh_socket_close(ssh_socket s)
|
||||||
|
{
|
||||||
if (ssh_socket_is_open(s)) {
|
if (ssh_socket_is_open(s)) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
CLOSE_SOCKET(s->fd);
|
CLOSE_SOCKET(s->fd);
|
||||||
@ -442,9 +448,9 @@ void ssh_socket_close(ssh_socket s){
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if(s->poll_handle != NULL){
|
if (s->poll_handle != NULL) {
|
||||||
ssh_poll_free(s->poll_handle);
|
ssh_poll_free(s->poll_handle);
|
||||||
s->poll_handle=NULL;
|
s->poll_handle = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->state = SSH_SOCKET_CLOSED;
|
s->state = SSH_SOCKET_CLOSED;
|
||||||
@ -458,7 +464,8 @@ void ssh_socket_close(ssh_socket s){
|
|||||||
* @warning this function updates boths the input and output
|
* @warning this function updates boths the input and output
|
||||||
* file descriptors
|
* file descriptors
|
||||||
*/
|
*/
|
||||||
void ssh_socket_set_fd(ssh_socket s, socket_t fd) {
|
void ssh_socket_set_fd(ssh_socket s, socket_t fd)
|
||||||
|
{
|
||||||
s->fd = fd;
|
s->fd = fd;
|
||||||
|
|
||||||
if (s->poll_handle) {
|
if (s->poll_handle) {
|
||||||
@ -485,7 +492,8 @@ socket_t ssh_socket_get_fd(ssh_socket s)
|
|||||||
/** \internal
|
/** \internal
|
||||||
* \brief returns nonzero if the socket is open
|
* \brief returns nonzero if the socket is open
|
||||||
*/
|
*/
|
||||||
int ssh_socket_is_open(ssh_socket s) {
|
int ssh_socket_is_open(ssh_socket s)
|
||||||
|
{
|
||||||
return s->fd != SSH_INVALID_SOCKET;
|
return s->fd != SSH_INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -564,7 +572,8 @@ static ssize_t ssh_socket_unbuffered_write(ssh_socket s,
|
|||||||
/** \internal
|
/** \internal
|
||||||
* \brief returns nonzero if the current socket is in the fd_set
|
* \brief returns nonzero if the current socket is in the fd_set
|
||||||
*/
|
*/
|
||||||
int ssh_socket_fd_isset(ssh_socket s, fd_set *set) {
|
int ssh_socket_fd_isset(ssh_socket s, fd_set *set)
|
||||||
|
{
|
||||||
if(s->fd == SSH_INVALID_SOCKET) {
|
if(s->fd == SSH_INVALID_SOCKET) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -575,7 +584,8 @@ int ssh_socket_fd_isset(ssh_socket s, fd_set *set) {
|
|||||||
* \brief sets the current fd in a fd_set and updates the max_fd
|
* \brief sets the current fd in a fd_set and updates the max_fd
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void ssh_socket_fd_set(ssh_socket s, fd_set *set, socket_t *max_fd) {
|
void ssh_socket_fd_set(ssh_socket s, fd_set *set, socket_t *max_fd)
|
||||||
|
{
|
||||||
if (s->fd == SSH_INVALID_SOCKET) {
|
if (s->fd == SSH_INVALID_SOCKET) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -594,8 +604,9 @@ void ssh_socket_fd_set(ssh_socket s, fd_set *set, socket_t *max_fd) {
|
|||||||
* \returns SSH_OK, or SSH_ERROR
|
* \returns SSH_OK, or SSH_ERROR
|
||||||
* \warning has no effect on socket before a flush
|
* \warning has no effect on socket before a flush
|
||||||
*/
|
*/
|
||||||
int ssh_socket_write(ssh_socket s, const void *buffer, int len) {
|
int ssh_socket_write(ssh_socket s, const void *buffer, int len)
|
||||||
if(len > 0) {
|
{
|
||||||
|
if (len > 0) {
|
||||||
if (ssh_buffer_add_data(s->out_buffer, buffer, len) < 0) {
|
if (ssh_buffer_add_data(s->out_buffer, buffer, len) < 0) {
|
||||||
ssh_set_error_oom(s->session);
|
ssh_set_error_oom(s->session);
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
@ -685,23 +696,28 @@ int ssh_socket_nonblocking_flush(ssh_socket s)
|
|||||||
return SSH_OK;
|
return SSH_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ssh_socket_set_write_wontblock(ssh_socket s) {
|
void ssh_socket_set_write_wontblock(ssh_socket s)
|
||||||
|
{
|
||||||
s->write_wontblock = 1;
|
s->write_wontblock = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ssh_socket_set_read_wontblock(ssh_socket s) {
|
void ssh_socket_set_read_wontblock(ssh_socket s)
|
||||||
|
{
|
||||||
s->read_wontblock = 1;
|
s->read_wontblock = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ssh_socket_set_except(ssh_socket s) {
|
void ssh_socket_set_except(ssh_socket s)
|
||||||
|
{
|
||||||
s->data_except = 1;
|
s->data_except = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_socket_data_available(ssh_socket s) {
|
int ssh_socket_data_available(ssh_socket s)
|
||||||
|
{
|
||||||
return s->read_wontblock;
|
return s->read_wontblock;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_socket_data_writable(ssh_socket s) {
|
int ssh_socket_data_writable(ssh_socket s)
|
||||||
|
{
|
||||||
return s->write_wontblock;
|
return s->write_wontblock;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -710,14 +726,18 @@ int ssh_socket_data_writable(ssh_socket s) {
|
|||||||
* @param s the socket
|
* @param s the socket
|
||||||
* @returns numbers of bytes buffered, or 0 if the socket isn't connected
|
* @returns numbers of bytes buffered, or 0 if the socket isn't connected
|
||||||
*/
|
*/
|
||||||
int ssh_socket_buffered_write_bytes(ssh_socket s){
|
int ssh_socket_buffered_write_bytes(ssh_socket s)
|
||||||
if(s==NULL || s->out_buffer == NULL)
|
{
|
||||||
|
if (s==NULL || s->out_buffer == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return ssh_buffer_get_len(s->out_buffer);
|
return ssh_buffer_get_len(s->out_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ssh_socket_get_status(ssh_socket s) {
|
int ssh_socket_get_status(ssh_socket s)
|
||||||
|
{
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
|
||||||
if (ssh_buffer_get_len(s->in_buffer) > 0) {
|
if (ssh_buffer_get_len(s->in_buffer) > 0) {
|
||||||
@ -735,7 +755,8 @@ int ssh_socket_get_status(ssh_socket s) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_socket_get_poll_flags(ssh_socket s) {
|
int ssh_socket_get_poll_flags(ssh_socket s)
|
||||||
|
{
|
||||||
int r = 0;
|
int r = 0;
|
||||||
if (s->poll_handle != NULL && (ssh_poll_get_events (s->poll_handle) & POLLIN) > 0) {
|
if (s->poll_handle != NULL && (ssh_poll_get_events (s->poll_handle) & POLLIN) > 0) {
|
||||||
r |= SSH_READ_PENDING;
|
r |= SSH_READ_PENDING;
|
||||||
@ -747,22 +768,26 @@ int ssh_socket_get_poll_flags(ssh_socket s) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
int ssh_socket_set_nonblocking(socket_t fd) {
|
int ssh_socket_set_nonblocking(socket_t fd)
|
||||||
|
{
|
||||||
u_long nonblocking = 1;
|
u_long nonblocking = 1;
|
||||||
return ioctlsocket(fd, FIONBIO, &nonblocking);
|
return ioctlsocket(fd, FIONBIO, &nonblocking);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_socket_set_blocking(socket_t fd) {
|
int ssh_socket_set_blocking(socket_t fd)
|
||||||
|
{
|
||||||
u_long nonblocking = 0;
|
u_long nonblocking = 0;
|
||||||
return ioctlsocket(fd, FIONBIO, &nonblocking);
|
return ioctlsocket(fd, FIONBIO, &nonblocking);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* _WIN32 */
|
#else /* _WIN32 */
|
||||||
int ssh_socket_set_nonblocking(socket_t fd) {
|
int ssh_socket_set_nonblocking(socket_t fd)
|
||||||
|
{
|
||||||
return fcntl(fd, F_SETFL, O_NONBLOCK);
|
return fcntl(fd, F_SETFL, O_NONBLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ssh_socket_set_blocking(socket_t fd) {
|
int ssh_socket_set_blocking(socket_t fd)
|
||||||
|
{
|
||||||
return fcntl(fd, F_SETFL, 0);
|
return fcntl(fd, F_SETFL, 0);
|
||||||
}
|
}
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
@ -782,18 +807,21 @@ int ssh_socket_set_blocking(socket_t fd) {
|
|||||||
* which is problematic for hosts having DNS fail-over.
|
* which is problematic for hosts having DNS fail-over.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int ssh_socket_connect(ssh_socket s, const char *host, int port, const char *bind_addr){
|
int
|
||||||
|
ssh_socket_connect(ssh_socket s, const char *host, int port, const char *bind_addr)
|
||||||
|
{
|
||||||
socket_t fd;
|
socket_t fd;
|
||||||
|
|
||||||
if(s->state != SSH_SOCKET_NONE) {
|
if (s->state != SSH_SOCKET_NONE) {
|
||||||
ssh_set_error(s->session, SSH_FATAL,
|
ssh_set_error(s->session, SSH_FATAL,
|
||||||
"ssh_socket_connect called on socket not unconnected");
|
"ssh_socket_connect called on socket not unconnected");
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
fd=ssh_connect_host_nonblocking(s->session,host,bind_addr,port);
|
fd = ssh_connect_host_nonblocking(s->session, host, bind_addr, port);
|
||||||
SSH_LOG(SSH_LOG_PROTOCOL,"Nonblocking connection socket: %d",fd);
|
SSH_LOG(SSH_LOG_PROTOCOL, "Nonblocking connection socket: %d", fd);
|
||||||
if(fd == SSH_INVALID_SOCKET)
|
if (fd == SSH_INVALID_SOCKET) {
|
||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
|
}
|
||||||
ssh_socket_set_fd(s,fd);
|
ssh_socket_set_fd(s,fd);
|
||||||
|
|
||||||
return SSH_OK;
|
return SSH_OK;
|
||||||
@ -807,15 +835,18 @@ int ssh_socket_connect(ssh_socket s, const char *host, int port, const char *bin
|
|||||||
* @param in input file descriptor
|
* @param in input file descriptor
|
||||||
* @param out output file descriptor
|
* @param out output file descriptor
|
||||||
*/
|
*/
|
||||||
void ssh_execute_command(const char *command, socket_t in, socket_t out){
|
void
|
||||||
const char *args[]={"/bin/sh","-c",command,NULL};
|
ssh_execute_command(const char *command, socket_t in, socket_t out)
|
||||||
|
{
|
||||||
|
const char *args[] = {"/bin/sh", "-c", command, NULL};
|
||||||
|
|
||||||
/* redirect in and out to stdin, stdout and stderr */
|
/* redirect in and out to stdin, stdout and stderr */
|
||||||
dup2(in, 0);
|
dup2(in, 0);
|
||||||
dup2(out,1);
|
dup2(out, 1);
|
||||||
dup2(out,2);
|
dup2(out, 2);
|
||||||
close(in);
|
close(in);
|
||||||
close(out);
|
close(out);
|
||||||
execv(args[0],(char * const *)args);
|
execv(args[0], (char * const *)args);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -829,7 +860,9 @@ void ssh_execute_command(const char *command, socket_t in, socket_t out){
|
|||||||
* @returns SSH_ERROR error while executing the command.
|
* @returns SSH_ERROR error while executing the command.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int ssh_socket_connect_proxycommand(ssh_socket s, const char *command){
|
int
|
||||||
|
ssh_socket_connect_proxycommand(ssh_socket s, const char *command)
|
||||||
|
{
|
||||||
socket_t pair[2];
|
socket_t pair[2];
|
||||||
int pid;
|
int pid;
|
||||||
int rc;
|
int rc;
|
||||||
@ -843,20 +876,20 @@ int ssh_socket_connect_proxycommand(ssh_socket s, const char *command){
|
|||||||
return SSH_ERROR;
|
return SSH_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSH_LOG(SSH_LOG_PROTOCOL,"Executing proxycommand '%s'",command);
|
SSH_LOG(SSH_LOG_PROTOCOL, "Executing proxycommand '%s'", command);
|
||||||
pid = fork();
|
pid = fork();
|
||||||
if(pid == 0){
|
if(pid == 0) {
|
||||||
ssh_execute_command(command,pair[0],pair[0]);
|
ssh_execute_command(command, pair[0], pair[0]);
|
||||||
}
|
}
|
||||||
close(pair[0]);
|
close(pair[0]);
|
||||||
SSH_LOG(SSH_LOG_PROTOCOL,"ProxyCommand connection pipe: [%d,%d]",pair[0],pair[1]);
|
SSH_LOG(SSH_LOG_PROTOCOL, "ProxyCommand connection pipe: [%d,%d]",pair[0],pair[1]);
|
||||||
ssh_socket_set_fd(s, pair[1]);
|
ssh_socket_set_fd(s, pair[1]);
|
||||||
s->state=SSH_SOCKET_CONNECTED;
|
s->state=SSH_SOCKET_CONNECTED;
|
||||||
s->fd_is_socket=0;
|
s->fd_is_socket=0;
|
||||||
/* POLLOUT is the event to wait for in a nonblocking connect */
|
/* POLLOUT is the event to wait for in a nonblocking connect */
|
||||||
ssh_poll_set_events(ssh_socket_get_poll_handle(s), POLLIN | POLLOUT);
|
ssh_poll_set_events(ssh_socket_get_poll_handle(s), POLLIN | POLLOUT);
|
||||||
if(s->callbacks && s->callbacks->connected) {
|
if (s->callbacks && s->callbacks->connected) {
|
||||||
s->callbacks->connected(SSH_SOCKET_CONNECTED_OK,0,s->callbacks->userdata);
|
s->callbacks->connected(SSH_SOCKET_CONNECTED_OK, 0, s->callbacks->userdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
return SSH_OK;
|
return SSH_OK;
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user