author | viric@mandarina |
Mon, 28 Apr 2008 21:37:16 +0200 | |
changeset 89 | 2692e4742267 |
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 <sys/un.h> |
8 |
#include <sys/socket.h> |
|
24 | 9 |
#include <unistd.h> |
21 | 10 |
#include <assert.h> |
11 |
||
12 |
#include "main.h" |
|
24 | 13 |
#include "handlers.h" |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
14 |
#include "filter.h" |
21 | 15 |
|
24 | 16 |
static int conn_socket = -1; |
17 |
||
70
51e9b56b487b
New client filter in raw mode (-t), where ^] closes the client.
viric@mandarina
parents:
53
diff
changeset
|
18 |
extern struct FilterRules *client_recv_fr; |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
19 |
|
24 | 20 |
void c_unix_connect_socket() |
21 | 21 |
{ |
22 |
struct sockaddr_un addr; |
|
23 |
int res; |
|
24 |
||
25 |
assert(command_line.unix_path != 0); |
|
24 | 26 |
assert(conn_socket == -1); |
21 | 27 |
|
24 | 28 |
conn_socket = socket(AF_UNIX, SOCK_STREAM, 0); |
29 |
if (conn_socket == -1) |
|
21 | 30 |
error("Cannot create the unix connect socket in the client"); |
31 |
||
32 |
addr.sun_family = AF_UNIX; |
|
33 |
strncpy(addr.sun_path, command_line.unix_path, sizeof(addr.sun_path)); |
|
34 |
||
24 | 35 |
res = connect(conn_socket, (struct sockaddr *) &addr, sizeof(addr)); |
21 | 36 |
if (res == -1) |
37 |
error("Cannot connect to %s", command_line.unix_path); |
|
38 |
} |
|
23 | 39 |
|
40 |
void c_unix_prepare_read_fdset(fd_set *read_set, int *maxfd) |
|
41 |
{ |
|
24 | 42 |
FD_SET(conn_socket, read_set); /* For reading other side's close() */ |
43 |
*maxfd = max(*maxfd, conn_socket); |
|
23 | 44 |
} |
45 |
||
24 | 46 |
/* Send -1 on eof */ |
47 |
int c_unix_process_read_fdset(fd_set *read_set) |
|
23 | 48 |
{ |
24 | 49 |
int res; |
50 |
if (FD_ISSET(conn_socket, read_set)) |
|
51 |
{ |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
52 |
int olen; |
24 | 53 |
res = read(conn_socket, stream_buffer, stream_buffer_size); |
54 |
if (res == 0) /* EOF */ |
|
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
55 |
{ |
70
51e9b56b487b
New client filter in raw mode (-t), where ^] closes the client.
viric@mandarina
parents:
53
diff
changeset
|
56 |
filter_flush(client_recv_fr, ostream_buffer, &olen); |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
57 |
if (olen > 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
58 |
send_to_client_stdout(ostream_buffer, olen); |
24 | 59 |
return -1; |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
60 |
} |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
61 |
hex_dump("recv_unix_client",stream_buffer, res); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
62 |
|
70
51e9b56b487b
New client filter in raw mode (-t), where ^] closes the client.
viric@mandarina
parents:
53
diff
changeset
|
63 |
filter_stream(client_recv_fr, ostream_buffer, &olen, stream_buffer, |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
64 |
res); |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
65 |
if (olen > 0) |
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
66 |
send_to_client_stdout(ostream_buffer, olen); |
24 | 67 |
} |
68 |
return 0; |
|
23 | 69 |
} |
24 | 70 |
|
43
625794738afc
Added first attempt for an ethernet protocol. Even not tried.
viric@llimona
parents:
36
diff
changeset
|
71 |
void c_unix_send(const char *buf, size_t len) |
24 | 72 |
{ |
36
da427c23d755
Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents:
24
diff
changeset
|
73 |
hex_dump("send_unix_client",buf, len); |
76
5c0b9c9f9801
Fixed filter, and the client now parses ~~~ and ~~. (closing client)
viric@llimona
parents:
70
diff
changeset
|
74 |
write(conn_socket, buf, len); |
24 | 75 |
} |