author | viric@llimona |
Mon, 08 Oct 2007 12:59:27 +0200 | |
changeset 79 | 7d316733d4b1 |
parent 72 | d42f36e87bf3 |
child 82 | 5cbe47923060 |
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 <stdlib.h> |
24 | 8 |
#include <unistd.h> |
21 | 9 |
#include <assert.h> |
26
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
10 |
#include <errno.h> |
21 | 11 |
#include <sys/select.h> |
12 |
||
13 |
#include "main.h" |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
14 |
#include "filter.h" |
21 | 15 |
#include "handlers.h" |
16 |
||
17 |
/* it uses app_stdin, app_stdout, app_stderr. |
|
18 |
* They have value -1 if not opened. */ |
|
19 |
||
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
20 |
static struct FilterRules *fr; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
21 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
22 |
void write_newline_cb(struct FilterRules *myfr, |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
23 |
const struct FFilter *ff, char *obuf, int *olen, |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
24 |
const char *ibuf, int pos) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
25 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
26 |
obuf[(*olen)++] = '\n'; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
27 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
28 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
29 |
void app_control_start() |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
30 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
31 |
struct FFilter *ff; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
32 |
fr = new_filter_rules(); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
33 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
34 |
/* We don't pay attention to any telnet command */ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
35 |
ff = new_ftelnet(); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
36 |
add_ffilter(fr, ff); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
37 |
|
72 | 38 |
/* The raw terminal will send \r, |
39 |
* telnet will send \r\0. If we filter all \0, we're fine. |
|
40 |
* I used to change \r to \n here... It works better if I don't. */ |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
41 |
|
72 | 42 |
/* We should trim the telnet's no-operation characters '\0'. */ |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
43 |
ff = new_fstring_len("\0", 1); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
44 |
add_ffilter(fr, ff); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
45 |
} |
21 | 46 |
|
47 |
void app_control_shutdown() |
|
48 |
{ |
|
49 |
} |
|
50 |
||
51 |
void app_control_prepare_read_fdset(fd_set *read_set, int *maxfd) |
|
52 |
{ |
|
53 |
assert(app_stdout != -1 || app_stderr != -1); |
|
54 |
||
55 |
if (app_stdout != -1) |
|
56 |
{ |
|
57 |
FD_SET(app_stdout, read_set); |
|
58 |
*maxfd = max(*maxfd, app_stdout); |
|
59 |
} |
|
60 |
||
25 | 61 |
if (app_stderr != -1 && app_stdout != app_stderr) |
21 | 62 |
{ |
63 |
FD_SET(app_stderr, read_set); |
|
64 |
*maxfd = max(*maxfd, app_stderr); |
|
65 |
} |
|
66 |
} |
|
67 |
||
68 |
/* Return -1, finished stdout/stderr. Else, return 0. */ |
|
69 |
int app_control_process_read_fdset(fd_set *read_set) |
|
70 |
{ |
|
71 |
if (app_stdout != -1 && FD_ISSET(app_stdout, read_set)) |
|
72 |
{ |
|
73 |
int res; |
|
74 |
res = read(app_stdout, stream_buffer, stream_buffer_size); |
|
26
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
75 |
if (res == -1 && errno == EIO) |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
76 |
{ |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
77 |
/* I've noticed that when the app dies, read() returns EIO */ |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
78 |
app_stdout = -1; |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
79 |
app_stdin = -1; |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
80 |
return -1; |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
81 |
} |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
82 |
if (res == -1 ) |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
83 |
error("Error reading from app."); |
21 | 84 |
if (res == 0) |
85 |
{ |
|
86 |
close(app_stdout); |
|
41 | 87 |
if (!command_line.s_param.nohup) |
88 |
close(1); |
|
26
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
89 |
if (app_stdout == app_stderr || app_stderr == -1) |
21 | 90 |
return -1; |
49
1cead94cfd99
Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents:
44
diff
changeset
|
91 |
app_stdout = -1; |
21 | 92 |
} else |
93 |
{ |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
94 |
hex_dump("from app", stream_buffer, res); |
41 | 95 |
if (!command_line.s_param.nohup) |
96 |
write(1, stream_buffer, res); |
|
33 | 97 |
if (command_line.s_param.serve_unix) |
98 |
s_unix_send_to_connected(stream_buffer, res); |
|
99 |
if (command_line.s_param.serve_tcp) |
|
100 |
s_tcp_send_to_connected(stream_buffer, res); |
|
49
1cead94cfd99
Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents:
44
diff
changeset
|
101 |
#ifdef linux |
44 | 102 |
if (command_line.s_param.serve_eth) |
103 |
s_eth_send_to_connected(stream_buffer, res); |
|
49
1cead94cfd99
Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents:
44
diff
changeset
|
104 |
#endif /* linux */ |
21 | 105 |
} |
106 |
} |
|
25 | 107 |
if (app_stderr != -1 && app_stdout != app_stderr && |
108 |
FD_ISSET(app_stderr, read_set)) |
|
21 | 109 |
{ |
110 |
int res; |
|
111 |
res = read(app_stderr, stream_buffer, stream_buffer_size); |
|
112 |
if (res == 0) |
|
113 |
{ |
|
114 |
close(app_stderr); |
|
115 |
close(2); /* MOVE */ |
|
116 |
app_stderr = -1; |
|
117 |
if (app_stdout == -1) |
|
118 |
return -1; |
|
119 |
} else |
|
120 |
{ |
|
41 | 121 |
if (!command_line.s_param.nohup) |
122 |
write(2, stream_buffer, res); |
|
33 | 123 |
|
124 |
if (command_line.s_param.serve_unix) |
|
125 |
s_unix_send_to_connected(stream_buffer, res); |
|
126 |
if (command_line.s_param.serve_tcp) |
|
127 |
s_tcp_send_to_connected(stream_buffer, res); |
|
49
1cead94cfd99
Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents:
44
diff
changeset
|
128 |
#ifdef linux |
44 | 129 |
if (command_line.s_param.serve_eth) |
130 |
s_eth_send_to_connected(stream_buffer, res); |
|
49
1cead94cfd99
Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents:
44
diff
changeset
|
131 |
#endif /* linux */ |
21 | 132 |
} |
133 |
} |
|
134 |
return 0; |
|
135 |
} |
|
136 |
||
32
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
137 |
void app_control_local_send_to_stdin(const char *buffer, size_t size) |
21 | 138 |
{ |
139 |
if (size == 0) |
|
140 |
close(app_stdin); |
|
141 |
else |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
142 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
143 |
hex_dump("from local to app", buffer, size); |
21 | 144 |
write(app_stdin, buffer, size); |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
145 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
146 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
147 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
148 |
static void write_data_to_app_stdin(const char *buffer, size_t size) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
149 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
150 |
if (size > 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
151 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
152 |
hex_dump("to app", buffer, size); |
41 | 153 |
if( !command_line.s_param.nohup && |
154 |
command_line.s_param.echo_in_local_terminal) |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
155 |
write(1, buffer, size); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
156 |
write(app_stdin, buffer, size); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
157 |
} |
21 | 158 |
} |
32
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
159 |
|
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
160 |
void app_control_remote_send_to_stdin(const char *buffer, size_t size) |
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
161 |
{ |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
162 |
hex_dump("from client prefilter", buffer, size); |
32
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
163 |
if (command_line.s_param.client_can_write) |
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
164 |
{ |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
165 |
int osize; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
166 |
if (size > 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
167 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
168 |
filter_stream(fr, ostream_buffer, &osize, |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
169 |
buffer, size); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
170 |
if (osize > 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
171 |
write_data_to_app_stdin(ostream_buffer, osize); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
172 |
} else if (size == 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
173 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
174 |
filter_flush(fr, ostream_buffer, &osize); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
175 |
if (osize > 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
176 |
write_data_to_app_stdin(ostream_buffer, osize); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
177 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
178 |
|
32
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
179 |
if (size == 0 && command_line.s_param.client_may_close_app_stdin) |
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
180 |
close(app_stdin); |
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
181 |
} |
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
182 |
} |
66
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
183 |
|
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
184 |
void app_control_avoid_sending(fd_set *read_set) |
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
185 |
{ |
b2469563a1dc
Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents:
53
diff
changeset
|
186 |
} |