author | viric <viriketo@gmail.com> |
Wed, 16 Feb 2011 20:57:32 +0100 | |
branch | saveflie |
changeset 94 | 330324fc7c20 |
parent 76 | 5c0b9c9f9801 |
permissions | -rw-r--r-- |
53 | 1 |
/* |
2 |
Terminal Mixer - multi-point multi-user access to terminal applications |
|
3 |
Copyright (C) 2007 LluĂs Batlle i Rossell |
|
4 |
||
5 |
Please find the license in the provided COPYING file. |
|
6 |
*/ |
|
21 | 7 |
#include <unistd.h> |
8 |
#include <stdlib.h> |
|
9 |
#include <assert.h> |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
10 |
#include <string.h> |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
11 |
#include <sys/socket.h> |
21 | 12 |
#include "main.h" |
13 |
||
14 |
char *stream_buffer = 0; |
|
34 | 15 |
char *ostream_buffer = 0; |
76
5c0b9c9f9801
Fixed filter, and the client now parses ~~~ and ~~. (closing client)
viric@llimona
parents:
74
diff
changeset
|
16 |
char *ostream_buffer2 = 0; |
21 | 17 |
int stream_buffer_size; |
34 | 18 |
int ostream_buffer_size; |
76
5c0b9c9f9801
Fixed filter, and the client now parses ~~~ and ~~. (closing client)
viric@llimona
parents:
74
diff
changeset
|
19 |
int ostream_buffer2_size; |
21 | 20 |
|
34 | 21 |
void init_stream_buffers() |
21 | 22 |
{ |
23 |
if (stream_buffer == 0) |
|
24 |
{ |
|
66
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
25 |
int eth_buf; |
21 | 26 |
assert(command_line.buffer_size > 0); |
66
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
27 |
|
21 | 28 |
stream_buffer_size = command_line.buffer_size; |
66
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
29 |
#ifdef linux |
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
30 |
if ((command_line.is_server && command_line.s_param.serve_eth) |
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
31 |
|| (!command_line.is_server && command_line.c_param.transport == ETHERNET)) |
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
32 |
{ |
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
33 |
eth_buf = eth_proto_max_send(); |
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
34 |
stream_buffer_size = min(command_line.buffer_size, eth_buf); |
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
35 |
} |
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
36 |
#endif |
76
5c0b9c9f9801
Fixed filter, and the client now parses ~~~ and ~~. (closing client)
viric@llimona
parents:
74
diff
changeset
|
37 |
stream_buffer = (char *) malloc(stream_buffer_size); |
5c0b9c9f9801
Fixed filter, and the client now parses ~~~ and ~~. (closing client)
viric@llimona
parents:
74
diff
changeset
|
38 |
|
66
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
39 |
ostream_buffer_size = stream_buffer_size; |
34 | 40 |
ostream_buffer = (char *) malloc(ostream_buffer_size); |
76
5c0b9c9f9801
Fixed filter, and the client now parses ~~~ and ~~. (closing client)
viric@llimona
parents:
74
diff
changeset
|
41 |
ostream_buffer2_size = stream_buffer_size; |
5c0b9c9f9801
Fixed filter, and the client now parses ~~~ and ~~. (closing client)
viric@llimona
parents:
74
diff
changeset
|
42 |
ostream_buffer2 = (char *) malloc(ostream_buffer_size); |
21 | 43 |
} |
44 |
} |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
45 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
46 |
static void send_xterm_resize_string_to_socket(int s) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
47 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
48 |
char *term; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
49 |
term = getenv("TERM"); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
50 |
/* I prefer it to send the xterm string always. */ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
51 |
if (1 || term == 0 || strcmp(term, "xterm") == 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
52 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
53 |
char *xterm_str; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
54 |
xterm_str = get_xterm_resize_string(); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
55 |
hex_dump("xterm_resize", xterm_str, strlen(xterm_str)); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
56 |
send(s, xterm_str, strlen(xterm_str), 0); |
74 | 57 |
hex_dump("xterm string sent", xterm_str, strlen(xterm_str)); |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
58 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
59 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
60 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
61 |
static void telnet_send_noecho(int s) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
62 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
63 |
char seq[] = { 255 /*IAC*/, 251 /*WILL*/, 1 /*ECHO*/ }; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
64 |
hex_dump("telnet_send_noecho", seq, sizeof seq); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
65 |
send(s, seq, sizeof seq, 0); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
66 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
67 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
68 |
static void telnet_send_suppress_go_ahead(int s) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
69 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
70 |
char seq[] = { 255 /*IAC*/, 251 /*WILL*/, 3 /*ECHO*/ }; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
71 |
hex_dump("telnet_send_suppress_go_ahead", seq, sizeof seq); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
72 |
send(s, seq, sizeof seq, 0); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
73 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
74 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
75 |
void welcome_new_client_socket(int s) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
76 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
77 |
if (command_line.s_param.run_in_subterminal) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
78 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
79 |
telnet_send_noecho(s); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
80 |
telnet_send_suppress_go_ahead(s); |
37
b0588bddef91
Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents:
36
diff
changeset
|
81 |
} |
b0588bddef91
Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents:
36
diff
changeset
|
82 |
if (command_line.s_param.send_xterm_resize) |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
83 |
send_xterm_resize_string_to_socket(s); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
34
diff
changeset
|
84 |
} |