/* client packet handler */ void cmd_packet_handler(struct conn_server *server, struct connection *conn, struct list_packet *packet) { uint16_t command = get_command(packet); /* check login status */ if (conn->type != LOGIN_OK_CONNECTION && command != CMD_LOGIN) { /* the client not login, ignore this packet */ allocator_free(&server->packet_allocator, packet); return; } switch (command) { case CMD_KEEP_ALIVE: cmd_keep_alive(server, conn, packet); break; case CMD_LOGIN: cmd_login(server, conn, packet); break; case CMD_LOGOUT: cmd_logout(server, conn, packet); break; case CMD_SET_NICK: cmd_user(server, conn, packet); break; case CMD_ADD_CONTACT: case CMD_ADD_CONTACT_REPLY: case CMD_CONTACT_LIST: case CMD_CONTACT_INFO_MULTI: cmd_contact(server, conn, packet); break; case CMD_MESSAGE: case CMD_OFFLINE_MSG: cmd_message(server, conn, packet); break; default: log_err("unkonwn command %#hx\n", command); break; } }
int main(int argc, char *argv[]) { char line[INPUTLEN]; char buff[BUFFSIZE]; char *peersfile; struct stat st; int rc; sigset_t set; if (argc < 3) { fprintf(stderr, "Usage: %s <peers_file> <self_id>\n", argv[0]); exit(EXIT_FAILURE); } peersfile = argv[1]; rc = stat(peersfile, &st); if (rc == -1) { if (errno == ENOENT) { fprintf(stderr, "Can't open %s.\n", peersfile); exit(EXIT_FAILURE); } else { fprintf(stderr, "Error stating %s: %d\n", peersfile, errno); exit(EXIT_FAILURE); } } self_info = NULL; load_peers(peersfile, argv[2]); if (self_info == NULL) { fprintf(stderr, "Can't find id %s in %s.\n", argv[2], peersfile); exit(EXIT_FAILURE); } init_gui(); main_tid = pthread_self(); sigemptyset(&set); sigaddset(&set, SIGINT); pthread_sigmask(SIG_BLOCK, &set, NULL); pthread_create(&heartbeat_tid, NULL, heartbeat, NULL); pthread_create(&chatserver_tid, NULL, chatserver, NULL); create_peers_poller(); pthread_sigmask(SIG_UNBLOCK, &set, NULL); signal(SIGINT, sigint_handler); usleep(250000); chat_writeln(TRUE, LOG_INFO, "Client ready..."); while(TRUE) { werase(input_window); wgetnstr(input_window, line, INPUTLEN); if (strstr(line, "status") == line) { chat_writeln(TRUE, LOG_INFO, "STATUS"); cmd_status(); } else if (strstr(line, "leave") == line) { werase(input_window); chat_writeln(TRUE, LOG_INFO, "Leaving..."); sleep(1); break; } else if (strstr(line, "msg") == line) { cmd_message(line + 3); } else if (strstr(line, "bcast") == line) { cmd_broadcast(line + 5); } else if (strstr(line, "exec") == line) { cmd_exec(line + 4); } else { snprintf(buff, BUFFSIZE, "%s :unknown command", line); chat_writeln(TRUE, LOG_ERR, buff); } } sigint_handler(SIGINT); exit(EXIT_SUCCESS); }