4 #include <sys/socket.h>
5 #include <sys/select.h>
11 static int init(void);
12 static void cleanup(void);
13 static void handle_key(int key);
15 static int lis; /* the listening socket */
17 int main(int argc, char **argv)
31 struct sockaddr_in sa;
33 /* initialize input */
34 if(kb_init(32) == -1) {
35 printlog("failed to initialize keyboard driver\n");
39 /* start network server */
40 if((lis = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
41 printlog("failed to create listening socket\n");
45 memset(&sa, 0, sizeof sa);
46 sa.sin_family = AF_INET;
47 sa.sin_addr.s_addr = INADDR_ANY;
48 sa.sin_port = htons(6000);
50 if(bind(lis, (struct sockaddr*)&sa, sizeof sa) == -1) {
51 printlog("failed to bind socket to port 6000\n");
59 static void cleanup(void)
61 struct client *iter = get_clients();
72 static int main_loop(void)
78 struct timeval tv = {0, 0};
81 /* ctrl-alt-backspace quits */
82 if(kb_isdown(KB_ALT) && kb_isdown(KB_CTRL) && kb_isdown('\b')) {
86 /* get any key events and process them */
87 while((key = kb_getkey()) != -1) {
91 /* construct the socket set of all open sockets */
98 FD_SET(c->sock, &rdset);
104 if(select_s(maxfd + 1, &rdset, 0, 0, &tv) == -1) {
108 /* check for any unread messages from clients and call handle_client */
111 if(FD_ISSET(c->sock, &rdset)) {
112 if(handle_client(c) == -1) {
114 c->sock = -1; /* this effectively marks it for removal */
120 /* accept any new incoming connections on the listening socket */
121 if(FD_ISSET(lis, &rdset)) {
122 struct sockaddr_in addr;
125 if((s = accept(lis, (struct sockaddr*)&addr, &addrlen)) == -1) {
126 printlog("failed to accept new connection\n");
128 printlog("new client from host: %s\n", inet_ntoa(addr.sin_addr));
134 /* remove any clients with closed sockets */
139 static void handle_key(int key)