client.c
author viric@llimona
Mon, 24 Sep 2007 13:59:40 +0200
changeset 38 f1e581c862d5
parent 36 da427c23d755
child 43 625794738afc
permissions -rw-r--r--
Improved help. Moving to 0.2.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     1
#include <stdio.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     2
#include <stdlib.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     3
#include <sys/types.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     4
#include <sys/select.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     5
#include <unistd.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     6
#include <errno.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     7
#include <string.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     8
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     9
#include "main.h"
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    10
#include "filter.h"
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    11
#include "handlers.h"
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    12
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    13
struct FilterRules *client_fr = 0;
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    14
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    15
static void loop(Net_c_prepare_read_fdset net_prepare,
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    16
        Net_c_process_read_fdset net_process,
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    17
        Net_c_send net_send)
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    18
{
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    19
    fd_set read_set;
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    20
    int maxfd;
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    21
    int res;
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    22
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    23
    do
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    24
    {
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    25
        FD_ZERO(&read_set);
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    26
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    27
        FD_SET(0, &read_set); /* stdin */
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    28
        maxfd = 0;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    29
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    30
        net_prepare(&read_set, &maxfd);
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    31
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    32
        res = select(maxfd + 1, &read_set, 0, 0, 0);
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    33
        if (res == -1)
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    34
        {
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    35
            if (errno == EINTR)
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    36
                continue;
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    37
            else
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    38
                error("Error in select()");
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    39
        }
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    40
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    41
        res = net_process(&read_set);
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    42
        if (res == -1) /* EOF */
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    43
            break;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    44
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    45
        if (FD_ISSET(0, &read_set))
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    46
        {
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    47
            res = read(0, stream_buffer, stream_buffer_size);
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    48
            if (res == 0) /* EOF */
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    49
                break;
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    50
            net_send(stream_buffer, res);
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    51
        }
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    52
    } while (1);
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    53
}
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    54
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    55
int client()
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    56
{
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    57
    Net_c_prepare_read_fdset net_prepare_read_fdset;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    58
    Net_c_process_read_fdset net_process_read_fdset;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    59
    Net_c_send net_send;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    60
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    61
    /* Prepare the filter */
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    62
    {
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    63
        struct FFilter *ff;
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    64
        client_fr = new_filter_rules();
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    65
        ff = new_ftelnet();
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    66
        add_ffilter(client_fr, ff);
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    67
    }
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 29
diff changeset
    68
29
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    69
    if (command_line.c_param.transport == UNIX)
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    70
        /* Will be 'tcp', 'ether', ... */
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    71
    {
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    72
        c_unix_connect_socket();
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    73
        net_prepare_read_fdset = c_unix_prepare_read_fdset;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    74
        net_process_read_fdset = c_unix_process_read_fdset;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    75
        net_send = c_unix_send;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    76
    }
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    77
29
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    78
    if (command_line.c_param.raw_mode)
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    79
        prepare_user_terminal();
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents: 24
diff changeset
    80
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    81
    loop(net_prepare_read_fdset, net_process_read_fdset, net_send);
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    82
29
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    83
    if (command_line.c_param.raw_mode)
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 26
diff changeset
    84
        restore_user_terminal();
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents: 24
diff changeset
    85
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    86
    return 0;
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    87
}