[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: ssh_handle_packets blocking issue
[Thread Prev] | [Thread Next]
- Subject: Re: ssh_handle_packets blocking issue
- From: "jeetu.golani@xxxxxxxxx" <jeetu.golani@xxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Wed, 6 Apr 2011 20:37:39 +0530
- To: libssh@xxxxxxxxxx
- Cc: Aris Adamantiadis <aris@xxxxxxxxxxxx>
Hi Aris,
> I think it's because the options from ssh_session are overriden by the
> sshbind one. Either use ssh_bind_options_set (I think it's the name) or
> call ssh_options_set after the ssh_bind_accept.
Yup you were right, although ssh_bind_options_set didn't help but when
I set log options with ssh_options_set after ssh_bind_accept it did
the trick :)
I'm attaching the logs I've collected along with a text with the code
wherein things fall apart on some occassions.
...
do {
ssh_event_dopoll(event, 1000);
} while(!ssh_channel_is_closed(chan_x11));
...
this is basically the place where things fail, this is replica code
from the samplesshd-tty.c file. Is the timeout value of 1000 too small
here? should I have infinite blocking here too or increase this value?
I'm also attaching the entire server code that i've been working on
for eBrainPool (http://ebrain.in)...beware tough it's laden with
printfs i've put in for debugging...and heavily laden with bugs I
suppose ;)...work in progress.
Thanks so much guys for all the help truly appreciate it :)
Bye for now
...
nready = select(maxfds + 1, &testfds, NULL, NULL, &tv);
if(nready == -1)
{
printf("\nselect error: %s\n",strerror(errno));
}
if(nready > 0)
{
printf("\nwait_for_something: nready > 0");
if(FD_ISSET(data->sockets[0], &testfds))
{
printf("\nFD_ISSET\n");
cli_len = sizeof (cli_addr);
bzero((char *) &cli_addr, sizeof (cli_addr));
client_sock = accept(data->sockets[0], (struct sockaddr *) &cli_addr, &cli_len);
printf("\nclient_sock = %d",client_sock);
chan_x11 = ssh_channel_new(data->session);
printf("\nchan_x11 session = %d\n",data->session);
if(ssh_channel_open_x11(chan_x11,"127.0.0.1",6010) == SSH_ERROR)
{
printf("ssh_channel_open_x11 error : %s\n",ssh_get_error(chan_x11));
return NULL;
}
else
printf("\nssh_channel_open_x11\n");
cb.userdata = &client_sock;
ssh_callbacks_init(&cb);
ssh_set_channel_callbacks(chan_x11, &cb);
events = POLLIN | POLLPRI | POLLERR | POLLHUP | POLLNVAL;
printf("\nafter events = ");
event = ssh_event_new();
if(event == NULL)
{
printf("Couldn't get a event\n");
return NULL;
}
else
printf("\nevent != NULL");
if(ssh_event_add_fd(event, client_sock, events, copy_fd_to_chan, chan_x11) != SSH_OK)
{
printf("Couldn't add an fd to the event\n");
}
else
printf("\nAdded fd to event");
if(ssh_event_add_session(event, data->session) != SSH_OK)
{
printf("Couldn't add the session to the event\n");
return NULL;
}
else
printf("\nadded the session to the event");
do {
ssh_event_dopoll(event, 1000);
} while(!ssh_channel_is_closed(chan_x11));
printf("\nssh_channel_open_x11: channel closed\n");
ssh_event_remove_fd(event, client_sock);
ssh_event_remove_session(event, data->session);
ssh_event_free(event);
}
}
}
//return ret;
return NULL;
}
------------------gdb back trace ----------------------
0x00007ffff7402113 in poll () from /lib/libc.so.6
(gdb) bt
#0 0x00007ffff7402113 in poll () from /lib/libc.so.6
#1 0x00007ffff7bbceb9 in ssh_poll (fds=0x60a240, nfds=1, timeout=-1)
at /home/jeetu/utils/libssh/libssh-milo/src/poll.c:95
#2 0x00007ffff7bbd66c in ssh_poll_ctx_dopoll (ctx=0x60a1f0, timeout=-1)
at /home/jeetu/utils/libssh/libssh-milo/src/poll.c:641
#3 0x00007ffff7bbeab0 in ssh_handle_packets (session=0x6054d0, timeout=-1)
at /home/jeetu/utils/libssh/libssh-milo/src/session.c:407
#4 0x00007ffff7bb4cbb in ssh_message_get (session=0x6054d0)
at /home/jeetu/utils/libssh/libssh-milo/src/messages.c:137
#5 0x0000000000402428 in server_loop ()
#6 0x00000000004021fb in main ()
(gdb) up
#1 0x00007ffff7bbceb9 in ssh_poll (fds=0x60a240, nfds=1, timeout=-1)
at /home/jeetu/utils/libssh/libssh-milo/src/poll.c:95
95 return poll((struct pollfd *) fds, nfds, timeout);
(gdb) up
#2 0x00007ffff7bbd66c in ssh_poll_ctx_dopoll (ctx=0x60a1f0, timeout=-1)
at /home/jeetu/utils/libssh/libssh-milo/src/poll.c:641
641 rc = ssh_poll(ctx->pollfds, ctx->polls_used, timeout);
(gdb) up
#3 0x00007ffff7bbeab0 in ssh_handle_packets (session=0x6054d0, timeout=-1)
at /home/jeetu/utils/libssh/libssh-milo/src/session.c:407
407 ssh_poll_ctx_dopoll(ctx,timeout);
(gdb) up
#4 0x00007ffff7bb4cbb in ssh_message_get (session=0x6054d0)
at /home/jeetu/utils/libssh/libssh-milo/src/messages.c:137
137 if (ssh_handle_packets(session,-1) == SSH_ERROR) {
(gdb) up
#5 0x0000000000402428 in server_loop ()
(gdb)
s/libssh/libssh-milo/src/socket.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [3] ssh_handle_key_exchange: Actual state : 6 [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [3] ssh_handle_key_exchange: Actual state : 6 [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_packet_socket_callback line 138 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Packet size decrypted: 12 (0xc) [3] Read a 12 bytes packet [3] 10 bytes padding, 11 bytes left in buffer [3] After padding, 1 bytes left in buffer [func] entering function ssh_packet_parse_type line 404 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Final size 1 [3] Type 21 [func] leaving function ssh_packet_parse_type line 424 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_packet_process line 340 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Dispatching handler for packet type 21 [2] Received SSH_MSG_NEWKEYS [func] entering function ssh_server_connection_callback line 273 in /home/jeetu/utils/libssh/libssh-milo/src/server.c [func] entering function generate_session_keys line 702 in /home/jeetu/utils/libssh/libssh-milo/src/dh.c [func] leaving function generate_session_keys line 803 in /home/jeetu/utils/libssh/libssh-milo/src/dh.c [func] leaving function ssh_server_connection_callback line 380 in /home/jeetu/utils/libssh/libssh-milo/src/server.c [func] leaving function ssh_packet_process line 367 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Processing 52 bytes left in socket buffer [func] entering function ssh_packet_socket_callback line 138 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Decrypting 16 bytes [3] Packet size decrypted: 28 (0x1c) [3] Read a 28 bytes packet [3] Decrypting 16 bytes [3] 10 bytes padding, 27 bytes left in buffer [3] After padding, 17 bytes left in buffer [func] entering function ssh_packet_parse_type line 404 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Final size 17 [3] Type 5 [func] leaving function ssh_packet_parse_type line 424 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_packet_process line 340 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Dispatching handler for packet type 5 [func] entering function ssh_packet_service_request line 236 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [3] Received a SERVICE_REQUEST for service ssh-userauth [func] leaving function ssh_packet_service_request line 262 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] leaving function ssh_packet_process line 367 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_packet_socket_callback line 280 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_packet_socket_callback line 280 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [3] ssh_handle_key_exchange: Actual state : 7 [func] entering function ssh_message_get line 126 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] leaving function ssh_message_get line 130 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [3] Sending a SERVICE_ACCEPT for service ssh-userauth [func] entering function packet_send2 line 454 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Writing on the wire a packet having 17 bytes before [3] 17 bytes after comp + 10 padding bytes = 28 bytes packet [3] Encrypting packet with seq num: 3, len: 32 [func] entering function ssh_packet_write line 435 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_socket_write line 555 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] entering function ssh_socket_nonblocking_flush line 577 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [3] Enabling POLLOUT for socket [func] leaving function ssh_socket_nonblocking_flush line 623 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_socket_write line 563 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_packet_write line 440 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function packet_send2 line 515 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_message_get line 126 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_packet_socket_callback line 138 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Decrypting 16 bytes [3] Packet size decrypted: 44 (0x2c) [3] Read a 44 bytes packet [3] Decrypting 32 bytes [3] 7 bytes padding, 43 bytes left in buffer [3] After padding, 36 bytes left in buffer [func] entering function ssh_packet_parse_type line 404 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Final size 36 [3] Type 50 [func] leaving function ssh_packet_parse_type line 424 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_packet_process line 340 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Dispatching handler for packet type 50 [func] entering function ssh_packet_userauth_request line 281 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [3] Auth request for service ssh-connection, method none for user 'jeetu' [func] leaving function ssh_packet_userauth_request line 486 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] leaving function ssh_packet_process line 367 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_packet_socket_callback line 280 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_message_get line 143 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function ssh_message_auth_reply_default line 503 in /home/jeetu/utils/libssh/libssh-milo/src/server.c [3] Sending a auth failure. methods that can continue: publickey [func] entering function packet_send2 line 454 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Writing on the wire a packet having 15 bytes before [3] 15 bytes after comp + 12 padding bytes = 28 bytes packet [3] Encrypting packet with seq num: 4, len: 32 [func] entering function ssh_packet_write line 435 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_socket_write line 555 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] entering function ssh_socket_nonblocking_flush line 577 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [3] Enabling POLLOUT for socket [func] leaving function ssh_socket_nonblocking_flush line 623 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_socket_write line 563 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_packet_write line 440 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function packet_send2 line 515 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_message_auth_reply_default line 554 in /home/jeetu/utils/libssh/libssh-milo/src/server.c [func] entering function ssh_message_get line 126 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_packet_socket_callback line 138 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Decrypting 16 bytes [3] Packet size decrypted: 220 (0xdc) [3] Read a 220 bytes packet [3] Decrypting 208 bytes [3] 13 bytes padding, 219 bytes left in buffer [3] After padding, 206 bytes left in buffer [func] entering function ssh_packet_parse_type line 404 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Final size 206 [3] Type 50 [func] leaving function ssh_packet_parse_type line 424 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_packet_process line 340 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Dispatching handler for packet type 50 [func] entering function ssh_packet_userauth_request line 281 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [3] Auth request for service ssh-connection, method publickey for user 'jeetu' [func] leaving function ssh_packet_userauth_request line 486 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] leaving function ssh_packet_process line 367 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_packet_socket_callback line 280 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_message_get line 143 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function packet_send2 line 454 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Writing on the wire a packet having 165 bytes before [3] 165 bytes after comp + 6 padding bytes = 172 bytes packet [3] Encrypting packet with seq num: 5, len: 176 [func] entering function ssh_packet_write line 435 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_socket_write line 555 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] entering function ssh_socket_nonblocking_flush line 577 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [3] Enabling POLLOUT for socket [func] leaving function ssh_socket_nonblocking_flush line 623 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_socket_write line 563 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_packet_write line 440 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function packet_send2 line 515 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_message_get line 126 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_packet_socket_callback line 138 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Decrypting 16 bytes [3] Packet size decrypted: 364 (0x16c) [3] Read a 364 bytes packet [3] Decrypting 352 bytes [3] 10 bytes padding, 363 bytes left in buffer [3] After padding, 353 bytes left in buffer [func] entering function ssh_packet_parse_type line 404 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Final size 353 [3] Type 50 [func] leaving function ssh_packet_parse_type line 424 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_packet_process line 340 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Dispatching handler for packet type 50 [func] entering function ssh_packet_userauth_request line 281 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [3] Auth request for service ssh-connection, method publickey for user 'jeetu' [3] Valid signature received [func] leaving function ssh_packet_userauth_request line 486 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] leaving function ssh_packet_process line 367 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_packet_socket_callback line 280 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_message_get line 143 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function packet_send2 line 454 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Writing on the wire a packet having 1 bytes before [3] 1 bytes after comp + 10 padding bytes = 12 bytes packet [3] Encrypting packet with seq num: 6, len: 16 [func] entering function ssh_packet_write line 435 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_socket_write line 555 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] entering function ssh_socket_nonblocking_flush line 577 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [3] Enabling POLLOUT for socket [func] leaving function ssh_socket_nonblocking_flush line 623 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_socket_write line 563 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_packet_write line 440 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function packet_send2 line 515 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_message_get line 126 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_packet_socket_callback line 138 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Decrypting 16 bytes [3] Packet size decrypted: 44 (0x2c) [3] Read a 44 bytes packet [3] Decrypting 32 bytes [3] 19 bytes padding, 43 bytes left in buffer [3] After padding, 24 bytes left in buffer [func] entering function ssh_packet_parse_type line 404 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Final size 24 [3] Type 90 [func] leaving function ssh_packet_parse_type line 424 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_packet_process line 340 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Dispatching handler for packet type 90 [func] entering function ssh_packet_channel_open line 619 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [3] Clients wants to open a session channel [func] leaving function ssh_packet_channel_open line 767 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] leaving function ssh_packet_process line 367 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_packet_socket_callback line 280 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_message_get line 143 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function ssh_message_channel_request_open_reply_accept line 776 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [3] Accepting a channel request_open for chan 0 [func] entering function packet_send2 line 454 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Writing on the wire a packet having 17 bytes before [3] 17 bytes after comp + 10 padding bytes = 28 bytes packet [3] Encrypting packet with seq num: 7, len: 32 [func] entering function ssh_packet_write line 435 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_socket_write line 555 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] entering function ssh_socket_nonblocking_flush line 577 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [3] Enabling POLLOUT for socket [func] leaving function ssh_socket_nonblocking_flush line 623 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_socket_write line 563 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_packet_write line 440 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function packet_send2 line 515 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_message_channel_request_open_reply_accept line 820 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function ssh_message_get line 126 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_packet_socket_callback line 138 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Decrypting 16 bytes [3] Packet size decrypted: 92 (0x5c) [3] Read a 92 bytes packet [3] Decrypting 80 bytes [3] 11 bytes padding, 91 bytes left in buffer [3] After padding, 80 bytes left in buffer [func] entering function ssh_packet_parse_type line 404 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Final size 80 [3] Type 98 [func] leaving function ssh_packet_parse_type line 424 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_packet_process line 340 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Dispatching handler for packet type 98 [func] entering function channel_rcv_request line 627 in /home/jeetu/utils/libssh/libssh-milo/src/channels.c [func] entering function ssh_message_handle_channel_request line 851 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [3] Received a x11-req channel_request for channel (43:0) (want_reply=0) [func] leaving function ssh_message_handle_channel_request line 1029 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] leaving function channel_rcv_request line 801 in /home/jeetu/utils/libssh/libssh-milo/src/channels.c [func] leaving function ssh_packet_process line 367 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_packet_socket_callback line 280 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_message_get line 143 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [3] The client doesn't want to know the request succeeded [func] entering function ssh_message_get line 126 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_packet_socket_callback line 138 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Decrypting 16 bytes [3] Packet size decrypted: 28 (0x1c) [3] Read a 28 bytes packet [3] Decrypting 16 bytes [3] 4 bytes padding, 27 bytes left in buffer [3] After padding, 23 bytes left in buffer [func] entering function ssh_packet_parse_type line 404 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Final size 23 [3] Type 98 [func] leaving function ssh_packet_parse_type line 424 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_packet_process line 340 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Dispatching handler for packet type 98 [func] entering function channel_rcv_request line 627 in /home/jeetu/utils/libssh/libssh-milo/src/channels.c [func] entering function ssh_message_handle_channel_request line 851 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [3] Received a exec channel_request for channel (43:0) (want_reply=1) [func] leaving function ssh_message_handle_channel_request line 1029 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] leaving function channel_rcv_request line 801 in /home/jeetu/utils/libssh/libssh-milo/src/channels.c [func] leaving function ssh_packet_process line 367 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_packet_socket_callback line 280 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_message_get line 143 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [3] Sending a channel_request success to channel 0 [func] entering function packet_send2 line 454 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Writing on the wire a packet having 5 bytes before [3] 5 bytes after comp + 6 padding bytes = 12 bytes packet [3] Encrypting packet with seq num: 8, len: 16 [func] entering function ssh_packet_write line 435 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_socket_write line 555 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] entering function ssh_socket_nonblocking_flush line 577 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [3] Enabling POLLOUT for socket [func] leaving function ssh_socket_nonblocking_flush line 623 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_socket_write line 563 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_packet_write line 440 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function packet_send2 line 515 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_message_get line 126 in /home/jeetu/utils/libssh/libssh-milo/src/messages.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_channel_open_x11 line 2964 in /home/jeetu/utils/libssh/libssh-milo/src/channels.c [func] entering function channel_open line 242 in /home/jeetu/utils/libssh/libssh-milo/src/channels.c [2] Creating a channel 44 with 64000 window and 32000 max packet [func] entering function packet_send2 line 454 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Writing on the wire a packet having 37 bytes before [3] 37 bytes after comp + 6 padding bytes = 44 bytes packet [3] Encrypting packet with seq num: 9, len: 48 [func] entering function ssh_packet_write line 435 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_socket_write line 555 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] entering function ssh_socket_nonblocking_flush line 577 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [3] Enabling POLLOUT for socket [func] leaving function ssh_socket_nonblocking_flush line 623 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_socket_write line 563 in /home/jeetu/utils/libssh/libssh-milo/src/socket.c [func] leaving function ssh_packet_write line 440 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function packet_send2 line 515 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Sent a SSH_MSG_CHANNEL_OPEN type x11 for channel 44 [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_packet_socket_callback line 138 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Decrypting 16 bytes [3] Packet size decrypted: 28 (0x1c) [3] Read a 28 bytes packet [3] Decrypting 16 bytes [3] 10 bytes padding, 27 bytes left in buffer [3] After padding, 17 bytes left in buffer [func] entering function ssh_packet_parse_type line 404 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Final size 17 [3] Type 91 [func] leaving function ssh_packet_parse_type line 424 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] entering function ssh_packet_process line 340 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [3] Dispatching handler for packet type 91 [func] entering function ssh_packet_channel_open_conf line 141 in /home/jeetu/utils/libssh/libssh-milo/src/channels.c [3] Received SSH2_MSG_CHANNEL_OPEN_CONFIRMATION [2] Received a CHANNEL_OPEN_CONFIRMATION for channel 44:1 [2] Remote window : 2097152, maxpacket : 16384 [func] leaving function ssh_packet_channel_open_conf line 175 in /home/jeetu/utils/libssh/libssh-milo/src/channels.c [func] leaving function ssh_packet_process line 367 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_packet_socket_callback line 280 in /home/jeetu/utils/libssh/libssh-milo/src/packet.c [func] leaving function ssh_handle_packets line 408 in /home/jeetu/utils/libssh/libssh-milo/src/session.c [func] entering function ssh_handle_packets line 395 in /home/jeetu/utils/libssh/libssh-milo/src/session.c
#include <libssh/libssh.h>
#include <libssh/server.h>
#include <libssh/callbacks.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <glib.h>
#include <stdlib.h>
#include <errno.h>
#include <poll.h>
#include "key.h" //jeetu - temporary hardcoded key
#ifndef KEYS_FOLDER
#ifdef _WIN32
#define KEYS_FOLDER
#else
#define KEYS_FOLDER "/home/jeetu/tmp/"
#endif
#endif
#define MAX_X11_AUTH_PROTO_STR_SZ 18
#define MAX_X11_AUTH_COOKIE_STR_SZ 50
//jeetu - all hardcoded defines; should probably figure out how these values came to be in the orig openssh code
#define MAX_DISPLAYS 1000
#define NI_MAXSERV 32
#define NUM_SOCKS 10
#define SSH_LISTEN_BACKLOG 128
int authenticate_user(ssh_session session);
int pubkey_auth(char *pk64);
void server_loop(ssh_session session);
int session_x11_req(ssh_session session,ssh_message message);
int session_setup_x11fwd(ssh_session session);
int x11_create_display_inet(ssh_session session,unsigned int *display_numberp, int *sockets);
//int wait_for_something(ssh_session session,int *sockets);
static gpointer wait_for_something(gpointer user_data);
static int copy_chan_to_fd(ssh_session session,
ssh_channel channel,
void *data,
uint32_t len,
int is_stderr,
void *userdata);
static void chan_close(ssh_session session, ssh_channel channel, void *userdata);
static int copy_fd_to_chan(socket_t fd, int revents, void *userdata);
//void poll_events(ssh_session session,ssh_channel chan_x11,ssh_event event,int client_sock);
struct ssh_channel_callbacks_struct cb = {
.channel_data_function = copy_chan_to_fd,
.channel_eof_function = chan_close,
.channel_close_function = chan_close,
.userdata = NULL
};
struct x11_session_struct
{
char *x11_auth_cookie;
char *x11_auth_protocol;
int screen_number;
int single_connection;
unsigned int display_number;
};
typedef struct {
ssh_session session;
int *sockets;
} WaitThreadData;
static WaitThreadData * thread_data_new (void);
struct x11_session_struct x11session; //jeetu - may not need to be global
ssh_channel chan=0;
int main(int argc, char **argv)
{
ssh_session session;
ssh_bind sshbind;
ssh_buffer buf;
int auth=0;
int sftp=0;
int i;
int r;
int port = 2000;
ssh_string pubkey = NULL;
char *pk64 = NULL;
int signature_state = SSH_PUBLICKEY_STATE_NONE;
int rc = 0;
int exec_req=0;
int verbosity = SSH_LOG_FUNCTIONS;
sshbind=ssh_bind_new();
session=ssh_new();
ssh_options_getopt(session,&argc,argv);
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT,&port);
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, KEYS_FOLDER "ssh_host_dsa_key");
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, KEYS_FOLDER "ssh_host_rsa_key");
if(ssh_bind_listen(sshbind)<0)
{
printf("Error listening to socket: %s\n",ssh_get_error(sshbind));
return 1;
}
r=ssh_bind_accept(sshbind,session);
if(r==SSH_ERROR)
{
printf("error accepting a connection : %s\n",ssh_get_error(sshbind));
return 1;
}
ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity );
if(ssh_handle_key_exchange(session))
{
printf("ssh_accept: %s\n",ssh_get_error(session));
return 1;
}
/* public key authentication */
auth = authenticate_user(session);
if(!auth)
{
printf("auth error: %s\n",ssh_get_error(session));
ssh_disconnect(session);
return 1;
}
g_thread_init(NULL);
server_loop(session);
buffer_free(buf);
if(x11session.x11_auth_protocol != NULL)
free(x11session.x11_auth_protocol);
if(x11session.x11_auth_cookie != NULL)
free(x11session.x11_auth_cookie);
ssh_disconnect(session);
ssh_bind_free(sshbind);
ssh_finalize();
}
/* returns 1 for OK, 0 for KO */
int authenticate_user(ssh_session session)
{
ssh_message message;
ssh_string pubkey = NULL;
char *pk64 = NULL;
int signature_state = SSH_PUBLICKEY_STATE_NONE;
do
{
message = ssh_message_get(session);
if(!message)
return 0;
switch(ssh_message_type(message))
{
case SSH_REQUEST_AUTH:
switch(ssh_message_subtype(message))
{
case SSH_AUTH_METHOD_PUBLICKEY:
pubkey = publickey_to_string(ssh_message_auth_publickey(message));
pk64 = g_base64_encode(ssh_string_to_char(pubkey), ssh_string_len(pubkey));
signature_state = ssh_message_auth_publickey_state(message);
if(signature_state == SSH_PUBLICKEY_STATE_NONE)
{
/* no signature */
ssh_message_auth_reply_pk_ok_simple(message);
break;
}
else if(signature_state != SSH_PUBLICKEY_STATE_VALID)
{
/* will be rejected later */
}
else
{
/* signature is good at that point */
if(pubkey_auth(pk64))
{
/* user is allowed */
ssh_message_auth_reply_success(message, 0);
ssh_message_free(message);
return 1;
}
}
/* the following is not necessary if we want only pubkey auth */
ssh_message_auth_set_methods(message,SSH_AUTH_METHOD_PUBLICKEY);
/* reject authentication */
ssh_message_reply_default(message);
break;
case SSH_AUTH_METHOD_PASSWORD:
/* handle password auth if needed */
default:
ssh_message_auth_set_methods(message,SSH_AUTH_METHOD_PUBLICKEY);
ssh_message_reply_default(message);
}
break;
default:
ssh_message_reply_default(message);
}
ssh_message_free(message);
}while(1);
return 0;
}
int pubkey_auth(char* pk64)
{
if(strcmp(pk64,MY_PUB_KEY) == 0)
return 1;
return 0;
}
void server_loop(ssh_session session)
{
ssh_message message;
int message_subtype = 0;
int message_type = 0;
ssh_buffer buf;
struct ssh_message_struct *msg;
do
{
message=ssh_message_get(session);
msg = message;
if(message)
{
message_type = ssh_message_type(message);
message_subtype = ssh_message_subtype(message);
printf("\nmessage_type = %d subtype = %d",message_type,message_subtype);
switch(message_type)
{
case SSH_REQUEST_CHANNEL_OPEN:
if(message_subtype == SSH_CHANNEL_SESSION)
{
printf("\nSSH_CHANNEL_SESSION");
chan=ssh_message_channel_request_open_reply_accept(message);
}
break;
case SSH_REQUEST_CHANNEL:
printf("\nSSH_REQUEST_CHANNEL subtype = %d",message_subtype);
if(message_subtype == SSH_CHANNEL_REQUEST_X11)
{
printf("\nSSH_CHANNEL_REQUEST_X11");
if(session_x11_req(session,message) != 1)
printf("\nsession_x11_req error");
ssh_message_channel_request_reply_success(message);
}
if(message_subtype == SSH_CHANNEL_REQUEST_ENV)
{
printf("\nSSH_CHANNEL_REQUEST_ENV");
ssh_message_channel_request_reply_success(message);
}
if(message_subtype == SSH_CHANNEL_REQUEST_EXEC)
{
printf("\nSSH_CHANNEL_REQUEST_EXEC command = %s\n",ssh_message_channel_request_command(message));
ssh_message_channel_request_reply_success(message);
}
break;
default:
ssh_message_reply_default(message);
}
ssh_message_free(message);
}
} while(1);
}
int session_x11_req(ssh_session session,ssh_message message)
{
int ret = 1;
FILE* fpxauth;
char xauth_path[] = "/usr/bin/xauth";
char strxauth_exec[200]; //jeetu - buffer size sufficient?; xauth path name may be larger; ideally not fixed
x11session.x11_auth_protocol = NULL;
x11session.x11_auth_cookie = NULL;
x11session.x11_auth_protocol = malloc(MAX_X11_AUTH_PROTO_STR_SZ+2);
strncpy(x11session.x11_auth_protocol,ssh_message_channel_request_x11_auth_protocol(message),MAX_X11_AUTH_PROTO_STR_SZ+1);
x11session.x11_auth_protocol[MAX_X11_AUTH_PROTO_STR_SZ] = '\0';
if(strncmp(x11session.x11_auth_protocol,"MIT-MAGIC-COOKIE-1",MAX_X11_AUTH_PROTO_STR_SZ+1) == 0)
{
x11session.x11_auth_cookie = malloc(MAX_X11_AUTH_COOKIE_STR_SZ+2);
strncpy(x11session.x11_auth_cookie,ssh_message_channel_request_x11_auth_cookie(message),MAX_X11_AUTH_COOKIE_STR_SZ+1);
x11session.x11_auth_cookie[MAX_X11_AUTH_COOKIE_STR_SZ] = '\0';
x11session.screen_number = ssh_message_channel_request_x11_screen_number(message);
x11session.single_connection = ssh_message_channel_request_x11_single_connection(message);
}
else
ret = 0;
// ret = execl("/usr/bin/xauth","/usr/bin/xauth","add","unix:10.0",x11session.x11_auth_protocol,x11session.x11_auth_cookie,(char *) NULL);
ret = session_setup_x11fwd(session);
printf("\nx11_auth_protocol=%s\nx11_auth_cookie=%s\nscreen_number = %d\nsingle_connection = %d\ndisplay_number = %d\n",x11session.x11_auth_protocol,x11session.x11_auth_cookie,x11session.screen_number,x11session.single_connection,x11session.display_number);
snprintf(strxauth_exec,199,"%s remove :%d",xauth_path,x11session.display_number);
fpxauth = popen(strxauth_exec,"r");
if(fpxauth == NULL)
return 0;
pclose(fpxauth);
strxauth_exec[0] = '\0';
snprintf(strxauth_exec,199,"%s add unix:%d %s %s",xauth_path,x11session.display_number,x11session.x11_auth_protocol,x11session.x11_auth_cookie);
printf("\nstrxauth_exec = %s",strxauth_exec);
fpxauth = popen(strxauth_exec,"r");
if(fpxauth == NULL)
return 0;
pclose(fpxauth);
return ret;
}
int session_setup_x11fwd(ssh_session session)
{
int ret = 1;
int *sockets; //jeetu - sufficient array size?
WaitThreadData *waitdata;
sockets = malloc( (sizeof(int) * 10) );
x11_create_display_inet(session,&x11session.display_number,sockets);
//wait_for_something(session,sockets);
printf("\nsockets[0] = %d session = %d",sockets[0],session);
waitdata = thread_data_new();
waitdata->session = session;
waitdata->sockets = sockets;
g_thread_create(wait_for_something,waitdata,FALSE,NULL);
//free(sockets);
return ret;
}
int x11_create_display_inet(ssh_session session,unsigned int *display_numberp, int *sockets)
{
int ret = 1;
int display_num = 0,sock = 0,num_socks = 0;
unsigned int port = 0;
struct addrinfo hints, *ai, *aitop;
char strport[NI_MAXSERV];
int gaierr,n,socks[NUM_SOCKS];
int x11_display_offset = 10; //jeetu - temporarily hardcoded here
ssh_channel nc;
for(display_num = x11_display_offset; display_num < MAX_DISPLAYS; display_num++)
{
port = 6000 + display_num;
//hints.ai_family = IPv4or6;
hints.ai_family = AF_INET;
//hints.ai_flags = x11_use_localhost ? 0: AI_PASSIVE;
hints.ai_flags = 0; //jeetu - temporarily hardcoded
hints.ai_socktype = SOCK_STREAM;
snprintf(strport, sizeof strport, "%d", port);
if((gaierr = getaddrinfo(NULL, strport, &hints, &aitop)) != 0)
{
printf("\ngetaddrinfo: %s",gai_strerror(gaierr));
return 0;
}
for(ai = aitop; ai; ai = ai->ai_next)
{
if(ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
continue;
sock = socket(ai->ai_family, ai->ai_socktype,ai->ai_protocol);
if(sock < 0)
{
if((errno != EINVAL) && (errno != EAFNOSUPPORT))
{
printf("\nsocket: %s", strerror(errno));
freeaddrinfo(aitop);
return 0;
}
else
{
printf("\nx11_create_display_inet: Socket family %d not supported",ai->ai_family);
continue;
}
}
// if(ai->ai_family == AF_INET6)
// sock_set_v6only(sock);
// if(x11_use_localhost)
// channel_set_reuseaddr(sock);
if(bind(sock, ai->ai_addr, ai->ai_addrlen) < 0)
{
printf("bind port %d: %s", port, strerror(errno));
close(sock);
for(n = 0; n < num_socks; n++)
{
close(socks[n]);
}
num_socks = 0;
break;
}
socks[num_socks++] = sock;
if(num_socks == NUM_SOCKS)
break;
}
freeaddrinfo(aitop);
if(num_socks > 0)
break;
}
if(display_num >= MAX_DISPLAYS)
{
printf("\nFailed to allocate internet-domain X11 display socket.");
return 0;
}
/* Start listening for connections on the socket. */
for(n = 0; n < num_socks; n++)
{
sock = socks[n];
*(sockets+n) = sock;
if(listen(sock, SSH_LISTEN_BACKLOG) < 0)
{
printf("\nlisten: %s", strerror(errno));
close(sock);
return 0;
}
}
*display_numberp = display_num;
return ret;
}
//int wait_for_something(ssh_session session,int *sockets)
static gpointer wait_for_something(gpointer user_data)
{
int ret = 1;
fd_set infds, testfds;
struct timeval tv = { 15, 0 };
int maxfds = 0;
int nready;
int client_sock, cli_len;
struct sockaddr_in cli_addr, serv_addr;
ssh_event event;
short events;
ssh_channel chan_x11=0;
WaitThreadData *data;
data = user_data;
FD_ZERO(&infds);
FD_SET(data->sockets[0], &infds);
printf("\ndata->sockets[0] = %d",data->sockets[0]);
maxfds = data->sockets[0];
while(1)
{
testfds = infds;
printf("\nwait_for_something: before select");
tv.tv_sec = 15;
nready = select(maxfds + 1, &testfds, NULL, NULL, &tv);
if(nready == -1)
{
printf("\nselect error: %s\n",strerror(errno));
}
if(nready > 0)
{
printf("\nwait_for_something: nready > 0");
if(FD_ISSET(data->sockets[0], &testfds))
{
printf("\nFD_ISSET\n");
cli_len = sizeof (cli_addr);
bzero((char *) &cli_addr, sizeof (cli_addr));
client_sock = accept(data->sockets[0], (struct sockaddr *) &cli_addr, &cli_len);
printf("\nclient_sock = %d",client_sock);
chan_x11 = ssh_channel_new(data->session);
printf("\nchan_x11 session = %d\n",data->session);
if(ssh_channel_open_x11(chan_x11,"127.0.0.1",6010) == SSH_ERROR)
{
printf("ssh_channel_open_x11 error : %s\n",ssh_get_error(chan_x11));
return NULL;
}
else
printf("\nssh_channel_open_x11\n");
cb.userdata = &client_sock;
ssh_callbacks_init(&cb);
ssh_set_channel_callbacks(chan_x11, &cb);
events = POLLIN | POLLPRI | POLLERR | POLLHUP | POLLNVAL;
printf("\nafter events = ");
event = ssh_event_new();
if(event == NULL)
{
printf("Couldn't get a event\n");
return NULL;
}
else
printf("\nevent != NULL");
if(ssh_event_add_fd(event, client_sock, events, copy_fd_to_chan, chan_x11) != SSH_OK)
{
printf("Couldn't add an fd to the event\n");
}
else
printf("\nAdded fd to event");
if(ssh_event_add_session(event, data->session) != SSH_OK)
{
printf("Couldn't add the session to the event\n");
return NULL;
}
else
printf("\nadded the session to the event");
do {
ssh_event_dopoll(event, 1000);
} while(!ssh_channel_is_closed(chan_x11));
printf("\nssh_channel_open_x11: channel closed\n");
ssh_event_remove_fd(event, client_sock);
ssh_event_remove_session(event, data->session);
ssh_event_free(event);
}
}
}
//return ret;
return NULL;
}
static int copy_fd_to_chan(socket_t fd, int revents, void *userdata)
{
ssh_channel chan = (ssh_channel)userdata;
char buf[64000];
int sz = 0;
if(!chan) {
close(fd);
return -1;
}
if(revents & POLLIN) {
sz = read(fd, buf, 64000);
if(sz == 0)
{
ssh_channel_close(chan);
sz = -1;
}
if(sz > 0) {
ssh_channel_write(chan, buf, sz);
}
}
if(revents & POLLHUP) {
ssh_channel_close(chan);
sz = -1;
}
return sz;
}
static int copy_chan_to_fd(ssh_session session,
ssh_channel channel,
void *data,
uint32_t len,
int is_stderr,
void *userdata)
{
int fd = *(int*)userdata;
int sz;
(void)session;
(void)channel;
(void)is_stderr;
sz = write(fd, data, len);
return sz;
}
static void chan_close(ssh_session session, ssh_channel channel, void *userdata)
{
int fd = *(int*)userdata;
(void)session;
(void)channel;
close(fd);
}
static WaitThreadData * thread_data_new (void)
{
WaitThreadData *data;
data = g_new0 (WaitThreadData, 1);
return data;
}
/*
void poll_events(ssh_session session,ssh_channel chan_x11,ssh_event event,int client_sock)
{
do {
ssh_event_dopoll(event, 1000);
} while(!ssh_channel_is_closed(chan_x11));
ssh_event_remove_fd(event, client_sock);
ssh_event_remove_session(event, session);
ssh_event_free(event);
}
*/
/*
do
{
message=ssh_message_get(session);
if(message)
{
switch(ssh_message_type(message))
{
case SSH_REQUEST_CHANNEL_OPEN:
if(ssh_message_subtype(message)==SSH_CHANNEL_SESSION)
{
chan=ssh_message_channel_request_open_reply_accept(message);
break;
}
default:
ssh_message_reply_default(message);
}
ssh_message_free(message);
}
} while(message && !chan);
if(!chan)
{
printf("error : %s\n",ssh_get_error(session));
ssh_finalize();
return 1;
}
do {
message=ssh_message_get(session);
if(message && ssh_message_type(message)==SSH_REQUEST_CHANNEL &&
ssh_message_subtype(message)==SSH_CHANNEL_REQUEST_X11)
{
x11_auth_protocol = malloc(MAX_X11_AUTH_PROTO_STR_SZ+2);
strncpy(x11_auth_protocol,ssh_message_channel_request_x11_auth_protocol(message),MAX_X11_AUTH_PROTO_STR_SZ+1);
x11_auth_protocol[MAX_X11_AUTH_PROTO_STR_SZ] = '\0';
if(strncmp(x11_auth_protocol,"MIT-MAGIC-COOKIE-1",MAX_X11_AUTH_PROTO_STR_SZ+1) == 0)
{
x11_auth_cookie = malloc(MAX_X11_AUTH_COOKIE_STR_SZ+2);
strncpy(x11_auth_cookie,ssh_message_channel_request_x11_auth_cookie(message),MAX_X11_AUTH_COOKIE_STR_SZ+1);
x11_auth_cookie[MAX_X11_AUTH_COOKIE_STR_SZ] = '\0';
printf("\nx11_auth_protocol=%s\nx11_auth_cookie=%s",x11_auth_protocol,x11_auth_cookie);
sftp=1;
ssh_message_channel_request_reply_success(message);
break;
}
}
if(!sftp)
{
ssh_message_reply_default(message);
}
ssh_message_free(message);
} while (message && !sftp);
if(!sftp)
{
printf("error : %s\n",ssh_get_error(session));
return 1;
}
printf("\nit works !\n");
do {
message=ssh_message_get(session);
if(message && ssh_message_type(message)==SSH_REQUEST_CHANNEL &&
ssh_message_subtype(message)==SSH_CHANNEL_REQUEST_EXEC)
{
exec_req=1;
ssh_message_channel_request_reply_success(message);
break;
}
}while(!exec_req);
// use xauth to add display,protocol string and cookie to the Xauthority file
execl("/usr/bin/xauth","/usr/bin/xauth","add",":0",x11_auth_protocol,x11_auth_cookie,(char *) NULL);
r = ssh_channel_open_x11(chan,"127.0.0.1",6093);
if(r==SSH_ERROR)
{
printf("ssh_channel_open_x11 error : %s\n",ssh_get_error(chan));
return 1;
}
rc = ssh_channel_request_exec(chan, "xeyes");
if(rc < 0)
{
printf("\nssh_channel_request_exec rc < 0");
}
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
while (nbytes > 0) {
if (fwrite(buffer, 1, nbytes, stdout) != (unsigned int) nbytes) {
goto failed;
}
nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);
}
if (nbytes < 0) {
goto failed;
}
buf=buffer_new();
do
{
i=channel_read_buffer(chan,buf,0,0);
if(i>0)
write(1,buffer_get(buf),buffer_get_len(buf));
} while (i>0);
*/
| Re: ssh_handle_packets blocking issue | "jeetu.golani@xxxxxxxxx" <jeetu.golani@xxxxxxxxx> |
| Re: ssh_handle_packets blocking issue | "Sharon Heath" <Sharon.Heath@xxxxxxxxxxxxxxxxxxxxxx> |
| Re: ssh_handle_packets blocking issue | "jeetu.golani@xxxxxxxxx" <jeetu.golani@xxxxxxxxx> |
| Re: ssh_handle_packets blocking issue | Andreas Schneider <asn@xxxxxxxxxxxxxx> |
| Re: ssh_handle_packets blocking issue | "jeetu.golani@xxxxxxxxx" <jeetu.golani@xxxxxxxxx> |
| Re: ssh_handle_packets blocking issue | Aris Adamantiadis <aris@xxxxxxxxxxxx> |
| Re: ssh_handle_packets blocking issue | Mikhail Kulinich <tysonite@xxxxxxxxx> |
| Re: ssh_handle_packets blocking issue | Aris Adamantiadis <aris@xxxxxxxxxxxx> |
| Re: ssh_handle_packets blocking issue | Mikhail Kulinich <tysonite@xxxxxxxxx> |
| Re: ssh_handle_packets blocking issue | "jeetu.golani@xxxxxxxxx" <jeetu.golani@xxxxxxxxx> |
| Re: ssh_handle_packets blocking issue | "jeetu.golani@xxxxxxxxx" <jeetu.golani@xxxxxxxxx> |
| Re: ssh_handle_packets blocking issue | Aris Adamantiadis <aris@xxxxxxxxxxxx> |