int input_queue_get(il_octet_string_t **buffer, long *offset, int timeout) { fd_set fds; struct timeval tv; int msg_len; static il_http_message_t msg; assert(buffer != NULL); *buffer = (il_octet_string_t *)&msg; FD_ZERO(&fds); FD_SET(sock, &fds); tv.tv_sec = timeout; tv.tv_usec = 0; msg_len = select(sock + 1, &fds, NULL, NULL, timeout >= 0 ? &tv : NULL); switch(msg_len) { case 0: /* timeout */ return(0); case -1: /* error */ switch(errno) { case EINTR: il_log(LOG_DEBUG, " interrupted while waiting for event!\n"); return(0); default: set_error(IL_SYS, errno, "input_queue_get: error waiting for event"); return(-1); } default: break; } if((accepted=accept(sock, NULL, NULL)) < 0) { set_error(IL_SYS, errno, "input_queue_get: error accepting connection"); return(-1); } msg_len = receive_http(&accepted, plain_reader, &msg); if(msg_len < 0) { close(accepted); if(error_get_maj() != IL_OK) return -1; else return 0; } close(accepted); *offset = -1; return(msg.len); }
int input_queue_attach() { struct sockaddr_un saddr; if((sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) { set_error(IL_SYS, errno, "input_queue_attach: error creating socket"); return(-1); } memset(&saddr, 0, sizeof(saddr)); saddr.sun_family = AF_UNIX; strcpy(saddr.sun_path, socket_path); /* test for the presence of the socket and another instance of interlogger listening */ if(connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) { if(errno == ECONNREFUSED) { /* socket present, but no one at the other end; remove it */ il_log(LOG_WARNING, " removing stale input socket %s\n", socket_path); unlink(socket_path); } /* ignore other errors for now */ } else { /* connection was successful, so bail out - there is another interlogger running */ set_error(IL_SYS, EADDRINUSE, "input_queue_attach: another instance of interlogger is running"); return(-1); } if(bind(sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { set_error(IL_SYS, errno, "input_queue_attach: error binding socket"); return(-1); } if (listen(sock, SOCK_QUEUE_MAX)) { set_error(IL_SYS, errno, "input_queue_attach: error listening on socket"); return -1; } return(0); }
int main(int argc, char **argv) { demoLoad(argc, argv); Window window = createWindow("Teapots"); Graphics graphics(window); Graphics::Flags flags; if (!graphics.init(flags)) { return 1; } il_pos pos = il_pos_new(&graphics.space); il_pos_setPosition(&pos, il_vec3_new(0, -4, 0)); Teapot teapot; Teapots drawable(pos.id, teapot); graphics.drawables.push_back(&drawable); char *error; if (!teapot.build(graphics.rm, &error)) { il_error("Teapot: %s", error); free(error); return 1; } il_pos_setPosition(&graphics.space.camera, il_vec3_new(0, 0, 20)); il_pos lightp = il_pos_new(&graphics.space); il_pos_setPosition(&lightp, il_vec3_new(20, 3, 20)); ilG_light lightl; lightl.color = il_vec3_new(.8f*2, .7f*2, .2f*2); lightl.radius = 50; State state; unsigned lightp_id = lightp.id; state.sunlight_locs = &lightp_id; state.sunlight_lights = &lightl; state.sunlight_count = 1; typedef std::chrono::steady_clock clock; typedef std::chrono::duration<double> duration; clock::time_point start = clock::now(); while (1) { SDL_Event ev; while (SDL_PollEvent(&ev)) { switch (ev.type) { case SDL_QUIT: il_log("Stopping"); window.close(); return 0; } } duration delta = clock::now() - start; const double secs = 5.0; const int scale = 20; il_vec3 v; v.x = float(sin(delta.count() * M_PI * 2.0 / secs) * scale); v.y = 0.f; v.z = float(cos(delta.count() * M_PI * 2.0 / secs) * scale); il_quat q = il_quat_fromAxisAngle(0, 1, 0, float(delta.count() * M_PI * 2.0 / secs)); il_pos_setPosition(&graphics.space.camera, v); il_pos_setRotation(&graphics.space.camera, q); graphics.draw(state); } }