gen_sockets.c
author viric@llimona
Thu, 27 Sep 2007 00:25:54 +0200
changeset 58 2cf8c513d18f
parent 53 07500c5c53cb
child 66 b2469563a1dc
permissions -rw-r--r--
added authors.
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;
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    16
int stream_buffer_size;
34
7486e269b794 Added filter engine, xterm resize.
viric@mandarina
parents: 21
diff changeset
    17
int ostream_buffer_size;
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    18
34
7486e269b794 Added filter engine, xterm resize.
viric@mandarina
parents: 21
diff changeset
    19
void init_stream_buffers()
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    20
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    21
    if (stream_buffer == 0)
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
        assert(command_line.buffer_size > 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    24
        stream_buffer_size = command_line.buffer_size;
34
7486e269b794 Added filter engine, xterm resize.
viric@mandarina
parents: 21
diff changeset
    25
        ostream_buffer_size = command_line.buffer_size;
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    26
        stream_buffer = (char *) malloc(stream_buffer_size);
34
7486e269b794 Added filter engine, xterm resize.
viric@mandarina
parents: 21
diff changeset
    27
        ostream_buffer = (char *) malloc(ostream_buffer_size);
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    28
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    29
}
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    30
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    31
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
    32
{
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    33
    char *term;
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    34
    term = getenv("TERM");
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    35
    /* 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
    36
    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
    37
    {
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    38
        char *xterm_str;
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    39
        xterm_str = get_xterm_resize_string();
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    40
          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
    41
        send(s, xterm_str, strlen(xterm_str), 0);
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    42
    }
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    43
}
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    44
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    45
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
    46
{
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    47
  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
    48
  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
    49
  send(s, seq, sizeof seq, 0);
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    50
}
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    51
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    52
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
    53
{
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    54
  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
    55
  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
    56
  send(s, seq, sizeof seq, 0);
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    57
}
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
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
    60
{
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    61
    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
    62
    {
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    63
        telnet_send_noecho(s);
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
    64
        telnet_send_suppress_go_ahead(s);
37
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
    65
    }
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
    66
    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
    67
        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
    68
}