gen_sockets.c
author viric <viriketo@gmail.com>
Wed, 16 Feb 2011 20:57:32 +0100
branchsaveflie
changeset 94 330324fc7c20
parent 76 5c0b9c9f9801
permissions -rw-r--r--
Adding a feature: save all stdin/stdout traffic of the server into a file.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53
07500c5c53cb Adding license and web html.
viric@llimona
parents: 37
diff changeset
     1
/*
07500c5c53cb Adding license and web html.
viric@llimona
parents: 37
diff changeset
     2
    Terminal Mixer - multi-point multi-user access to terminal applications
07500c5c53cb Adding license and web html.
viric@llimona
parents: 37
diff changeset
     3
    Copyright (C) 2007  LluĂ­s Batlle i Rossell
07500c5c53cb Adding license and web html.
viric@llimona
parents: 37
diff changeset
     4
07500c5c53cb Adding license and web html.
viric@llimona
parents: 37
diff changeset
     5
    Please find the license in the provided COPYING file.
07500c5c53cb Adding license and web html.
viric@llimona
parents: 37
diff changeset
     6
*/
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     7
#include <unistd.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     8
#include <stdlib.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     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
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    12
#include "main.h"
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    13
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    14
char *stream_buffer = 0;
34
7486e269b794 Added filter engine, xterm resize.
viric@mandarina
parents: 21
diff changeset
    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
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    17
int stream_buffer_size;
34
7486e269b794 Added filter engine, xterm resize.
viric@mandarina
parents: 21
diff changeset
    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
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    20
34
7486e269b794 Added filter engine, xterm resize.
viric@mandarina
parents: 21
diff changeset
    21
void init_stream_buffers()
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    22
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    23
    if (stream_buffer == 0)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    24
    {
66
b2469563a1dc Reliable ethernet protocol. I still need pselect instead of select.
viric@mandarina
parents: 53
diff changeset
    25
        int eth_buf;
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    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
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    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
7486e269b794 Added filter engine, xterm resize.
viric@mandarina
parents: 21
diff changeset
    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
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    43
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    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
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 66
diff changeset
    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
}