#include #include #include #include #include #include #include #include #include #include "net9p.h" #include "coroutine.h" void net9p_listen_cr(void *_arg) { (void)_arg; printf("listen initializng...\n"); cr_begin(); printf("listen running...\n"); union { struct sockaddr_in in; struct sockaddr gen; } addr = {0}; addr.in.sin_family = AF_INET; addr.in.sin_port = htons(9001); int fd = socket(AF_INET, SOCK_STREAM|SOCK_NONBLOCK, 0); if (fd < 0) error(1, errno, "socket"); if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)) < 0) error(1, errno, "setsockopt"); if (bind(fd, &addr.gen, sizeof addr) < 0) error(1, errno, "bind"); if (listen(fd, 5) < 0) error(1, errno, "listen"); int conn = 9; if (!coroutine_add(net9p_worker_cr, &conn)) error(1, 0, "coroutine_add(net9p_worker_cr, &%d)", conn); for (;;) { cr_yield(); } cr_end(); } void net9p_worker_cr(void *_arg) { int fd = *((int *)_arg); cr_begin(); printf("worker %zu\n", cr_getcid()); close(fd); cr_end(); }