app_term.c
author viric@mandarina
Thu, 21 Aug 2008 23:21:22 +0200
changeset 93 7d9b7a6da507
parent 82 5cbe47923060
permissions -rw-r--r--
Removing direct references to /usr in the Makefile, for nix.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     1
/*
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     2
    Terminal Mixer - multi-point multi-user access to terminal applications
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     3
    Copyright (C) 2007  LluĂ­s Batlle i Rossell
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     4
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     5
    Please find the license in the provided COPYING file.
07500c5c53cb Adding license and web html.
viric@llimona
parents: 49
diff changeset
     6
*/
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     7
#include <sys/types.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     8
#include <unistd.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
     9
#include <errno.h>
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    10
#include <fcntl.h>
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    11
#include <string.h>
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    12
#include <sys/select.h>
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    13
#include <sys/ioctl.h>
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    14
#include <termios.h>
49
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 47
diff changeset
    15
#ifdef __APPLE__
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 47
diff changeset
    16
  #include <util.h>
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 47
diff changeset
    17
#else
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 47
diff changeset
    18
  #include <pty.h>
1cead94cfd99 Fixing a few bugs. The program runs well in Linux and Mac OS X.
viric@llimona
parents: 47
diff changeset
    19
#endif
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    20
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    21
#include "main.h"
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
    22
41
954941c6e40a Added 'nohup' option -n.
viric@llimona
parents: 29
diff changeset
    23
954941c6e40a Added 'nohup' option -n.
viric@llimona
parents: 29
diff changeset
    24
struct winsize app_winsize; /* for xterm.c */
954941c6e40a Added 'nohup' option -n.
viric@llimona
parents: 29
diff changeset
    25
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    26
enum
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    27
{
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    28
    STDIN,
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    29
    STDOUT,
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    30
    STDERR
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    31
};
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    32
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    33
static void set_close_on_exec(int fd)
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    34
{
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    35
    int res;
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    36
    res = fcntl(fd, F_SETFD, FD_CLOEXEC);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    37
    if (res == -1)
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    38
        error("Set close-on-exec failed");
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    39
}
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    40
74
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    41
void pass_winsize_to_slave()
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    42
{
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    43
    int res;
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    44
    res = ioctl(0, TIOCGWINSZ, (char *) &app_winsize);
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    45
    if (res >= 0)
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    46
        ioctl(app_stdin, TIOCSWINSZ, (char *) &app_winsize);
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    47
}
cb3184566c6e Better xterm resize management.
viric@llimona
parents: 71
diff changeset
    48
82
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    49
void get_term_options(struct termios *tios, struct winsize *wsize)
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    50
{
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    51
    int res;
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    52
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    53
    /* Try to get the config from the actual terminal's stdout */
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    54
    res = tcgetattr(1, tios);
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    55
    if (res == -1)
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    56
    {
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    57
      /* Create the termios structure from scratch */
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    58
      memset(tios, 0, sizeof(*tios));
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    59
      cfmakeraw(tios);
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    60
    }
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    61
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    62
    /* if starting using shells' &, it doesn't get ECHO set.
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    63
     * Let's force it. */
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    64
    tios->c_lflag |= ECHO | ECHOE | ECHOK | ECHONL;
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    65
    /* Try to emulate something compatible with xterm */
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    66
    tios->c_oflag |= OPOST | ONLCR;
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    67
    tios->c_lflag |= ISIG | ICANON | ECHOCTL | ECHOKE;
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    68
    tios->c_iflag |= BRKINT | IGNPAR | IMAXBEL;
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    69
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    70
    /* Get the original term's winsize */
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    71
    res = ioctl(1, TIOCGWINSZ, wsize);
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    72
    if (res == -1)
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    73
    {
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    74
      /* If we don't have original term, create an arbitrary winsize */
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    75
      wsize->ws_row = 25;
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    76
      wsize->ws_col = 80;
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    77
    }
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    78
}
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    79
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    80
static void give_terminal(int parent[], int child[])
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    81
{
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    82
    struct termios tios;
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    83
    struct winsize wsize;
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    84
    int res;
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    85
    int master, slave;
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    86
82
5cbe47923060 Added a terminal-creation capability.
lbatlle@npdl268.bpo.hp.com
parents: 74
diff changeset
    87
    get_term_options(&tios, &wsize);
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    88
41
954941c6e40a Added 'nohup' option -n.
viric@llimona
parents: 29
diff changeset
    89
    app_winsize = wsize;
954941c6e40a Added 'nohup' option -n.
viric@llimona
parents: 29
diff changeset
    90
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    91
    res = openpty(&master, &slave, 0, &tios, &wsize);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    92
    if (res == -1)
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    93
        error("openpty");
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    94
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    95
    parent[STDIN]  = master;
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    96
    parent[STDOUT] = master;
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    97
    parent[STDERR] = master;
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    98
    child[STDIN]  = slave;
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
    99
    child[STDOUT] = slave;
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   100
    child[STDERR] = slave;
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   101
    set_close_on_exec(master);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   102
    set_close_on_exec(slave);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   103
}
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   104
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   105
static void give_pipes(int parent[], int child[])
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   106
{
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   107
    int p_stdin[2]; /* from us to mpg321 */
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   108
    int p_stdout[2]; /* from mpg321 to us */
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   109
    int p_stderr[2]; /* from mpg321 to us, its stderr */
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   110
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   111
    pipe(p_stdin);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   112
    pipe(p_stdout);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   113
    pipe(p_stderr);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   114
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   115
    parent[STDIN]  = p_stdin[1];
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   116
    parent[STDOUT] = p_stdout[0];
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   117
    parent[STDERR] = p_stderr[0];
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   118
    child[STDIN]   = p_stdin[0];
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   119
    child[STDOUT]  = p_stdout[1];
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   120
    child[STDERR]  = p_stderr[1];
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   121
    set_close_on_exec(parent[STDIN]);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   122
    set_close_on_exec(parent[STDOUT]);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   123
    set_close_on_exec(parent[STDERR]);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   124
    set_close_on_exec(child[STDIN]);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   125
    set_close_on_exec(child[STDOUT]);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   126
    set_close_on_exec(child[STDERR]);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   127
}
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   128
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   129
int fork_app(char * const command[])
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   130
{
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   131
    int p_parent[3];
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   132
    int p_child[3];
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   133
    int pid;
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   134
    int res;
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   135
29
91286c3ecebc Added getopt, and some things got based on parameters.
viric@llimona
parents: 28
diff changeset
   136
    if (command_line.s_param.run_in_subterminal)
47
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   137
    {
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents: 25
diff changeset
   138
        give_terminal(p_parent, p_child);
47
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   139
    }
26
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents: 25
diff changeset
   140
    else
96920c3707b3 Unix sockets version works! Well, signals don't. :)
viric@llimona
parents: 25
diff changeset
   141
        give_pipes(p_parent, p_child);
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   142
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   143
    /* globals */
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   144
    app_stdin  = p_parent[STDIN];  /* For us to write */
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   145
    app_stdout = p_parent[STDOUT]; /* For us to read */
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   146
    app_stderr = p_parent[STDERR]; /* For us to read */
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   147
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   148
    pid = fork();
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   149
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   150
    switch(pid)
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   151
    {
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   152
        case 0: /* child */
71
c209487034d7 True nohup-like behaviour. Programs ignore to SIGHUP.
viric@llimona
parents: 53
diff changeset
   153
            if (command_line.s_param.nohup)
c209487034d7 True nohup-like behaviour. Programs ignore to SIGHUP.
viric@llimona
parents: 53
diff changeset
   154
                ignore_sighup();
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   155
            res = dup2(p_child[STDIN], 0);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   156
            if (res == -1) error("Dup2 stdin");
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   157
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   158
            res = dup2(p_child[STDOUT], 1);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   159
            if (res == -1) error("Dup2 stdout");
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   160
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   161
            res = dup2(p_child[STDERR], 2);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   162
            if (res == -1) error("Dup2 stderr");
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   163
47
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   164
            if (command_line.s_param.run_in_subterminal)
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   165
            {
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   166
                int res;
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   167
                res = setsid();
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   168
                if (res < 0)
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   169
                  error("failed setsid()");
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   170
                res = ioctl(0, TIOCSCTTY, 0);
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   171
                if (res < 0)
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   172
                  error("failed ioctl(0,TIOCSCTTY,0)");
8dcc45d8f3e5 xterm resizes sent on SIGWINCH. new terminal applications start a new session.
lbatlle@npdl268.bpo.hp.com
parents: 41
diff changeset
   173
            }
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   174
            execvp(command[0], command);
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   175
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   176
            error("Cannot execvp %s", command[0]);
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   177
        case -1:
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   178
            error("Failed fork");
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   179
        default: /* parent */
25
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   180
            close(p_child[STDIN]);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   181
            close(p_child[STDOUT]);
5b5ca60e3646 First try on openpty.
viric@llimona
parents: 23
diff changeset
   182
            close(p_child[STDERR]);
23
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   183
    }
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   184
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   185
    return pid;
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   186
}
b3e6c6ffc69c Moving the client out.
viric@llimona
parents:
diff changeset
   187