client.c
author viric@llimona
Thu, 27 Sep 2007 00:25:54 +0200
changeset 58 2cf8c513d18f
parent 53 07500c5c53cb
child 60 18c24be2b1a6
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: 49
diff changeset
     1
/*
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     2
    Terminal Mixer - multi-point multi-user access to terminal applications
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     3
    Copyright (C) 2007  LluĂ­s Batlle i Rossell
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     4
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     5
    Please find the license in the provided COPYING file.
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     6
*/
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     7
#include <stdio.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     8
#include <stdlib.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     9
#include <sys/types.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    10
#include <sys/select.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    11
#include <unistd.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    12
#include <errno.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    13
#include <string.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    14
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    15
#include "main.h"
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    16
#include "filter.h"
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    17
#include "handlers.h"
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    18
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    19
struct FilterRules *client_fr = 0;
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    20
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    21
static void loop(Net_c_prepare_read_fdset net_prepare,
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    22
        Net_c_process_read_fdset net_process,
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    23
        Net_c_send net_send)
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    24
{
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    25
    fd_set read_set;
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    26
    int maxfd;
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    27
    int res;
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    28
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    29
    do
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    30
    {
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    31
        FD_ZERO(&read_set);
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    32
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    33
        FD_SET(0, &read_set); /* stdin */
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    34
        maxfd = 0;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    35
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    36
        net_prepare(&read_set, &maxfd);
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    37
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    38
        res = select(maxfd + 1, &read_set, 0, 0, 0);
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    39
        if (res == -1)
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    40
        {
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    41
            if (errno == EINTR)
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    42
                continue;
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    43
            else
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    44
                error("Error in select()");
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    45
        }
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    46
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    47
        res = net_process(&read_set);
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    48
        if (res == -1) /* EOF */
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    49
            break;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    50
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    51
        if (FD_ISSET(0, &read_set))
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    52
        {
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    53
            res = read(0, stream_buffer, stream_buffer_size);
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    54
            if (res == 0) /* EOF */
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    55
                break;
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    56
            net_send(stream_buffer, res);
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    57
        }
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    58
    } while (1);
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    59
}
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    60
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    61
int client()
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    62
{
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    63
    Net_c_prepare_read_fdset net_prepare_read_fdset;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    64
    Net_c_process_read_fdset net_process_read_fdset;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    65
    Net_c_send net_send;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    66
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    67
    /* Prepare the filter */
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    68
    {
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    69
        struct FFilter *ff;
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    70
        client_fr = new_filter_rules();
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    71
        ff = new_ftelnet();
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    72
        add_ffilter(client_fr, ff);
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    73
    }
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    74
29
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    75
    if (command_line.c_param.transport == UNIX)
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    76
        /* Will be 'tcp', 'ether', ... */
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    77
    {
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    78
        c_unix_connect_socket();
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    79
        net_prepare_read_fdset = c_unix_prepare_read_fdset;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    80
        net_process_read_fdset = c_unix_process_read_fdset;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    81
        net_send = c_unix_send;
49
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 43
diff changeset
    82
    }
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 43
diff changeset
    83
#ifdef linux
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 43
diff changeset
    84
    else if (command_line.c_param.transport == ETHERNET)
43
625794738afc Added first attempt for an ethernet protocol. Even not tried.
viric@llimona
parents: 36
diff changeset
    85
    {
625794738afc Added first attempt for an ethernet protocol. Even not tried.
viric@llimona
parents: 36
diff changeset
    86
        c_eth_init();
625794738afc Added first attempt for an ethernet protocol. Even not tried.
viric@llimona
parents: 36
diff changeset
    87
        net_prepare_read_fdset = c_eth_prepare_read_fdset;
625794738afc Added first attempt for an ethernet protocol. Even not tried.
viric@llimona
parents: 36
diff changeset
    88
        net_process_read_fdset = c_eth_process_read_fdset;
625794738afc Added first attempt for an ethernet protocol. Even not tried.
viric@llimona
parents: 36
diff changeset
    89
        net_send = c_eth_send_to_connected;
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    90
    }
49
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 43
diff changeset
    91
#endif /* linux */
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    92
29
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    93
    if (command_line.c_param.raw_mode)
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    94
        prepare_user_terminal();
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents: 24
diff changeset
    95
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    96
    loop(net_prepare_read_fdset, net_process_read_fdset, net_send);
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    97
29
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    98
    if (command_line.c_param.raw_mode)
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    99
        restore_user_terminal();
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents: 24
diff changeset
   100
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   101
    return 0;
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   102
}