static void udpsvc_process(udpsvc_t *svc) { int addrlen, cc; struct sockaddr_in addr; struct gdexception exception_frame; update_udp_av(); exception_frame.e_exception = exception; exception_frame.e_catch = 0; exception = &exception_frame; if (setjmp(exception_frame.e_context) == 0) { push_string(inet_ntoa(addr.sin_addr), STRING_MSTRING); push_string((char *)nq_rptr(svc->nq), STRING_MSTRING); (void)apply_master_ob(M_INCOMING_UDP, 2); } exception = exception->e_exception; addrlen = sizeof (addr); if (!read_datagram(svc)) { nd_enable(svc->nd, ND_R); svc->task = 0; return; } reschedule_task(svc->task); }
/* * Send the contents of the canonical queue to the interactive object. */ static void telnet_eol(telnet_t *tp) { char *cp; if (tp->t_flags & TF_SYNCH) return; if (nq_full(tp->t_canq)) { tp->t_flags &= ~TF_OVFLCANQ; cp = ""; } else { nq_putc(tp->t_canq, '\0'); cp = (char *)nq_rptr(tp->t_canq); } if (tp->t_flags & TF_ATTACH) interactive_input(tp->t_ip, cp); nq_init(tp->t_canq); tp->t_flags &= ~TF_GA; }
static void telnet_interactive(void *vp) { telnet_t *tp = vp; char *cp; if (!(tp->t_flags & TF_ATTACH)) { tp->task = NULL; telnet_shutdown(tp->t_nd, tp); return; } if (tp->t_flags & TF_DISCONNECT) { tp->t_flags &= ~TF_DISCONNECT; if (tp->t_ip) remove_interactive(tp->t_ip, 1); } if (!(tp->t_flags & TF_ATTACH)) { tp->task = NULL; telnet_shutdown(tp->t_nd, tp); return; } if (tp->t_flags & TF_OVFLOUTQ) { tp->task = NULL; return; } if (tp->t_flags & TF_INPUT) { tp->t_flags &= ~TF_INPUT; if (nq_full(tp->t_canq)) cp = ""; else cp = (char *)nq_rptr(tp->t_canq); interactive_input(tp->t_ip, cp); nq_init(tp->t_canq); } if (!(tp->t_flags & TF_ATTACH)) { tp->task = NULL; telnet_shutdown(tp->t_nd, tp); return; } tp->t_flags &= ~TF_GA; telnet_readbytes(tp->t_nd, tp); telnet_input(tp); if (!(tp->t_flags & TF_ATTACH)) { tp->task = NULL; telnet_shutdown(tp->t_nd, tp); return; } if (tp->t_flags & (TF_INPUT|TF_DISCONNECT)) { reschedule_task(tp->task); return; } tp->task = NULL; nd_enable(tp->t_nd, ND_R); }
/* * Read and process a UDP datagram. */ static void udpsvc_read(ndesc_t *nd, nqueue_t *nq) { int addrlen, cc; struct sockaddr_in addr; addrlen = sizeof (addr); cc = recvfrom(nd_fd(nd), nq_wptr(nq), nq_size(nq) - 1, 0, (struct sockaddr *)&addr, &addrlen); if (cc == -1) return; nq_wptr(nq)[cc] = '\0'; /* XXX We need a safe master apply XXX */ push_string(inet_ntoa(addr.sin_addr), STRING_MSTRING); push_string((char *)nq_rptr(nq), STRING_MSTRING); (void)apply_master_ob(M_INCOMING_UDP, 2); }