unix_server.c
author viric@mandarina
Mon, 28 Apr 2008 21:42:48 +0200
changeset 92 faf9db07c037
parent 53 07500c5c53cb
permissions -rw-r--r--
Makefile with 'install'
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53
07500c5c53cb Adding license and web html.
viric@llimona
parents: 40
diff changeset
     1
/*
07500c5c53cb Adding license and web html.
viric@llimona
parents: 40
diff changeset
     2
    Terminal Mixer - multi-point multi-user access to terminal applications
07500c5c53cb Adding license and web html.
viric@llimona
parents: 40
diff changeset
     3
    Copyright (C) 2007  LluĂ­s Batlle i Rossell
07500c5c53cb Adding license and web html.
viric@llimona
parents: 40
diff changeset
     4
07500c5c53cb Adding license and web html.
viric@llimona
parents: 40
diff changeset
     5
    Please find the license in the provided COPYING file.
07500c5c53cb Adding license and web html.
viric@llimona
parents: 40
diff changeset
     6
*/
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     7
#include <stdlib.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     8
#include <assert.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
     9
#include <unistd.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    10
#include <stdio.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    11
#include <sys/un.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    12
#include <sys/socket.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    13
#include <sys/select.h>
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    14
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    15
#include "main.h"
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    16
#include "handlers.h"
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 int served_sockets = 0;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    19
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    20
static int listen_socket = -1; /* not listening */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    21
static int connected_sockets = 0;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    22
static int *conn_sockets = 0;
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
static char *socket_path = 0;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    25
40
da3ea7f666e3 Fixed env vars and paths for the unix socket.
viric@llimona
parents: 37
diff changeset
    26
static char default_path_prefix[] = "/tmp/tm-socket.";
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    27
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    28
void get_unix_path()
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    29
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    30
    char *new;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    31
    
40
da3ea7f666e3 Fixed env vars and paths for the unix socket.
viric@llimona
parents: 37
diff changeset
    32
    new = getenv("TM_SOCKET");
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    33
    if (new == 0) /* Compose the path from the default values */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    34
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    35
        char num[20]; /* enough for an int */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    36
        int 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(num, "%i", (int) getuid());
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    39
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    40
        len = strlen(default_path_prefix) + strlen(num) + 1;
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(len);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    43
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    44
        sprintf(command_line.unix_path, "%s%s",
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    45
                default_path_prefix, num);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    46
    } else
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
        command_line.unix_path = malloc(strlen(new) + 1);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    49
        strcpy(command_line.unix_path, new);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    50
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    51
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    52
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
static void start_listening(int new)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    55
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    56
    int ls;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    57
    struct sockaddr_un addr;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    58
    int res;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    59
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    60
    assert(new > 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    61
    assert(command_line.unix_path != 0);
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
    socket_path = command_line.unix_path;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    64
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    65
    ls = socket(AF_UNIX, SOCK_STREAM, 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    66
    if (ls == -1)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    67
        error("Cannot create the unix listen socket in the server");
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    68
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    69
    addr.sun_family = AF_UNIX;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    70
    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path));
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    71
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    72
    res = bind(ls, (struct sockaddr *) & addr, sizeof(addr));
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    73
    if (res == -1)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    74
        error("Error binding to %s", socket_path);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    75
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    76
    /* NUANCE: 0 backlog. Why should we assure future connections? */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    77
    res = listen(ls, 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    78
    if (res == -1)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    79
        error("Error listening on the binded unix socket");
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    80
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    81
    listen_socket = ls;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    82
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    83
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    84
void s_unix_update_served(int new)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    85
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    86
    if (new > served_sockets && new > 0 )
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    87
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    88
        conn_sockets = realloc(conn_sockets, sizeof(*conn_sockets) * new);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
    89
        if (listen_socket == -1) /* not listening */
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
            start_listening(new);
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
        served_sockets = new;
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
    else if (new < served_sockets)
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
        not_implemented("new < served_sockets at unix_update_served");
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
}
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
void s_unix_shutdown()
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   102
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   103
    int i;
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
    if (listen_socket != -1)
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(listen_socket);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   108
        unlink(socket_path);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   109
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   110
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   111
    for (i=0; i < connected_sockets; ++i)
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
        close(conn_sockets[i]);
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
    connected_sockets = 0;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   116
    served_sockets = 0;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   117
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   118
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   119
void s_unix_prepare_read_fdset(fd_set *read_set, int *maxfd)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   120
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   121
    int i;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   122
37
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   123
    FD_SET(listen_socket, read_set);
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   124
    *maxfd = max(*maxfd, listen_socket);
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   125
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   126
    for (i=0; i < connected_sockets; ++i)
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
        /* We only accept if we don't have any
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   129
         * connetion opened. */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   130
        FD_SET(conn_sockets[i], read_set);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   131
        *maxfd = max(*maxfd, conn_sockets[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
}
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
static void remove_conn_socket(int n)
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
    int 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
    assert(n >= 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   140
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   141
    for(i=n+1; i<connected_sockets; ++i)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   142
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   143
        conn_sockets[i-1] = conn_sockets[i];
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
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   146
    connected_sockets -= 1;
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
    /* We shrink the memory until we have an array for served_sockets */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   149
    if (served_sockets <= connected_sockets)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   150
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   151
        conn_sockets = realloc(conn_sockets, sizeof(*conn_sockets)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   152
                * connected_sockets);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   153
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   154
}
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   155
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   156
static int accept_connection(int ls)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   157
{
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   158
    int cs;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   159
    cs = accept(ls, 0, 0);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   160
    if (cs == -1)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   161
        not_implemented("accept unix socket error check");
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   162
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   163
    /* TODO: Prepare unblocking sockets if needed */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   164
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   165
    return cs;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   166
}
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
void s_unix_process_read_fdset(fd_set *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 i;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   171
    /* Active streams */
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   172
    for (i=0; i < connected_sockets; ++i)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   173
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   174
        if (FD_ISSET(conn_sockets[i], read_set))
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   175
        {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   176
            int res;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   177
            res = read(conn_sockets[i], stream_buffer,
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   178
                    stream_buffer_size);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   179
            if (res == 0)
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
                close(conn_sockets[i]);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   182
                remove_conn_socket(i);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   183
            } else
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   184
            {
32
df110f784648 Added read-only clients, added stdin-close option to clients.
lbatlle@npdl268.bpo.hp.com
parents: 22
diff changeset
   185
                app_control_remote_send_to_stdin(stream_buffer, res);
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   186
            }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   187
        }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   188
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   189
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   190
    /* Listen connection */
37
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   191
    if (FD_ISSET(listen_socket, read_set))
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   192
    {
37
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   193
        if (served_sockets > connected_sockets)
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   194
        {
36
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
   195
            int s;
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
   196
            s = accept_connection(listen_socket);
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
   197
            conn_sockets[connected_sockets++] = s;
da427c23d755 Added dumps, telnet_filter, applied filters in tm, improved telnet experience.
viric@llimona
parents: 34
diff changeset
   198
            welcome_new_client_socket(s);
37
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   199
        } else
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   200
        {
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   201
            int s;
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   202
            s = accept_connection(listen_socket);
b0588bddef91 Option for xterm resizing. Over max connections, close() at once.
viric@llimona
parents: 36
diff changeset
   203
            close(s);
21
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   204
        }
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
}
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
void s_unix_send_to_connected(const char *buffer, size_t 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
    int i;
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   211
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   212
    for (i=0; i < connected_sockets; ++i)
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   213
    {
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   214
        write(conn_sockets[i], buffer, size);
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   215
    }
a82c88322eb5 Big change, from stdinmix to multiterminal.
viric@llimona
parents:
diff changeset
   216
}