main.c
author viric@llimona
Fri, 14 Sep 2007 22:23:04 +0200
changeset 11 b93316813d7a
parent 9 d688e3670487
child 12 6a372f8b4b8a
permissions -rw-r--r--
Hint for xbindkeysrc.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
     1
#include <stdio.h>
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
     2
#include <stdlib.h>
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
     3
#include <sys/types.h>
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
     4
#include <unistd.h>
5
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
     5
#include <errno.h>
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
     6
3
909bca647298 Renaming now correct.
viric@llimona
parents: 2
diff changeset
     7
#include "main.h"
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
     8
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
     9
static int max(int a, int b)
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    10
{
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    11
    if (a > b)
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    12
        return a;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    13
    return b;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    14
}
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    15
9
d688e3670487 statics and consts.
viric@llimona
parents: 7
diff changeset
    16
static int fork_app(int *opipe, char * const command[])
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    17
{
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    18
    int p_input[2]; /* from mpg321 to us */
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    19
    int p_output[2]; /* from us to mpg321 */
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    20
    int pid;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    21
    int res;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    22
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    23
    pipe(p_input);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    24
    pipe(p_output);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    25
    opipe[0] = p_input[0]; /* For us to read */
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    26
    opipe[1] = p_output[1]; /* For us to write */
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    27
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    28
    pid = fork();
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    29
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    30
    switch(pid)
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    31
    {
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    32
        case 0: /* child */
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    33
            close(p_input[0]);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    34
            res = dup2(p_input[1], 1);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    35
            if (res == -1) perror("Dup2 1");
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    36
            res = dup2(p_input[1], 2);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    37
            if (res == -1) perror("Dup2 2");
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    38
            close(p_input[1]);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    39
            close(p_output[1]);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    40
            res = dup2(p_output[0], 0);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    41
            if (res == -1) perror("Dup2 3");
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    42
            close(p_output[0]);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    43
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    44
            execvp(command[0], command);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    45
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    46
            perror("Cannot execlp mpg321");
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    47
            exit(-1);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    48
        case -1:
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    49
            perror("Failed fork");
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    50
            exit(-1);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    51
        default: /* parent */
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    52
            close(p_input[1]);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    53
            close(p_output[0]);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    54
    }
7
af8d59476914 Added signal passing.
viric@llimona
parents: 6
diff changeset
    55
af8d59476914 Added signal passing.
viric@llimona
parents: 6
diff changeset
    56
    return pid;
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    57
}
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    58
9
d688e3670487 statics and consts.
viric@llimona
parents: 7
diff changeset
    59
static int forward_app_data(int in, int out)
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    60
{
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    61
    char buf[100];
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    62
    int res;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    63
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    64
    res = read(in, buf, sizeof(buf));
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    65
    if (res > 0)
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    66
        write(out, buf, res);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    67
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    68
    return res;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    69
}
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    70
9
d688e3670487 statics and consts.
viric@llimona
parents: 7
diff changeset
    71
static void loop(const int *child_pipe, int lsocket)
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    72
{
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    73
    char buf[100];
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    74
    fd_set read_set;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    75
    int child_read, child_write;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    76
    int maxfd;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    77
    int opened_socket;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    78
    int stdin_opened;
5
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
    79
    int res;
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    80
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    81
    child_read = child_pipe[0];
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    82
    child_write = child_pipe[1];
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    83
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    84
    stdin_opened = 1;
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    85
    opened_socket = -1; /* no socket opened */
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    86
    do
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    87
    {
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    88
        FD_ZERO(&read_set);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    89
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    90
        if (stdin_opened)
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    91
            FD_SET(0, &read_set);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
    92
        FD_SET(child_read, &read_set);
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    93
        maxfd = child_read;
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    94
        if (opened_socket >= 0)
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    95
        {
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    96
            FD_SET(opened_socket, &read_set);
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    97
            maxfd = max(maxfd, opened_socket);
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    98
        }
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
    99
        else
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   100
        {
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   101
            /* We only accept if we don't have any
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   102
             * connetion opened. */
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   103
            FD_SET(lsocket, &read_set);
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   104
            maxfd = max(maxfd, lsocket);
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   105
        }
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   106
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   107
        /* Will block */
5
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   108
        res = select(maxfd + 1, &read_set, 0, 0, 0);
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   109
        if (res == -1)
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   110
        {
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   111
            if (errno == EINTR)
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   112
                continue;
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   113
            else
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   114
                error("Error in select()");
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   115
        }
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   116
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   117
        if (FD_ISSET(child_read, &read_set))
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   118
        {
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   119
            res = forward_app_data(child_read, 1);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   120
            if (res == 0)
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   121
                break;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   122
        }
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   123
        if (FD_ISSET(0, &read_set))
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   124
        {
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   125
            res = forward_app_data(0, child_write);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   126
            if (res == 0)
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   127
            {
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   128
                close(child_write);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   129
                stdin_opened = 0;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   130
            }
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   131
        }
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   132
        if (opened_socket >= 0 && FD_ISSET(opened_socket, &read_set))
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   133
        {
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   134
            res = forward_app_data(opened_socket, child_write);
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   135
            if (res == 0)
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   136
            {
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   137
                close(opened_socket);
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   138
                opened_socket = -1; /* no socket open */
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   139
            }
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   140
        }
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   141
        if (opened_socket == -1 && FD_ISSET(lsocket, &read_set))
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   142
        {
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   143
            opened_socket = accept_connection(lsocket);
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   144
        }
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   145
    } while(1);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   146
}
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   147
9
d688e3670487 statics and consts.
viric@llimona
parents: 7
diff changeset
   148
static int server(int argn, char * const argv[])
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   149
{
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   150
    int p[2];
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   151
    int lsocket;
7
af8d59476914 Added signal passing.
viric@llimona
parents: 6
diff changeset
   152
    int child;
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   153
7
af8d59476914 Added signal passing.
viric@llimona
parents: 6
diff changeset
   154
    child = fork_app(p, &argv[1]);
af8d59476914 Added signal passing.
viric@llimona
parents: 6
diff changeset
   155
af8d59476914 Added signal passing.
viric@llimona
parents: 6
diff changeset
   156
    install_signal_forwarders(child);
0
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   157
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   158
    lsocket = serve_socket();
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   159
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   160
    loop(p, lsocket);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   161
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   162
    remove_socket(lsocket);
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   163
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   164
    return 0;
3bbacfe6797a Something bare.
viric@llimona
parents:
diff changeset
   165
}
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   166
9
d688e3670487 statics and consts.
viric@llimona
parents: 7
diff changeset
   167
static int client()
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   168
{
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   169
    int cs;
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   170
    int res;
5
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   171
    fd_set read_set;
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   172
    int maxfd;
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   173
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   174
    cs = connect_socket();
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   175
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   176
    do
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   177
    {
5
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   178
        FD_ZERO(&read_set);
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   179
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   180
        FD_SET(cs, &read_set); /* For reading other side's close() */
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   181
        maxfd = cs;
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   182
        FD_SET(0, &read_set); /* stdin */
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   183
        maxfd = max(maxfd, cs);
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   184
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   185
        res = select(maxfd + 1, &read_set, 0, 0, 0);
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   186
        if (res == -1)
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   187
        {
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   188
            if (errno == EINTR)
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   189
                continue;
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   190
            else
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   191
                error("Error in select()");
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   192
        }
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   193
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   194
        if (FD_ISSET(cs, &read_set))
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   195
        {
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   196
            /* assuming close() on the other side, even
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   197
             * without read(). */
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   198
            break;
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   199
        }
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   200
        if (FD_ISSET(0, &read_set))
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   201
        {
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   202
            res = forward_app_data(0, cs);
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   203
            if (res == 0) /* EOF */
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   204
                break;
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   205
        }
5ed1654fe407 Better client.
viric@llimona
parents: 3
diff changeset
   206
    } while (1);
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   207
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   208
    close(cs);
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   209
    return 0;
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   210
}
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   211
6
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   212
static int showhelp(const char *pname)
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   213
{
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   214
    printf("sdtdin-mix - Copyright 2007 LluĂ­s Batlle i Rossell\n");
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   215
    printf("usage: %s [appcommand] [param1] [param2] ...\n", pname);
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   216
    printf(" If you give _appcommand_, it starts the application and\n");
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   217
    printf(" a stdin server on $SM_SOCKET or /tmp/socket-sm.UID.\n");
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   218
    printf(" If not given, it starts a stdin client for the same socket.\n");
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   219
    return 0;
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   220
}
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   221
9
d688e3670487 statics and consts.
viric@llimona
parents: 7
diff changeset
   222
int main(int argn, char * const * argv)
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   223
{
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   224
    int res;
6
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   225
    if (argn > 1 && strcmp(argv[1], "-h") == 0)
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   226
        res = showhelp(argv[0]);
4fe857c0b12a Help message.
viric@llimona
parents: 5
diff changeset
   227
    else if (argn > 1)
1
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   228
        res = server(argn, argv);
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   229
    else
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   230
        res = client();
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   231
    return res;
473a340551e3 Basic functionality.
viric@llimona
parents: 0
diff changeset
   232
}