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