void server_apply_mode(struct entity *from, struct entity *target, char *modechanges, struct manyargs *arg, int skip) { if (!verify_server(target)) { logtxt(LOG_WARNING, "Mode change on non-channel"); return; } mode_apply(from, target, &((struct server *)target)->mode, modechanges, arg, skip, server_modehook); }
struct connection *conn_get_server_from_pool(struct context *ctx, struct address *addr) { struct connection *server = NULL; char key[DSN_LEN + 1]; socket_get_key(addr, key); server = dict_get(&ctx->server_table, key); if (server != NULL) { if (verify_server(server) == CORVUS_ERR) return NULL; return server; } server = conn_create_server(ctx, addr, key); return server; }
struct connection *conn_get_server_from_pool(struct context *ctx, struct address *addr, bool readonly) { struct connection *server = NULL; char key[ADDRESS_LEN]; snprintf(key, ADDRESS_LEN, "%s:%d", addr->ip, addr->port); server = dict_get(&ctx->server_table, key); if (server != NULL) { if (verify_server(server, readonly) == CORVUS_ERR) return NULL; return server; } server = conn_create_server(ctx, addr, key, readonly); return server; }
static int server_modehook(struct entity *from, struct entity *target, int pls, char modechange, char *param) { struct server *s; s = (struct server *)target; if (!verify_server(s)) { logtxt(LOG_ERROR, "Mode change for not-a-server!"); return MODEHOOK_ERROR; } /* only uplink modes relevant for now */ if (s != uplink) return MODEHOOK_OK; if (modechange == 'n') pls ? uplink_with_opername() : uplink_without_opername(); return MODEHOOK_OK; }
static void meta_command(struct sockaddr_in *from, char *command) { Server *s; char *cmd, *name, *dummy; parse_connect(command, &cmd, &name, &dummy); s = serv_name2server(name); if (!strcmp(cmd + 1, "connect")) { char buf[128]; Server *local; if (!s) { s = promiscuous_connect(from, name); if (!s) { return; } } else if (verify_servers && !verify_server(s, from)) { return; } s->connected = 1; s->last_msgid = -1; writelog(); fprintf(stderr, "Server %s (%s %d) connected\n", s->name, s->hostname, s->port); local = serv_id2server(0); sprintf(buf, "*connectok %s\n", local->name); sendto(yo_sock, buf, strlen(buf), 0, (struct sockaddr *) from, sizeof(*from)); connect_server(s->id); } else if (!strcmp(cmd + 1, "connectok")) { if (!s) { s = promiscuous_connect(from, name); if (!s) { return; } } else if (verify_servers && !verify_server(s, from)) { return; } s->connected = 1; s->last_msgid = -1; writelog(); fprintf(stderr, "Server %s (%s %d) connected ok\n", s->name, s->hostname, s->port); connect_server(s->id); } else if (!strcmp(cmd + 1, "disconnect")) { if (!s) { return; } s->connected = 0; writelog(); fprintf(stderr, "Server %s (%s %d) disconnected\n", s->name, s->hostname, s->port); disconnect_server(s->id); } else { if (!s) { return; } writelog(); fprintf(stderr, "Unknown metacommand \"%s\" from server %s\n", command, s->name); } }
void init_game() { int sock, accept_sock; struct sockaddr_in addr; int cont = 1; char msg[70]; //printw("using usermode %d\n", user_mode); refresh(); //open socket: if ( (sock = socket(PF_INET, SOCK_STREAM, 0)) == -1 ) { cleanup_ncurses(); perror("Error creating socket"); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if (user_mode == CLIENT_MODE) { char ip[50]; bool found_server = false; get_text_string_from_centered_panel("Enter IP address of server (enter nothing for localhost): ", ip, 50); if (ip[0] == '\0') strcpy(ip, "127.0.0.1"); /* char msg[50]; */ /* sprintf(msg, "using IP: %s", ip); */ /* show_message_box(msg); */ /* getch(); */ /* cleanup_ncurses(); */ /* exit(EXIT_SUCCESS); */ //set up addr with IP address: if ( inet_pton(AF_INET, ip, &addr.sin_addr) == 0 ) { cleanup_ncurses(); perror("That doesn't look like a valid IP address"); exit(EXIT_FAILURE); } clear(); //connect bool keep_trying_to_find_a_game = true; while(keep_trying_to_find_a_game) { for (uint16_t i=START_PORT; i<END_PORT; i+=PORT_INTERVAL) { sprintf(msg, "Searching for battleship server on port %u", i); show_message_box(msg); addr.sin_port = htons(i); if ( (connect(sock, (struct sockaddr *) &addr, sizeof(addr))) == 0 ) { if (verify_server(sock)) { found_server = true; keep_trying_to_find_a_game = false; break; } } usleep(200000); /* 200 ms pause between scans */ } if (found_server) { show_message_box("Connected to server!"); usleep(100000); /* 1s */ exchange_names(sock); sprintf(msg, "You will be battling against %s.\nPress any key to continue...", peer_user_name); show_message_box(msg); getch(); do_gameplay(sock, 0); } else { show_message_box("We're having trouble finding a game...\nWe'll keep trying though."); sleep(2); /* cleanup_ncurses(); */ /* printf("Couldn't find a game!\n"); /\* TODO: return to main menu *\/ */ /* exit(EXIT_FAILURE); */ } } } else { int i = 0; addr.sin_port = htons(get_battleship_port()); //bind if ( bind(sock, (struct sockaddr *) &addr, sizeof(addr)) == -1) {/*bind error*/ cleanup_ncurses(); perror("bind error"); exit(EXIT_FAILURE); } //listen if ( listen(sock, 100) == -1 ) {/*listen error*/ cleanup_ncurses(); perror("listen error"); exit(EXIT_FAILURE); } while(cont) { socklen_t len; //for accept //accept clear(); show_message_box("Waiting for a client to connect..."); i = !i; accept_sock = accept(sock, (struct sockaddr *) &addr, &len); if (verify_client(accept_sock)) { exchange_names(accept_sock); sprintf(msg, "You will be battling against %s.\nPress any key to continue...", peer_user_name); /* sprintf(msg, "Connected to client!\nYou will be battling against %s\nPress any key to continue...", peer_user_name); */ show_message_box(msg); getch(); do_gameplay(accept_sock, 1); } } } }
struct server *get_server(struct server *s) { if (!s || !verify_server(s)) return NULL; return s; }