Esempio n. 1
0
/**
 * Asynchronous completion.
 *
 * @param[in] dhandle   State
 * @param[in] rv        Completion status
 */
void
hio_async_done(void *dhandle, httpd_status_t rv)
{
    session_t *session = httpd_mhandle(dhandle);

    if (rv < 0) {
	hio_socket_close(session);
	return;
    }

    /* Allow more input. */
    if (session->ioid == NULL_IOID) {
#if !defined(_WIN32) /*[*/
	session->ioid = AddInput(session->s, hio_socket_input);
#else /*][*/
	session->ioid = AddInput(session->event, hio_socket_input);
#endif /*]*/
    }

    /*
     * Set a timeout for that input to arrive. We didn't set this timeout
     * as soon as the last input arrived, because it might have taken us a
     * long time to proces the last request.
     */
    if (session->toid == NULL_IOID) {
	session->toid = AddTimeOut(IDLE_MAX * 1000, hio_timeout);
    }
}
Esempio n. 2
0
File: ft.c Progetto: Oxyoptia/x3270
static bool  
Transfer_action(ia_t ia, unsigned argc, const char **argv)
{
    ft_conf_t *p = NULL;

    action_debug("Transfer", ia, argc, argv);

    /* Make sure we're connected. */
    if (!IN_3270) {
	popup_an_error("Transfer: Not connected");
	return false;
    }

    /* Check for interactive mode. */
    if (argc == 0) {
	if (!gui_conf_initted) {
	    ft_init_conf(&gui_ft_conf);
	    gui_ft_conf.is_action = true;
	    gui_conf_initted = true;
	}
	switch (ft_gui_interact(&gui_ft_conf)) {
	case FGI_NOP:
	    /* Hope the defaults are enough. */
	    break;
	case FGI_SUCCESS:
	    /* Proceed as specified in the ft_state. */
	    p = &gui_ft_conf;
	    break;
	case FGI_ABORT:
	    /* User said no. */
	    return false;
	}
    }

    if (p == NULL) {
	/* Parse the keywords into the ft_state structure. */
	p = parse_ft_keywords(argc, argv);
	if (p == NULL) {
	    return false;
	}
	p->is_interactive = (ia == IA_COMMAND);
    }

    /* Start the transfer. */
    fts.local_file = ft_go(p);
    if (fts.local_file == NULL) {
	return false;
    }

    /* If interactive, tell the user we're waiting. */
    ft_gui_awaiting();

    /* Set a timeout for failed command start. */
    ft_start_id = AddTimeOut(10 * 1000, ft_didnt_start);

    /* Success. */
    return true;
}
Esempio n. 3
0
void anim_step_reverse(Widget w, void *data)
{
  MyProgram *me=data;

  if (me->data.anim.type != NO_ANIM)
  {
     me->data.anim.mode = STEP_ANIM;
     me->data.anim.enable_anim = TRUE;
     me->data.anim.forward = FALSE;

     AddTimeOut(me->data.anim.frame_interval, ((void *)next_frame), data);

     printf("stepping anim\n");
  }
}
Esempio n. 4
0
void anim_ping(Widget w, void *data)
{
  MyProgram *me=data;

  if (me->data.anim.type != NO_ANIM)
  {
     me->data.anim.mode = PING_ANIM;
     me->data.anim.enable_anim = TRUE;
     me->data.anim.forward = TRUE;
     me->data.anim.frame_count = 0;

     AddTimeOut(me->data.anim.frame_interval, ((void *)next_frame), data);

     printf("looping anim\n");
  }
}
Esempio n. 5
0
void anim_run_reverse(Widget w, void *data)
{
  MyProgram *me=data;

  if (me->data.anim.type != NO_ANIM)
  {
     me->data.anim.mode = RUN_ANIM;
     me->data.anim.enable_anim = TRUE;
     me->data.anim.forward = FALSE;
     me->data.anim.frame_count = me->data.anim.num_frames - 1;

     ComputeNextFrame(me);

     AddTimeOut(me->data.anim.frame_interval, ((void *)next_frame), data);

     printf("running anim reverse\n");
  }
}
Esempio n. 6
0
void anim_run_forward(Widget w, void *data)
{
  MyProgram *me=data;

  if (me->data.anim.type != NO_ANIM)
  {
     me->data.anim.mode = RUN_ANIM;
     me->data.anim.enable_anim = TRUE;
     me->data.anim.forward = TRUE;
     me->data.anim.frame_count = 0;

     UpdateDisplay(me);

     AddTimeOut(me->data.anim.frame_interval, ((void *)next_frame), data);

     printf("running anim forward\n");
  }
}
Esempio n. 7
0
/**
 * New inbound connection for httpd.
 *
 * @param[in] fd	socket file descriptor
 * @param[in] id	I/O ID
 */
void
hio_connection(iosrc_t fd, ioid_t id)
{
    socket_t t;
    union {
	struct sockaddr sa;
	struct sockaddr_in sin;
#if defined(X3270_IPV6) /*[*/
	struct sockaddr_in6 sin6;
#endif /*]*/
    } sa;
    socklen_t len;
    char hostbuf[128];
    session_t *session;

    len = sizeof(sa);
    t = accept(listen_s, &sa.sa, &len);
    if (t == INVALID_SOCKET) {
	vtrace("httpd accept error: %s%s\n", socket_errtext(),
		(socket_errno() == SE_EWOULDBLOCK)? " (harmless)": "");
	return;
    }
    if (n_sessions >= N_SESSIONS) {
	vtrace("Too many connections.\n");
	SOCK_CLOSE(t);
	return;
    }

    session = Malloc(sizeof(session_t));
    memset(session, 0, sizeof(session_t));
    vb_init(&session->pending.result);
    session->s = t;
#if defined(_WIN32) /*[*/
    session->event = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (session->event == NULL) {
	vtrace("httpd: can't create socket handle\n");
	SOCK_CLOSE(t);
	Free(session);
	return;
    }
    if (WSAEventSelect(session->s, session->event, FD_READ | FD_CLOSE) != 0) {
	vtrace("httpd: Can't set socket handle events\n");
	CloseHandle(session->event);
	SOCK_CLOSE(t);
	Free(session);
	return;
    }
#endif /*]*/
    if (sa.sa.sa_family == AF_INET) {
	session->dhandle = httpd_new(session,
		lazyaf("%s:%u",
		    inet_ntop(AF_INET, &sa.sin.sin_addr, hostbuf,
			sizeof(hostbuf)),
		    ntohs(sa.sin.sin_port)));
    }
#if defined(X3270_IPV6) /*[*/
    else if (sa.sa.sa_family == AF_INET6) {
	session->dhandle = httpd_new(session,
		lazyaf("%s:%u",
		    inet_ntop(AF_INET6, &sa.sin6.sin6_addr, hostbuf,
			sizeof(hostbuf)),
		    ntohs(sa.sin6.sin6_port)));
    }
#endif /*]*/
    else {
	session->dhandle = httpd_new(session, "???");
    }
#if !defined(_WIN32) /*[*/
    session->ioid = AddInput(t, hio_socket_input);
#else /*][*/
    session->ioid = AddInput(session->event, hio_socket_input);
#endif /*]*/

    /* Set the timeout for the first line of input. */
    session->toid = AddTimeOut(IDLE_MAX * 1000, hio_timeout);

    llist_insert_before(&session->link, sessions.next);
    n_sessions++;
}
Esempio n. 8
0
/**
 * New inbound data for an httpd connection.
 *
 * @param[in] fd	socket file descriptor
 * @param[in] id	I/O ID
 */
void
hio_socket_input(iosrc_t fd, ioid_t id)
{
    session_t *session;
    char buf[1024];
    ssize_t nr;

    session = NULL;
    FOREACH_LLIST(&sessions, session, session_t *) {
	if (session->ioid == id) {
	    break;
	}
    } FOREACH_LLIST_END(&sessions, session, session_t *);
    if (session == NULL) {
	vtrace("httpd mystery input\n");
	return;
    }

    /* Move this session to the front of the list. */
    llist_unlink(&session->link);
    llist_insert_before(&session->link, sessions.next);

    session->idle = 0;

    if (session->toid != NULL_IOID) {
	RemoveTimeOut(session->toid);
	session->toid = NULL_IOID;
    }

    nr = recv(session->s, buf, sizeof(buf), 0);
    if (nr <= 0) {
	const char *ebuf;
	bool harmless = false;

	if (nr < 0) {
	    if (socket_errno() == SE_EWOULDBLOCK) {
		harmless = true;
	    }
	    ebuf = lazyaf("recv error: %s", socket_errtext());
	    vtrace("httpd %s%s\n", ebuf, harmless? " (harmless)": "");
	} else {
	    ebuf = "session EOF";
	}
	if (!harmless) {
	    httpd_close(session->dhandle, ebuf);
	    hio_socket_close(session);
	}
    } else {
	httpd_status_t rv;

	rv = httpd_input(session->dhandle, buf, nr);
	if (rv < 0) {
	    httpd_close(session->dhandle, "protocol error");
	    hio_socket_close(session);
	} else if (rv == HS_PENDING) {
	    /* Stop input on this socket. */
	    RemoveInput(session->ioid);
	    session->ioid = NULL_IOID;
	} else if (session->toid == NULL_IOID) {
	    /* Leave input enabled and start the timeout. */
	    session->toid = AddTimeOut(IDLE_MAX * 1000, hio_timeout);
	}
    }
}
Esempio n. 9
0
void next_frame(void *data, XtIntervalId *id)
{
  MyProgram *me=data;

  if (me->data.anim.enable_anim) 
  {
    
     printf("frame #%d:\n", me->data.anim.frame_count);
       
     switch(me->data.anim.mode)
     {
        case STOP_ANIM:
           ComputeNextFrame(me);
           me->data.anim.enable_anim = FALSE;
           break;

        case RUN_ANIM:
           ComputeNextFrame(me);
           AddTimeOut(me->data.anim.frame_interval, 
						((void *)next_frame), data);

           if (me->data.anim.forward 
		&& (me->data.anim.frame_count >= me->data.anim.num_frames))
           {
              me->data.anim.enable_anim = FALSE;

              printf("anim done\n");
           }

           if (!me->data.anim.forward && (me->data.anim.frame_count == 0))
           {
              me->data.anim.enable_anim = FALSE;

              printf("anim done\n");
           }
           break;

        case LOOP_ANIM:
           ComputeNextFrame(me);
           AddTimeOut(me->data.anim.frame_interval, 
						((void *)next_frame), data);

           if (me->data.anim.frame_count >= me->data.anim.num_frames)
           {

              printf("starting anim again...\n");
              
              InitDatabase(me);
              GenerateParticleSystem(me, 0);
              SetupAnimToRun(me);
              UpdateDisplay(me);
              
              me->data.anim.mode = LOOP_ANIM;
              me->data.anim.enable_anim = TRUE;
              me->data.anim.forward = TRUE;
              me->data.anim.frame_count = 0;

              AddTimeOut(me->data.anim.frame_interval, ((void *)next_frame), data);
           }
           break;

        case PING_ANIM:
           ComputeNextFrame(me);
           AddTimeOut(me->data.anim.frame_interval, 
						((void *)next_frame), data);

           if (me->data.anim.forward 
		&& (me->data.anim.frame_count >= me->data.anim.num_frames))
           {
              me->data.anim.forward = FALSE;
           }

           if (!me->data.anim.forward && (me->data.anim.frame_count == 0))
           {
              me->data.anim.forward = TRUE;
           }
           break;

        case STEP_ANIM:
           ComputeNextFrame(me);
           me->data.anim.enable_anim = FALSE;
           break;

        default:
           me->data.anim.enable_anim = FALSE;
           break;
     }
  }
}