unix_server.c
author viric@llimona
Mon, 24 Sep 2007 13:59:40 +0200
changeset 38 f1e581c862d5
parent 37 b0588bddef91
child 40 da3ea7f666e3
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 <stdlib.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     2
#include <assert.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     3
#include <unistd.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     4
#include <stdio.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     5
#include <sys/un.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     6
#include <sys/socket.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     7
#include <sys/select.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     8
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     9
#include "main.h"
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    10
#include "handlers.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
static int served_sockets = 0;
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
static int listen_socket = -1; /* not listening */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    15
static int connected_sockets = 0;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    16
static int *conn_sockets = 0;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    17
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    18
static char *socket_path = 0;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    19
22
9f3dc8a25c60 Moving from stdinmix to mt at binary name.
viric@llimona
parents: 21
diff changeset
    20
static char default_path_prefix[] = "/tmp/mt-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
void get_unix_path()
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    23
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    24
    char *new;
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
    new = getenv("SM_SOCKET");
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    27
    if (new == 0) /* Compose the path from the default values */
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
        char num[20]; /* enough for an int */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    30
        int len;
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
        sprintf(num, "%i", (int) getuid());
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    33
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    34
        len = strlen(default_path_prefix) + strlen(num) + 1;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    35
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    36
        command_line.unix_path = malloc(len);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    37
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    38
        sprintf(command_line.unix_path, "%s%s",
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    39
                default_path_prefix, num);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    40
    } else
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    41
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    42
        command_line.unix_path = malloc(strlen(new) + 1);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    43
        strcpy(command_line.unix_path, new);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    44
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    45
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    46
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    47
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    48
static void start_listening(int new)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    49
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    50
    int ls;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    51
    struct sockaddr_un addr;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    52
    int res;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    53
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    54
    assert(new > 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    55
    assert(command_line.unix_path != 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    56
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    57
    socket_path = command_line.unix_path;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    58
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    59
    ls = socket(AF_UNIX, SOCK_STREAM, 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    60
    if (ls == -1)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    61
        error("Cannot create the unix listen socket in the server");
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    62
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    63
    addr.sun_family = AF_UNIX;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    64
    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path));
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    65
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    66
    res = bind(ls, (struct sockaddr *) & addr, sizeof(addr));
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    67
    if (res == -1)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    68
        error("Error binding to %s", socket_path);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    69
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    70
    /* NUANCE: 0 backlog. Why should we assure future connections? */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    71
    res = listen(ls, 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    72
    if (res == -1)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    73
        error("Error listening on the binded unix socket");
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    74
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    75
    listen_socket = ls;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    76
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    77
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    78
void s_unix_update_served(int new)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    79
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    80
    if (new > served_sockets && new > 0 )
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    81
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    82
        conn_sockets = realloc(conn_sockets, sizeof(*conn_sockets) * new);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    83
        if (listen_socket == -1) /* not listening */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    84
        {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    85
            start_listening(new);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    86
        }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    87
        served_sockets = new;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    88
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    89
    else if (new < served_sockets)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    90
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    91
        not_implemented("new < served_sockets at unix_update_served");
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    92
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    93
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    94
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    95
void s_unix_shutdown()
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    96
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    97
    int i;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    98
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    99
    if (listen_socket != -1)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   100
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   101
        close(listen_socket);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   102
        unlink(socket_path);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   103
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   104
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   105
    for (i=0; i < connected_sockets; ++i)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   106
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   107
        close(conn_sockets[i]);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   108
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   109
    connected_sockets = 0;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   110
    served_sockets = 0;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   111
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   112
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   113
void s_unix_prepare_read_fdset(fd_set *read_set, int *maxfd)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   114
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   115
    int i;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   116
37
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   117
    FD_SET(listen_socket, read_set);
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   118
    *maxfd = max(*maxfd, listen_socket);
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   119
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   120
    for (i=0; i < connected_sockets; ++i)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   121
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   122
        /* We only accept if we don't have any
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   123
         * connetion opened. */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   124
        FD_SET(conn_sockets[i], read_set);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   125
        *maxfd = max(*maxfd, conn_sockets[i]);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   126
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   127
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   128
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   129
static void remove_conn_socket(int n)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   130
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   131
    int i;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   132
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   133
    assert(n >= 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   134
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   135
    for(i=n+1; i<connected_sockets; ++i)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   136
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   137
        conn_sockets[i-1] = conn_sockets[i];
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   138
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   139
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   140
    connected_sockets -= 1;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   141
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   142
    /* We shrink the memory until we have an array for served_sockets */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   143
    if (served_sockets <= connected_sockets)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   144
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   145
        conn_sockets = realloc(conn_sockets, sizeof(*conn_sockets)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   146
                * connected_sockets);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   147
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   148
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   149
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   150
static int accept_connection(int ls)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   151
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   152
    int cs;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   153
    cs = accept(ls, 0, 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   154
    if (cs == -1)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   155
        not_implemented("accept unix socket error check");
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   156
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   157
    /* TODO: Prepare unblocking sockets if needed */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   158
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   159
    return cs;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   160
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   161
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   162
void s_unix_process_read_fdset(fd_set *read_set)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   163
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   164
    int i;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   165
    /* Active streams */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   166
    for (i=0; i < connected_sockets; ++i)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   167
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   168
        if (FD_ISSET(conn_sockets[i], read_set))
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   169
        {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   170
            int res;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   171
            res = read(conn_sockets[i], stream_buffer,
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   172
                    stream_buffer_size);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   173
            if (res == 0)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   174
            {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   175
                close(conn_sockets[i]);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   176
                remove_conn_socket(i);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   177
            } else
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   178
            {
32
df110f784648 Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents: 22
diff changeset
   179
                app_control_remote_send_to_stdin(stream_buffer, res);
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   180
            }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   181
        }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   182
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   183
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   184
    /* Listen connection */
37
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   185
    if (FD_ISSET(listen_socket, read_set))
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   186
    {
37
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   187
        if (served_sockets > connected_sockets)
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   188
        {
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
   189
            int s;
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
   190
            s = accept_connection(listen_socket);
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
   191
            conn_sockets[connected_sockets++] = s;
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
   192
            welcome_new_client_socket(s);
37
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   193
        } else
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   194
        {
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   195
            int s;
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   196
            s = accept_connection(listen_socket);
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   197
            close(s);
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   198
        }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   199
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   200
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   201
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   202
void s_unix_send_to_connected(const char *buffer, size_t size)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   203
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   204
    int i;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   205
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   206
    for (i=0; i < connected_sockets; ++i)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   207
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   208
        write(conn_sockets[i], buffer, size);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   209
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   210
}