14 #include <sys/types.h>
24 sel_rfd
*netr
, *ptyr
, *sigr
;
31 void sigchld(int signum
)
33 write(signalpipe
[1], "C", 1);
36 void fatal(const char *fmt
, ...)
39 fprintf(stderr
, "FIXME: ");
41 vfprintf(stderr
, fmt
, ap
);
43 fprintf(stderr
, "\n");
47 void net_readdata(sel_rfd
*rfd
, void *data
, size_t len
)
50 exit(0); /* EOF on network - client went away */
51 telnet_from_net(telnet
, data
, len
);
52 if (sel_write(netw
, NULL
, 0) > BUF
)
54 if (sel_write(ptyw
, NULL
, 0) > BUF
)
58 void net_readerr(sel_rfd
*rfd
, int error
)
60 fprintf(stderr
, "standard input: read: %s\n", strerror(errno
));
64 void net_written(sel_wfd
*wfd
, size_t bufsize
)
67 sel_rfd_unfreeze(ptyr
);
70 void net_writeerr(sel_wfd
*wfd
, int error
)
72 fprintf(stderr
, "standard input: write: %s\n", strerror(errno
));
76 void pty_readdata(sel_rfd
*rfd
, void *data
, size_t len
)
79 exit(0); /* EOF on pty */
80 telnet_from_pty(telnet
, data
, len
);
81 if (sel_write(netw
, NULL
, 0) > BUF
)
83 if (sel_write(ptyw
, NULL
, 0) > BUF
)
87 void pty_readerr(sel_rfd
*rfd
, int error
)
89 if (error
== EIO
) /* means EOF, on a pty */
91 fprintf(stderr
, "pty: read: %s\n", strerror(errno
));
95 void pty_written(sel_wfd
*wfd
, size_t bufsize
)
98 sel_rfd_unfreeze(netr
);
101 void pty_writeerr(sel_wfd
*wfd
, int error
)
103 fprintf(stderr
, "pty: write: %s\n", strerror(errno
));
107 void sig_readdata(sel_rfd
*rfd
, void *data
, size_t len
)
114 pid_t pid
= waitpid(-1, &status
, WNOHANG
);
115 if (WIFEXITED(status
) || WIFSIGNALED(status
))
116 exit(0); /* child process vanished */
121 void sig_readerr(sel_rfd
*rfd
, int error
)
123 fprintf(stderr
, "signal pipe: read: %s\n", strerror(errno
));
127 int main(int argc
, char **argv
)
130 int shell_started
= 0;
131 char *directory
= NULL
;
132 char **program_args
= NULL
;
134 if (argc
> 1 && argv
[1][0]) {
139 program_args
= argv
+ 1;
144 asel
= sel_new(NULL
);
145 netr
= sel_rfd_add(asel
, 0, net_readdata
, net_readerr
, NULL
);
146 netw
= sel_wfd_add(asel
, 1, net_written
, net_writeerr
, NULL
);
147 ptyr
= sel_rfd_add(asel
, -1, pty_readdata
, pty_readerr
, NULL
);
148 ptyw
= sel_wfd_add(asel
, -1, pty_written
, pty_writeerr
, NULL
);
150 telnet
= telnet_new(netw
, ptyw
);
152 if (pipe(signalpipe
) < 0) {
156 sigr
= sel_rfd_add(asel
, signalpipe
[0], sig_readdata
,
159 signal(SIGCHLD
, sigchld
);
162 struct shell_data shdata
;
164 ret
= sel_iterate(asel
, -1);
165 if (!shell_started
&& telnet_shell_ok(telnet
, &shdata
)) {
166 ptyfd
= run_program_in_pty(&shdata
, directory
, program_args
);
167 sel_rfd_setfd(ptyr
, ptyfd
);
168 sel_wfd_setfd(ptyw
, ptyfd
);