int main(void) { picoev_loop* loop; int listen_sock, flag; /* listen to port */ assert((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) != -1); flag = 1; assert(setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)) == 0); struct sockaddr_in listen_addr; listen_addr.sin_family = AF_INET; listen_addr.sin_port = htons(PORT); listen_addr.sin_addr.s_addr = htonl(HOST); assert(bind(listen_sock, (struct sockaddr*)&listen_addr, sizeof(listen_addr)) == 0); assert(listen(listen_sock, 5) == 0); setup_sock(listen_sock); /* init picoev */ picoev_init(MAX_FDS); /* create loop */ loop = picoev_create_loop(60); /* add listen socket */ picoev_add(loop, listen_sock, PICOEV_READ, 0, accept_callback, NULL); /* Seccomp sandbox setup */ sandbox_init(); sandbox_setup(); sandbox_lockdown(); /* loop */ while (1) { fputc('.', stdout); fflush(stdout); picoev_loop_once(loop, 10); } /* cleanup */ picoev_destroy_loop(loop); picoev_deinit(); return 0; }
static VALUE bossan_run_loop(int argc, VALUE *argv, VALUE self) { int ret; VALUE args1, args2, args3; rb_scan_args(argc, argv, "21", &args1, &args2, &args3); if(listen_sock > 0){ rb_raise(rb_eException, "already set listen socket"); } if (argc == 3){ server_name = StringValuePtr(args1); server_port = NUM2INT(args2); long _port = NUM2INT(args2); if (_port <= 0 || _port >= 65536) { // out of range rb_raise(rb_eArgError, "port number outside valid range"); } server_port = (short)_port; ret = inet_listen(); rack_app = args3; } else { Check_Type(args1, T_STRING); ret = unix_listen(StringValuePtr(args1)); rack_app = args2; } if(ret < 0){ //error listen_sock = -1; } if(listen_sock <= 0){ rb_raise(rb_eTypeError, "not found listen socket"); } /* init picoev */ picoev_init(MAX_FDS); /* create loop */ main_loop = picoev_create_loop(60); loop_done = 1; setsig(SIGPIPE, sigpipe_cb); setsig(SIGINT, sigint_cb); setsig(SIGTERM, sigint_cb); picoev_add(main_loop, listen_sock, PICOEV_READ, ACCEPT_TIMEOUT_SECS, accept_callback, NULL); /* loop */ while (loop_done) { picoev_loop_once(main_loop, 10); } picoev_destroy_loop(main_loop); picoev_deinit(); printf("Bye.\n"); return Qnil; }