unix_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:
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     1
#include <sys/un.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     2
#include <sys/socket.h>
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
     3
#include <unistd.h>
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     4
#include <assert.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     5
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     6
#include "main.h"
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
     7
#include "handlers.h"
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
     8
#include "filter.h"
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     9
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    10
static int conn_socket = -1;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    11
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    12
extern struct FilterRules *client_fr;
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    13
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    14
void c_unix_connect_socket()
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    15
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    16
    struct sockaddr_un addr;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    17
    int res;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    18
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    19
    assert(command_line.unix_path != 0);
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    20
    assert(conn_socket == -1);
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    21
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    22
    conn_socket = socket(AF_UNIX, SOCK_STREAM, 0);
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    23
    if (conn_socket == -1)
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    24
        error("Cannot create the unix connect socket in the client");
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    25
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    26
    addr.sun_family = AF_UNIX;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    27
    strncpy(addr.sun_path, command_line.unix_path, sizeof(addr.sun_path));
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    28
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    29
    res = connect(conn_socket, (struct sockaddr *) &addr, sizeof(addr));
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    30
    if (res == -1)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    31
        error("Cannot connect to %s", command_line.unix_path);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    32
}
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    33
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    34
void c_unix_prepare_read_fdset(fd_set *read_set, int *maxfd)
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    35
{
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    36
    FD_SET(conn_socket, read_set); /* For reading other side's close() */
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    37
    *maxfd = max(*maxfd, conn_socket);
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    38
}
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    39
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    40
/* Send -1 on eof */
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    41
int c_unix_process_read_fdset(fd_set *read_set)
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    42
{
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    43
    int res;
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    44
    if (FD_ISSET(conn_socket, read_set))
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    45
    {
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    46
        int olen;
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    47
        res = read(conn_socket, stream_buffer, stream_buffer_size);
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    48
        if (res == 0) /* EOF */
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    49
        {
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    50
            filter_flush(client_fr, ostream_buffer, &olen);
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    51
            if (olen > 0)
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    52
                send_to_client_stdout(ostream_buffer, olen);
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    53
            return -1;
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    54
        }
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    55
        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
    56
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    57
        filter_stream(client_fr, ostream_buffer, &olen, stream_buffer,
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    58
                res);
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    59
        if (olen > 0)
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 24
diff changeset
    60
            send_to_client_stdout(ostream_buffer, olen);
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    61
    }
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    62
    return 0;
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents: 21
diff changeset
    63
}
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    64
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    65
void c_unix_send(const char *buf, int len)
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: 24
diff changeset
    67
    hex_dump("send_unix_client",buf, len);
24
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    68
    write(conn_socket, stream_buffer, len);
03ddd5ab560b Moving to modules.
viric@llimona
parents: 23
diff changeset
    69
}