#include #include #include #include #include #include #include #include struct iv_fd master_fd; struct connection { struct iv_fd fd; }; void connection_handler(void *_conn) { struct connection *conn = (struct connection *)_conn; char buf[65536]; int len; len = iv_read(&(conn->fd), buf, sizeof(buf)); if (len <= 0) { if (len == 0 || errno != EAGAIN) { iv_unregister_fd(&(conn->fd)); close(conn->fd.fd); free(conn); } return; } } void new_connection(void *_dummy) { struct sockaddr_in addr; socklen_t addrlen; struct connection *conn; int fd; addrlen = sizeof(addr); fd = iv_accept(&master_fd, (struct sockaddr *)&addr, &addrlen); if (fd <= 0) { if (fd < 0 && errno == EAGAIN) return; perror("iv_accept"); exit(-1); } conn = malloc(sizeof(*conn)); if (conn == NULL) { syslog(LOG_ALERT, "new_connection: memory allocation error, dropping connection"); close(fd); return; } INIT_IV_FD(&(conn->fd)); conn->fd.fd = fd; conn->fd.cookie = (void *)conn; conn->fd.handler_in = connection_handler; iv_register_fd(&(conn->fd)); } int main() { struct sockaddr_in addr; int fd; fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { perror("socket"); exit(-1); } addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(9); if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); exit(-1); } if (listen(fd, 1000) < 0) { perror("listen"); exit(-1); } iv_init(); INIT_IV_FD(&(master_fd)); master_fd.fd = fd; master_fd.handler_in = new_connection; iv_register_fd(&(master_fd)); iv_main(); return 0; }