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);