author | viric@llimona |
Mon, 24 Sep 2007 13:59:40 +0200 | |
changeset 38 | f1e581c862d5 |
parent 36 | da427c23d755 |
child 41 | 954941c6e40a |
permissions | -rw-r--r-- |
21 | 1 |
#include <stdlib.h> |
24 | 2 |
#include <unistd.h> |
21 | 3 |
#include <assert.h> |
26
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
4 |
#include <errno.h> |
21 | 5 |
#include <sys/select.h> |
6 |
||
7 |
#include "main.h" |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
8 |
#include "filter.h" |
21 | 9 |
#include "handlers.h" |
10 |
||
11 |
/* it uses app_stdin, app_stdout, app_stderr. |
|
12 |
* They have value -1 if not opened. */ |
|
13 |
||
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
14 |
static struct FilterRules *fr; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
15 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
16 |
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
|
17 |
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
|
18 |
const char *ibuf, int pos) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
19 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
20 |
obuf[(*olen)++] = '\n'; |
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 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
23 |
void app_control_start() |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
24 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
25 |
struct FFilter *ff; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
26 |
fr = new_filter_rules(); |
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 |
/* 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
|
29 |
ff = new_ftelnet(); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
30 |
add_ffilter(fr, ff); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
31 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
32 |
/* The client will send \r\0 on enter */ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
33 |
ff = new_fstring_len("\r\0", 2); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
34 |
ff->callback = write_newline_cb; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
35 |
add_ffilter(fr, ff); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
36 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
37 |
/* We should trim the no operation characters '\0'. |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
38 |
* We rely on the filter application order. First \r\0 above, |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
39 |
* then \0. */ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
40 |
ff = new_fstring_len("\0", 1); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
41 |
add_ffilter(fr, ff); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
42 |
} |
21 | 43 |
|
44 |
void app_control_shutdown() |
|
45 |
{ |
|
46 |
} |
|
47 |
||
48 |
void app_control_prepare_read_fdset(fd_set *read_set, int *maxfd) |
|
49 |
{ |
|
50 |
assert(app_stdout != -1 || app_stderr != -1); |
|
51 |
||
52 |
if (app_stdout != -1) |
|
53 |
{ |
|
54 |
FD_SET(app_stdout, read_set); |
|
55 |
*maxfd = max(*maxfd, app_stdout); |
|
56 |
} |
|
57 |
||
25 | 58 |
if (app_stderr != -1 && app_stdout != app_stderr) |
21 | 59 |
{ |
60 |
FD_SET(app_stderr, read_set); |
|
61 |
*maxfd = max(*maxfd, app_stderr); |
|
62 |
} |
|
63 |
} |
|
64 |
||
65 |
/* Return -1, finished stdout/stderr. Else, return 0. */ |
|
66 |
int app_control_process_read_fdset(fd_set *read_set) |
|
67 |
{ |
|
68 |
if (app_stdout != -1 && FD_ISSET(app_stdout, read_set)) |
|
69 |
{ |
|
70 |
int res; |
|
71 |
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
|
72 |
if (res == -1 && errno == EIO) |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
73 |
{ |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
74 |
/* 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
|
75 |
app_stdout = -1; |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
76 |
app_stdin = -1; |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
77 |
return -1; |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
78 |
} |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
79 |
if (res == -1 ) |
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
80 |
error("Error reading from app."); |
21 | 81 |
if (res == 0) |
82 |
{ |
|
83 |
close(app_stdout); |
|
84 |
close(1); /* MOVE */ |
|
85 |
app_stdout = -1; |
|
26
96920c3707b3
Unix sockets version works! Well, signals don't. :)
viric@llimona
parents:
25
diff
changeset
|
86 |
if (app_stdout == app_stderr || app_stderr == -1) |
21 | 87 |
return -1; |
88 |
} else |
|
89 |
{ |
|
90 |
/* MOVE */ |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
91 |
hex_dump("from app", stream_buffer, res); |
21 | 92 |
write(1, stream_buffer, res); |
33 | 93 |
if (command_line.s_param.serve_unix) |
94 |
s_unix_send_to_connected(stream_buffer, res); |
|
95 |
if (command_line.s_param.serve_tcp) |
|
96 |
s_tcp_send_to_connected(stream_buffer, res); |
|
21 | 97 |
} |
98 |
} |
|
25 | 99 |
if (app_stderr != -1 && app_stdout != app_stderr && |
100 |
FD_ISSET(app_stderr, read_set)) |
|
21 | 101 |
{ |
102 |
int res; |
|
103 |
res = read(app_stderr, stream_buffer, stream_buffer_size); |
|
104 |
if (res == 0) |
|
105 |
{ |
|
106 |
close(app_stderr); |
|
107 |
close(2); /* MOVE */ |
|
108 |
app_stderr = -1; |
|
109 |
if (app_stdout == -1) |
|
110 |
return -1; |
|
111 |
} else |
|
112 |
{ |
|
113 |
/* MOVE */ |
|
114 |
write(2, stream_buffer, res); |
|
33 | 115 |
|
116 |
if (command_line.s_param.serve_unix) |
|
117 |
s_unix_send_to_connected(stream_buffer, res); |
|
118 |
if (command_line.s_param.serve_tcp) |
|
119 |
s_tcp_send_to_connected(stream_buffer, res); |
|
21 | 120 |
} |
121 |
} |
|
122 |
return 0; |
|
123 |
} |
|
124 |
||
32
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
125 |
void app_control_local_send_to_stdin(const char *buffer, size_t size) |
21 | 126 |
{ |
127 |
if (size == 0) |
|
128 |
close(app_stdin); |
|
129 |
else |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
130 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
131 |
hex_dump("from local to app", buffer, size); |
21 | 132 |
write(app_stdin, buffer, size); |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
133 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
134 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
135 |
|
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
136 |
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
|
137 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
138 |
if (size > 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
139 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
140 |
hex_dump("to app", buffer, size); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
141 |
if(command_line.s_param.echo_in_local_terminal) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
142 |
write(1, buffer, size); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
143 |
write(app_stdin, buffer, size); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
144 |
} |
21 | 145 |
} |
32
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
146 |
|
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
147 |
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
|
148 |
{ |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
149 |
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
|
150 |
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
|
151 |
{ |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
152 |
int osize; |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
153 |
if (size > 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
154 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
155 |
filter_stream(fr, ostream_buffer, &osize, |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
156 |
buffer, size); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
157 |
if (osize > 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
158 |
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
|
159 |
} else if (size == 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
160 |
{ |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
161 |
filter_flush(fr, ostream_buffer, &osize); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
162 |
if (osize > 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
163 |
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
|
164 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
33
diff
changeset
|
165 |
|
32
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
166 |
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
|
167 |
close(app_stdin); |
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
168 |
} |
df110f784648
Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents:
26
diff
changeset
|
169 |
} |