Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
/*
 * 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;
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
/*
 * 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);
}