/** * 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); } }
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; }
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"); } }
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"); } }
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"); } }
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"); } }
/** * 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++; }
/** * 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); } } }
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; } } }