Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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);
    }
}
Ejemplo n.º 6
0
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);
      }
    }
  }
}
Ejemplo n.º 7
0
struct server *get_server(struct server *s) {
	if (!s || !verify_server(s))
		return NULL;
	return s;
}