/* * Allocate a Telnet control block. */ static telnet_t * telnet_alloc(void) { int i; telnet_t *tp; tp = xalloc(sizeof (telnet_t)); tp->t_flags = 0; tp->t_state = TS_DATA; tp->t_nd = NULL; tp->t_rawq = nq_alloc(TELNET_RAWQ_SIZE); tp->t_canq = nq_alloc(TELNET_CANQ_SIZE); tp->t_optq = NULL; tp->t_outq = nq_alloc(TELNET_OUTQ_SIZE); tp->t_ip = NULL; tp->t_rblen = 0; tp->t_sblen = 0; tp->task = NULL; for (i = 0; i < OP_SIZE; i++) { tp->t_optb[i].o_us = OS_NO; tp->t_optb[i].o_usq = OQ_EMPTY; tp->t_optb[i].o_him = OS_NO; tp->t_optb[i].o_himq = OQ_EMPTY; } return tp; }
/* * Process a Subnegotiate Begin. */ static void telnet_sb(telnet_t *tp, u_char opt) { if (tp->t_optq == NULL) tp->t_optq = nq_alloc(TELNET_OPTQ_SIZE); tp->t_opt = opt; }
/* * Initialize the UDP Manager. */ udpsvc_t * udpsvc_init(int port) { int s; struct sockaddr_in addr; struct udpsvc_t *svc; s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == -1) fatal("udp_init: socket() error = %d.\n", errno); enable_reuseaddr(s); memset(&addr, 0, sizeof (addr)); addr.sin_family = AF_INET; addr.sin_port = htons((u_short)port); addr.sin_addr.s_addr = INADDR_ANY; if (bind(s, (struct sockaddr *)&addr, sizeof (addr)) == -1) { if (errno == EADDRINUSE) { (void)fprintf(stderr, "UDP Socket already bound!\n"); debug_message("UDP Socket already bound!\n"); (void)close(s); return 0; } else { fatal("udp_init: bind() error = %d.\n", errno); } } enable_nbio(s); svc = xalloc(sizeof(*udpsvc)); svc->nq = nq_alloc(UDPSVC_RAWQ_SIZE); svc->nd = nd_attach(s, udpsvc_read, NULL, NULL, NULL, udpsvc_shutdown, svc); nd_enable(svc->nd, ND_R); return svc; }