void relay(int s) { char buf[8192]; int n; fd_set readfds; struct ttys *ttyp; /* Don't need our data anymore */ /* XXX This makes SunOS barf */ /* brk(0); */ signal(SIGQUIT, slirp_exit); signal(SIGHUP, slirp_exit); signal(SIGINT, slirp_exit); signal(SIGTERM, slirp_exit); /* Fudge to get term_raw and term_restore to work */ if (NULL == (ttyp = tty_attach (0, slirp_tty))) { lprint ("Error: tty_attach failed in misc.c:relay()\r\n"); slirp_exit (1); } ttyp->fd = 0; ttyp->flags |= TTY_CTTY; term_raw(ttyp); while (1) { FD_ZERO(&readfds); FD_SET(0, &readfds); FD_SET(s, &readfds); n = select(s+1, &readfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0); if (n <= 0) slirp_exit(0); if (FD_ISSET(0, &readfds)) { n = read(0, buf, 8192); if (n <= 0) slirp_exit(0); n = writen(s, buf, n); if (n <= 0) slirp_exit(0); } if (FD_ISSET(s, &readfds)) { n = read(s, buf, 8192); if (n <= 0) slirp_exit(0); n = writen(0, buf, n); if (n <= 0) slirp_exit(0); } } /* Just in case.... */ exit(1); }
void snooze_hup(int num) { int s, ret; #ifndef NO_UNIX_SOCKETS struct sockaddr_un sock_un; #endif struct sockaddr_in sock_in; char buff[256]; ret = -1; if (slirp_socket_passwd) { s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) slirp_exit(1); sock_in.sin_family = AF_INET; sock_in.sin_addr.s_addr = slirp_socket_addr; sock_in.sin_port = htons(slirp_socket_port); if (connect(s, (struct sockaddr *)&sock_in, sizeof(sock_in)) != 0) slirp_exit(1); /* just exit...*/ sprintf(buff, "kill %s:%d", slirp_socket_passwd, slirp_socket_unit); write(s, buff, strlen(buff)+1); } #ifndef NO_UNIX_SOCKETS else { s = socket(AF_UNIX, SOCK_STREAM, 0); if (s < 0) slirp_exit(1); sock_un.sun_family = AF_UNIX; strcpy(sock_un.sun_path, socket_path); if (connect(s, (struct sockaddr *)&sock_un, sizeof(sock_un.sun_family) + sizeof(sock_un.sun_path)) != 0) slirp_exit(1); sprintf(buff, "kill none:%d", slirp_socket_unit); write(s, buff, strlen(buff)+1); } #endif slirp_exit(0); }
/* * if_input - read() the tty, do "top level" processing (ie: check for any escapes), * and pass onto (*ttyp->if_input) * * XXXXX Any zeros arriving by themselves are NOT placed into the arriving packet. */ #define INBUFF_SIZE 2048 /* XXX */ void if_input(struct ttys *ttyp) { u_char if_inbuff[INBUFF_SIZE]; int if_n; DEBUG_CALL("if_input"); DEBUG_ARG("ttyp = %lx", (long)ttyp); if_n = read(ttyp->fd, (char *)if_inbuff, INBUFF_SIZE); DEBUG_MISC((dfd, " read %d bytes\n", if_n)); if (if_n <= 0) { if (if_n == 0 || (errno != EINTR && errno != EAGAIN)) { if (ttyp->up) link_up--; tty_detached(ttyp, 0); } return; } if (if_n == 1) { if (*if_inbuff == '0') { ttyp->ones = 0; if (++ttyp->zeros >= 5) slirp_exit(0); return; } if (*if_inbuff == '1') { ttyp->zeros = 0; if (++ttyp->ones >= 5) tty_detached(ttyp, 0); return; } } ttyp->ones = ttyp->zeros = 0; (*ttyp->if_input)(ttyp, if_inbuff, if_n); }
void tty_detached(struct ttys *ttyp, int exiting) { struct ttys *ttyp_tmp, *ttyp_last = 0; DEBUG_CALL("tty_detached"); DEBUG_ARG("ttyp = %lx", (long)ttyp); DEBUG_ARG("exiting = %d", exiting); /* First, remove ttyp from the queue */ if (ttyp == ttys) { ttys = ttys->next; } else { for (ttyp_tmp = ttys; ttyp_tmp; ttyp_tmp = ttyp_tmp->next) { if (ttyp_tmp == ttyp) break; ttyp_last = ttyp_tmp; } if (!ttyp_last) { /* XXX */ /* Can't find it *shrug* */ return; } ttyp_last->next = ttyp->next; } term_restore(ttyp); #ifdef FULL_BOLT fd_block(ttyp->fd); #endif /* Restore device mode */ if (ttyp->mode) fchmod(ttyp->fd, ttyp->mode); /* Bring the link down */ #ifdef USE_PPP /* * Call lcp_lowerdown if it's ppp */ if (ttyp->proto == PROTO_PPP) { lcp_lowerdown(ttyp->unit); phase = PHASE_DEAD; /* XXXXX */ } #endif /* * Kill the guardian, if it exists */ if (ttyp->pid) kill(ttyp->pid, SIGQUIT); /* * If this was the last tty and we're not restarting, exit */ if (!ttys && slirp_socket < 0 && !exiting) slirp_exit(0); close(ttyp->fd); if (ttyp->m) m_free(ttyp->m); /* * If this was the controlling tty, call ctty_detached */ if ((ttyp->flags & TTY_CTTY) && !exiting) ctty_detached(); #ifdef USE_PPP /* Deallocate compress data */ ppp_ccp_closed(ttyp); #endif ttys_unit[ttyp->unit] = 0; /* * If you love it, set it free() ... * If it comes back, we have a memory leak */ free(ttyp); detach_time = curtime; }