unix_client.c
author viric@mandarina
Mon, 28 Apr 2008 21:37:16 +0200
changeset 89 2692e4742267
parent 76 5c0b9c9f9801
permissions -rw-r--r--
Moving the utils from stdinmix to tm.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53
07500c5c53cb Adding license and web html.
viric@llimona
parents: 43
diff changeset
     1
/*
07500c5c53cb Adding license and web html.
viric@llimona
parents: 43
diff changeset
     2
    Terminal Mixer - multi-point multi-user access to terminal applications
07500c5c53cb Adding license and web html.
viric@llimona
parents: 43
diff changeset
     3
    Copyright (C) 2007  LluĂ­s Batlle i Rossell
07500c5c53cb Adding license and web html.
viric@llimona
parents: 43
diff changeset
     4
07500c5c53cb Adding license and web html.
viric@llimona
parents: 43
diff changeset
     5
    Please find the license in the provided COPYING file.
07500c5c53cb Adding license and web html.
viric@llimona
parents: 43
diff changeset
     6
*/
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     7
#include <sys/un.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     8
#include <sys/socket.h>
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
     9
#include <unistd.h>
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    10
#include <assert.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    11
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    12
#include "main.h"
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    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
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    15
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    16
static int conn_socket = -1;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    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
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    20
void c_unix_connect_socket()
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    21
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    22
    struct sockaddr_un addr;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    23
    int res;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    24
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    25
    assert(command_line.unix_path != 0);
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    26
    assert(conn_socket == -1);
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    27
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    28
    conn_socket = socket(AF_UNIX, SOCK_STREAM, 0);
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    29
    if (conn_socket == -1)
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    30
        error("Cannot create the unix connect socket in the client");
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    31
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    32
    addr.sun_family = AF_UNIX;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    33
    strncpy(addr.sun_path, command_line.unix_path, sizeof(addr.sun_path));
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    34
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    35
    res = connect(conn_socket, (struct sockaddr *) &addr, sizeof(addr));
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    36
    if (res == -1)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    37
        error("Cannot connect to %s", command_line.unix_path);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    38
}
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    39
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    40
void c_unix_prepare_read_fdset(fd_set *read_set, int *maxfd)
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    41
{
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    42
    FD_SET(conn_socket, read_set); /* For reading other side's close() */
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    43
    *maxfd = max(*maxfd, conn_socket);
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    44
}
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    45
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    46
/* Send -1 on eof */
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    47
int c_unix_process_read_fdset(fd_set *read_set)
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    48
{
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    49
    int res;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    50
    if (FD_ISSET(conn_socket, read_set))
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    51
    {
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    52
        int olen;
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    53
        res = read(conn_socket, stream_buffer, stream_buffer_size);
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    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
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    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
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    67
    }
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    68
    return 0;
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    69
}
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    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
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    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
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    75
}