Пример #1
0
void accept_cb(EV_P_ ev_io *w, int revents)
{
    listen_ctx_t *listener = (listen_ctx_t *)w;
    int serverfd           = accept(listener->fd, NULL, NULL);
    if (serverfd == -1) {
        ERROR("accept");
        return;
    }
    setnonblocking(serverfd);
    int opt = 1;
    setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    server_t *server = new_server(serverfd, listener->method);
    server->listener = listener;
    // SSR beg
    server->obfs_plugin = new_obfs_class(listener->obfs_name);
    if (server->obfs_plugin) {
        server->obfs = server->obfs_plugin->new_obfs();
    }
    server->protocol_plugin = new_obfs_class(listener->protocol_name);
    if (server->protocol_plugin) {
        server->protocol = server->protocol_plugin->new_obfs();
    }
    // SSR end

    ev_io_start(EV_A_ & server->recv_ctx->io);
}
Пример #2
0
static void init_controller(int port, int nrouters, int nworkers) {
    if (!new_server(port, &listen_fd, NULL))
	err(true, "Cannot set up server on port %u", port);
#if RPT >= 2
    report(2, "Listening socket has descriptor %d", listen_fd);
#endif
    router_addr_set = word_set_new();
    new_conn_map = word_keyvalue_new();
    router_fd_set = word_set_new();
    worker_fd_set = word_set_new();
    client_fd_set = word_set_new();
    init_cmd();
    add_cmd("status", do_controller_status_cmd,
	    "              | Determine status of connected nodes");
    add_cmd("flush", do_controller_flush_cmd,
	    "              | Flush state of all agents");
    add_cmd("collect", do_controller_collect_cmd,
	    "              | Initiate garbage collection");
    add_quit_helper(quit_controller);
    need_routers = nrouters;
    need_workers = nworkers;
    worker_cnt = nworkers;
    stat_message_cnt = 0;
    flush_requestor_fd = -1;
    stat_messages = calloc_or_fail(worker_cnt, sizeof(chunk_ptr),
				   "init_controller");
    gc_state = GC_READY;
    need_worker_cnt = 0;
    need_client_fd_set = NULL;
    defer_client_fd_set = NULL;
    gc_generation = 0;
}
Пример #3
0
static void accept_cb (EV_P_ ev_io *w, int revents)
{
    struct listen_ctx *listener = (struct listen_ctx *)w;
    int serverfd = accept(listener->fd, NULL, NULL);
    if (serverfd == -1)
    {
        ERROR("accept");
        return;
    }
    setnonblocking(serverfd);

    int opt = 1;
    setsockopt(serverfd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    if (verbose)
    {
        LOGD("accept a connection.");
    }

    struct server *server = new_server(serverfd, listener);
    ev_io_start(EV_A_ &server->recv_ctx->io);
    ev_timer_start(EV_A_ &server->recv_ctx->watcher);
}
Пример #4
0
// main loop
int main( int argc, char **argv )
{
	printf("Hello world\n");

	Management manager = new_manager();

	// add actions to the manager
	action_add_to_manager( manager );
	
	// add rooms to manager
	room_add_to_manager( manager );

	Server server = new_server();
	if( start_server( server, 5555 ) < 0 ){
		return 1;
	}

	environment_loop( server, manager );
	
	
	/* ---------------------------------------
	 * Clean up 
	 */
	
	close_server( server );
	destroy_server( server );


	destroy_manager( manager );

	return 0;
}
Пример #5
0
void transmission_tower(ZNotice_t *notice,
			char *packet,
			int pak_len)
{
    ZNotice_t gack;
    Code_t ret;
    struct sockaddr_in gsin;

    nclt++;
    if (notice->z_kind == HMCTL) {
	if (!strcmp(notice->z_opcode, CLIENT_FLUSH)) {
	    if (noflushflag)
		syslog(LOG_INFO, "Client requested hm flush (disabled).");
	    else {
		send_flush_notice(HM_FLUSH);
		deactivated = 1;
	    }
	} else if (!strcmp(notice->z_opcode, CLIENT_NEW_SERVER)) {
	    new_server((char *)NULL);
	} else {
	    syslog (LOG_INFO, "Bad control notice from client.");
	}
	return;
    } else {
	if (notice->z_kind != UNSAFE) {
	    gack = *notice;
	    gack.z_kind = HMACK;
	    gack.z_message_len = 0;
	    gack.z_multinotice = "";
	    gsin = cli_sin;
	    gsin.sin_port = from.sin_port;
	    if (gack.z_port == 0)
		gack.z_port = from.sin_port;
	    DPR2 ("Client Port = %u\n", ntohs(gack.z_port));
	    notice->z_port = gack.z_port;
	    if ((ret = ZSetDestAddr(&gsin)) != ZERR_NONE) {
		Zperr(ret);
		com_err("hm", ret, "setting destination");
	    }
	    /* Bounce ACK to library */
	    if ((ret = send_outgoing(&gack)) != ZERR_NONE) {
		Zperr(ret);
		com_err("hm", ret, "sending raw notice");
	    }
	}
    }
    if (!no_server) {
	DPR2 ("Server Port = %u\n", ntohs(serv_sin.sin_port));
	if ((ret = ZSetDestAddr(&serv_sin)) != ZERR_NONE) {
	    Zperr(ret);
	    com_err("hm", ret, "setting destination");
	}
	if ((ret = ZSendPacket(packet, pak_len, 0)) != ZERR_NONE) {
	    Zperr(ret);
	    com_err("hm", ret, "while sending raw notice");
	}
    }
    if (add_notice_to_queue(notice, packet, &gsin, pak_len) != ZERR_NONE)
        syslog(LOG_INFO, "Hey! Insufficient memory to add notice to queue!");
}
Пример #6
0
static void accept_cb(EV_P_ ev_io *w, int revents)
{
    struct listen_ctx *listener = (struct listen_ctx *)w;
    int serverfd = accept(listener->fd, NULL, NULL);
    if (serverfd == -1) {
        ERROR("accept");
        return;
    }
    setnonblocking(serverfd);
    int opt = 1;
    setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    int index = rand() % listener->remote_num;
    struct sockaddr *remote_addr = listener->remote_addr[index];

    int remotefd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
    if (remotefd < 0) {
        ERROR("socket");
        return;
    }

#ifdef ANDROID
    if (vpn) {
        if (protect_socket(remotefd) == -1) {
            ERROR("protect_socket");
            close(remotefd);
            return;
        }
    }
#endif


    setsockopt(remotefd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(remotefd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    // Setup
    setnonblocking(remotefd);
#ifdef SET_INTERFACE
    if (listener->iface) {
        setinterface(remotefd, listener->iface);
    }
#endif

    struct server *server = new_server(serverfd, listener->method);
    struct remote *remote = new_remote(remotefd, listener->timeout);
    server->destaddr = listener->tunnel_addr;
    server->remote = remote;
    remote->server = server;

    connect(remotefd, remote_addr, get_sockaddr_len(remote_addr));
    // listen to remote connected event
    ev_io_start(EV_A_ & remote->send_ctx->io);
    ev_timer_start(EV_A_ & remote->send_ctx->watcher);
}
Пример #7
0
static void accept_cb (EV_P_ ev_io *w, int revents)
{
    struct listen_ctx *listener = (struct listen_ctx *)w;
    int serverfd = accept(listener->fd, NULL, NULL);
    if (serverfd == -1)
    {
        ERROR("accept");
        return;
    }
    setnonblocking(serverfd);
    int opt = 1;
    setsockopt(serverfd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    struct addrinfo hints, *res;
    int sockfd;
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    int index = rand() % listener->remote_num;
    int err = getaddrinfo(listener->remote_host[index], listener->remote_port, &hints, &res);
    if (err)
    {
        ERROR("getaddrinfo");
        return;
    }

    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (sockfd < 0)
    {
        ERROR("socket");
        close(sockfd);
        freeaddrinfo(res);
        return;
    }

    setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    // Setup
    setnonblocking(sockfd);
#ifdef SET_INTERFACE
    if (listener->iface) setinterface(sockfd, listener->iface);
#endif

    struct server *server = new_server(serverfd, listener->method);
    struct remote *remote = new_remote(sockfd, listener->timeout);
    server->remote = remote;
    remote->server = server;
    connect(sockfd, res->ai_addr, res->ai_addrlen);
    freeaddrinfo(res);
    // listen to remote connected event
    ev_io_start(EV_A_ &remote->send_ctx->io);
    ev_timer_start(EV_A_ &remote->send_ctx->watcher);
}
Пример #8
0
/*
 * kern_return_t
 * bootstrap_create_server(mach_port_t bootstrap_port,
 *	 cmd_t server_cmd,
 *	 integer_t server_uid,
 *	 boolean_t on_demand,
 *	 mach_port_t *server_portp)
 *
 * Returns send rights to server_port of service.  At this point, the
 * server appears active, so nothing will try to launch it.  The server_port
 * can be used to delare services associated with this server by calling
 * bootstrap_create_service() and passing server_port as the bootstrap port.
 *
 * Errors:	Returns appropriate kernel errors on rpc failure.
 *		Returns BOOTSTRAP_NOT_PRIVILEGED, if bootstrap port invalid.
 */
kern_return_t
x_bootstrap_create_server(
	mach_port_t bootstrap_port,
	cmd_t server_cmd,
	int server_uid,
	boolean_t on_demand,
	audit_token_t client_audit_token,
	mach_port_t *server_portp)
{
	server_t *serverp;
	struct auditinfo audit_info;
	bootstrap_info_t *bootstrap;

	uid_t client_euid;
	
	bootstrap = lookup_bootstrap_by_port(bootstrap_port);
	debug("Server create attempt: \"%s\" bootstrap %x",
	      server_cmd, bootstrap_port);

	/* No forwarding allowed for this call - security risk (we run as root) */
	if (!bootstrap || !active_bootstrap(bootstrap)) {
		debug("Server create: \"%s\": invalid bootstrap %x",
			server_cmd, bootstrap_port);
		return BOOTSTRAP_NOT_PRIVILEGED;
	}

	/* get the identity of the requestor and set up audit_info of server */
	audit_token_to_au32(client_audit_token,
			    &audit_info.ai_auid,
			    &client_euid,
			    NULL /* egid */,
			    NULL /* ruid */,
			    NULL /* rgid */,
			    NULL /* pid */,
			    &audit_info.ai_asid,
			    &audit_info.ai_termid);

	if (client_euid != 0 && client_euid != server_uid) {
		notice("Server create: \"%s\": insufficient privilege for specified uid (euid-%d != requested-%d)",
			server_cmd, client_euid, server_uid);
		return BOOTSTRAP_NOT_PRIVILEGED;
	}

	serverp = new_server(
					bootstrap,
					server_cmd,
					server_uid,
					(on_demand) ? DEMAND : RESTARTABLE,
					audit_info);
	setup_server(serverp);

	info("New server %x in bootstrap %x: \"%s\"",
					serverp->port, bootstrap_port, server_cmd);
	*server_portp = serverp->port;
	return BOOTSTRAP_SUCCESS;
}
Пример #9
0
static void accept_cb(EV_P_ ev_io *w, int revents)
{
    listen_ctx_t *listener = (listen_ctx_t *)w;
    struct sockaddr_storage destaddr;
    int err;

    int serverfd = accept(listener->fd, NULL, NULL);
    if (serverfd == -1) {
        ERROR("accept");
        return;
    }

    err = getdestaddr(serverfd, &destaddr);
    if (err) {
        ERROR("getdestaddr");
        return;
    }

    setnonblocking(serverfd);
    int opt = 1;
    setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    int index                    = rand() % listener->remote_num;
    struct sockaddr *remote_addr = listener->remote_addr[index];

    int remotefd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
    if (remotefd < 0) {
        ERROR("socket");
        return;
    }

    setsockopt(remotefd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(remotefd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    // Setup
    setnonblocking(remotefd);

    server_t *server = new_server(serverfd, listener->method);
    remote_t *remote = new_remote(remotefd, listener->timeout);
    server->remote   = remote;
    remote->server   = server;
    server->destaddr = destaddr;

    connect(remotefd, remote_addr, get_sockaddr_len(remote_addr));
    // listen to remote connected event
    ev_io_start(EV_A_ & remote->send_ctx->io);
    ev_io_start(EV_A_ & server->recv_ctx->io);
    ev_timer_start(EV_A_ & remote->send_ctx->watcher);
}
Пример #10
0
void viagra_cmd_jupe(char *jserver, char *who, char *reason)
{
    char rbuf[256];

    snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", who,
             reason ? ": " : "", reason ? reason : "");

    if (findserver(servlist, jserver))
        viagra_cmd_squit(jserver, rbuf);
    viagra_cmd_server(jserver, 2, rbuf);
    new_server(me_server, jserver, rbuf, SERVER_JUPED, NULL);
}
Пример #11
0
int main(int argc, char* argv[]) {
#ifdef _DEBUG
    Config::DEBUG = true;
#else
    Config::DEBUG = false;
#endif

    Log("[[[[[[[[[[Developed By Tsume]]]]]]]]]]\n");
    setTitle(" - Connections: 0");

    Config cfg;
    CDatabase db(&cfg);

    LoginServer login;
    WorldServer world;
    ZoneServer zone;

    int s_index = 0;

    try {
        if (db.Connect())
        {
            if (argc > 1) {
                new_server(getType(argv[1]), &cfg, &db, s_index++, &login);

                if (argc > 2) {
                    new_server(getType(argv[2]), &cfg, &db, s_index++, &world);
                }

                if (argc > 3) {
                    new_server(getType(argv[3]), &cfg, &db, s_index++, &zone);
                }
            }
            else {
                new_server(0, &cfg, &db, s_index++, &login);
                new_server(1, &cfg, &db, s_index++, &world);
                new_server(2, &cfg, &db, s_index++, &zone);
                Config::DEBUG = true;
            }

            bool running = true;

            while (running) {
                if (Config::DEBUG) Log("Pinging SQL server to keep connection alive...");
                if (!db.ConnectionAlive()) {
                    Log("Connection to database lost!!");
                    break;
                }
                std::this_thread::sleep_for(std::chrono::minutes(2));
            }
        }

        Log("Stopping...");
    }
    catch (std::exception& e) {
        std::cerr << "Exception: " << e.what() << "\n";
    }

    return 0;
}
Пример #12
0
int main(void) {
	int clientfd;

	setup_signals();
	printf("*** Creating a server...\n");

	if ((serverfd = new_server("server1.example.com")) < 0) {
		perror("Couldn't create server");
		exit(EXIT_FAILURE);
	}

	printf("*** Created!\n"
	       "    This is an echo server.\n"
	       "    Anything received will be echoed back to the client.\n\n");

	/* Accept a client */
	if ((clientfd = accept_client(serverfd)) < 0) {
		perror("Couldn't accept client");
		destroy_server(serverfd);
		exit(EXIT_FAILURE);
	}

	printf("*** Accepted incoming connection request.\n");

	static char buf[512+1];
	int n;

	while ((n = recv_info(clientfd, buf, sizeof(buf)-1)) > 0) {
		buf[n] = '\0';
		if (!strcmp(buf, "__QUIT__NOW__\n")) {
			printf("*** Got disconnect request from client, leaving...\n");
			disconnect_from(clientfd);
			break;
		}

		printf("*** Received: %s", buf);

		if (send_info(clientfd, buf, n) < 0) {
			perror("Error sending message to client");
		} else {
			printf("*** Sent: %s", buf);
		}
	}

	printf("*** Goodbye\n");

	destroy_server(serverfd);

	return 0;
}
Пример #13
0
/*
 * Function: get the reply from either the surname server or other firstname servers
 * 
 * Parameters: pointer to the list of registered users, the buffer, the length of the buffer, the host entity of the surname server, the port of the latter
 * 			 and the surname which location is wanted to know 
 * 
 * Return:	the reply to the query made by the user of the schat application
 * 
 */
 char* do_qry(list* start, char* buffer, int n, struct hostent *h, int surport, char* surname) {

	char *bufferIn;
	int send_len;
	user User;
	completename Complete;
	server Server;
	
	/* Stored wanted User */
	Complete = encontra_nomes(buffer, n);

	if(strcmp(surname, Complete.last) == 0){
		/* The wanted User is in this snp */
		if(getuser(start, Complete.first, Complete.last) != 0){

			User = get_localization(start, Complete.first);
			/* The +3 is there for 2 semicolon and one dot */
			send_len = (strlen("RPL ")+strlen(User.name)+strlen(User.surname)+strlen(User.ip)+strlen(User.port)+3);
			bufferIn = (char*)malloc(sizeof(char)*send_len);
			sprintf(bufferIn, "RPL %s.%s;%s;%s", User.name, User.surname, User.ip, User.port);

		}else{
			/* User requested has a valid surname for this server but not an existent first name */
			return "NOK User not registered therefore his location is impossible to reach";
		}
	}else{
		bufferIn = do_qry_sa(h, surport, Complete.last);

		if(strcmp(bufferIn,"SRPL") == 0){
			 return "NOK Server not found in the sa";
		}

		Server = new_server(bufferIn, strlen(bufferIn));
		
		bufferIn = do_qry_snp(Server.ip, Server.port, Complete.first, Complete.last);

		if(strcmp(bufferIn,"") == 0){
			 write(1, "User not found\n", strlen("User not found\n"));
			 return "NOK user not found";
		}
		
		/* return the reply*/
		write(1, "User found: ", strlen("User found: "));
		write(1, bufferIn, strlen(bufferIn));
		write(1, "\n", 1);
	}
	return bufferIn;
}
Пример #14
0
void
plexus_cmd_connect (int servernum)
{
  me_server = new_server (NULL, ServerName, ServerDesc, SERVER_ISME, NULL);

  if (servernum == 1)
    plexus_cmd_pass (RemotePassword);
  else if (servernum == 2)
    plexus_cmd_pass (RemotePassword2);
  else if (servernum == 3)
    plexus_cmd_pass (RemotePassword3);

  plexus_cmd_capab ();
  plexus_cmd_server (ServerName, 1, ServerDesc);
  plexus_cmd_svinfo ();
}
Пример #15
0
void viagra_cmd_connect(int servernum)
{
    me_server =
        new_server(NULL, ServerName, ServerDesc, SERVER_ISME, NULL);

    if (servernum == 1) {
        viagra_cmd_pass(RemotePassword);
    } else if (servernum == 2) {
        viagra_cmd_pass(RemotePassword2);
    } else if (servernum == 3) {
        viagra_cmd_pass(RemotePassword3);
    }
    viagra_cmd_capab();
    viagra_cmd_server(ServerName, 1, ServerDesc);
    viagra_cmd_svinfo();
    viagra_cmd_burst();
}
Пример #16
0
void accept_cb(EV_P_ ev_io *w, int revents)
{
    struct listen_ctx *listener = (struct listen_ctx *)w;
    int serverfd = accept(listener->fd, NULL, NULL);
    if (serverfd == -1) {
        ERROR("accept");
        return;
    }
    setnonblocking(serverfd);
#ifdef SO_NOSIGPIPE
    int opt = 1;
    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    struct server *server = new_server(serverfd, listener->method);
    server->listener = listener;

    ev_io_start(EV_A_ & server->recv_ctx->io);
}
Пример #17
0
//FIXME: move the stateful stuff to state.c, only the connection relavent stuff should be here
void
server_connect(char *host, char *port)
{
	connection_thread *ct;
	server *tmp, *s = NULL;

	/* Check if server matching host:port already exists */
	if ((tmp = server_head) != NULL) {
		do {
			if (!strcmp(tmp->host, host) && !strcmp(tmp->port, port)) {
				s = tmp;
				break;
			}
		} while ((tmp = tmp->next) != server_head);
	}

	/* Check if server is already connected */
	if (s && s->soc >= 0) {
		channel_set_current(s->channel);
		newlinef(s->channel, 0, "-!!-", "Already connected to %s:%s", host, port);
		return;
	}

	if (s == NULL)
		s = new_server(host, port);

	channel_set_current(s->channel);

	if ((ct = calloc(1, sizeof(*ct))) == NULL)
		fatal("calloc");

	ct->socket = -1;
	ct->socket_tmp = -1;
	ct->host = s->host;
	ct->port = s->port;

	s->connecting = ct;

	newlinef(s->channel, 0, "--", "Connecting to '%s' port %s", host, port);

	if ((pthread_create(&ct->tid, NULL, threaded_connect, ct)))
		fatal("pthread_create");
}
Пример #18
0
static void accept_cb(EV_P_ ev_io *w, int revents)
{
	struct sockaddr_storage destaddr;
	int err;
	
	struct sockaddr_in addr;
	int len = sizeof(struct sockaddr_in);
	
	printf("w->fd=%d\n", w->fd);
	int serverfd = accept(w->fd, (struct sockaddr*)&addr, &len);
	printf("accept_cb serverfd=%d\n", serverfd);
	if (-1 == serverfd)
	{
		perror("serverfd is error\n");
		
		return;
	}
	
	//err = getdestaddr(serverfd, &destaddr);
	//if (err){
	//	printf("getdestaddr error\n");
	//	return;
	//}
	
	setnonblocking(serverfd);
	
	int opt = 1;
	setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
	#ifdef SO_NOSIGPIPE
	setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
	#endif
	
	printf("accept_cb serverfd2=%d\n", serverfd);
	
	//ev_io rcv_io;
	//ev_io snd_io;
	server_t *server = new_server(serverfd);
	//ev_io_init(&rcv_io, server_recv_cb, serverfd, EV_READ);
    //ev_io_init(&snd_io, server_send_cb, serverfd, EV_WRITE);
	//ev_io_start(EV_A_ & rcv_io);
	ev_io_start(EV_A_ &server->recv_ctx->io);
}
Пример #19
0
session *
new_ircwindow (server *serv, char *name, int type)
{
	session *sess;

	switch (type)
	{
	case SESS_SERVER:
		serv = new_server ();
		if (prefs.use_server_tab)
		{
			register unsigned int oldh = prefs.hideuserlist;
			prefs.hideuserlist = 1;
			sess = new_session (serv, name, SESS_SERVER);
			prefs.hideuserlist = oldh;
		} else
		{
			sess = new_session (serv, name, SESS_CHANNEL);
		}
		serv->server_session = sess;
		serv->front_session = sess;
		break;
	case SESS_DIALOG:
		sess = new_session (serv, name, type);
		if (prefs.logging)
			log_open (sess);
		break;
	default:
/*	case SESS_CHANNEL:
	case SESS_NOTICES:
	case SESS_SNOTICES:*/
		sess = new_session (serv, name, type);
		break;
	}

	irc_init (sess);
	plugin_emit_dummy_print (sess, "Open Context");

	return sess;
}
Пример #20
0
static void
accept_cb(EV_P_ ev_io *w, int revents)
{
    listen_ctx_t *listener = (listen_ctx_t *)w;
    struct sockaddr_storage destaddr;
    int err;

    int serverfd = accept(listener->fd, NULL, NULL);
    if (serverfd == -1) {
        ERROR("accept");
        return;
    }

    err = getdestaddr(serverfd, &destaddr);
    if (err) {
        ERROR("getdestaddr");
        return;
    }

    setnonblocking(serverfd);
    int opt = 1;
    setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    int index                    = rand() % listener->remote_num;
    struct sockaddr *remote_addr = listener->remote_addr[index];

    int remotefd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
    if (remotefd == -1) {
        ERROR("socket");
        return;
    }

    // Set flags
    setsockopt(remotefd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(remotefd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    // Enable TCP keepalive feature
    int keepAlive    = 1;
    int keepIdle     = 40;
    int keepInterval = 20;
    int keepCount    = 5;
    setsockopt(remotefd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
    setsockopt(remotefd, SOL_TCP, TCP_KEEPIDLE, (void *)&keepIdle, sizeof(keepIdle));
    setsockopt(remotefd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
    setsockopt(remotefd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

    // Set non blocking
    setnonblocking(remotefd);

    // Enable MPTCP
    if (listener->mptcp == 1) {
        int err = setsockopt(remotefd, SOL_TCP, MPTCP_ENABLED, &opt, sizeof(opt));
        if (err == -1) {
            ERROR("failed to enable multipath TCP");
        }
    }

    server_t *server = new_server(serverfd, listener->method);
    remote_t *remote = new_remote(remotefd, listener->timeout);
    server->remote   = remote;
    remote->server   = server;
    server->destaddr = destaddr;

    int r = connect(remotefd, remote_addr, get_sockaddr_len(remote_addr));

    if (r == -1 && errno != CONNECT_IN_PROGRESS) {
        ERROR("connect");
        close_and_free_remote(EV_A_ remote);
        close_and_free_server(EV_A_ server);
        return;
    }

    // listen to remote connected event
    ev_io_start(EV_A_ & remote->send_ctx->io);
    ev_timer_start(EV_A_ & remote->send_ctx->watcher);
    ev_io_start(EV_A_ & server->recv_ctx->io);
}
Пример #21
0
Файл: core.c Проект: shenzhe/bsp
// Start main loop
int core_loop(void (* server_event)(BSP_CALLBACK *))
{
    BSP_THREAD *t = get_thread(MAIN_THREAD);
    if (!t)
    {
        trigger_exit(BSP_RTN_FATAL, "Main thread lost!");
    }

    // Servers
    BSP_VALUE *val = object_get_hash_str(runtime_settings, "servers");
    BSP_OBJECT *vobj = value_get_object(val);
    BSP_STRING *vstr = NULL;
    if (vobj && OBJECT_TYPE_ARRAY == vobj->type)
    {
        struct bsp_conf_server_t srv;
        BSP_OBJECT *vsrv = NULL;
        size_t varr_size = object_size(vobj), i;
        reset_object(vobj);
        for (i = 0; i < varr_size; i ++)
        {
            val = object_get_array(vobj, i);
            vsrv = value_get_object(val);
            if (vsrv && OBJECT_TYPE_HASH == vsrv->type)
            {
                // Default value
                memset(&srv, 0, sizeof(struct bsp_conf_server_t));
                srv.server_inet = INET_TYPE_ANY;
                srv.server_sock = SOCK_TYPE_ANY;
                srv.def_client_type = CLIENT_TYPE_DATA;
                srv.def_data_type = DATA_TYPE_PACKET;
                val = object_get_hash_str(vsrv, "name");
                vstr = value_get_string(val);
                srv.server_name = bsp_strndup(STR_STR(vstr), STR_LEN(vstr));
                val = object_get_hash_str(vsrv, "inet");
                vstr = value_get_string(val);
                if (vstr)
                {
                    if (0 == strncasecmp(STR_STR(vstr), "ipv6", 4))
                    {
                        srv.server_inet = INET_TYPE_IPV6;
                    }
                    else if (0 == strncasecmp(STR_STR(vstr), "ipv4", 4))
                    {
                        srv.server_inet = INET_TYPE_IPV4;
                    }
                    else if (0 == strncasecmp(STR_STR(vstr), "local", 5))
                    {
                        srv.server_inet = INET_TYPE_LOCAL;
                    }
                }
                val = object_get_hash_str(vsrv, "sock");
                vstr = value_get_string(val);
                if (vstr)
                {
                    if (0 == strncasecmp(STR_STR(vstr), "tcp", 3))
                    {
                        srv.server_sock = SOCK_TYPE_TCP;
                    }
                    else if (0 == strncasecmp(STR_STR(vstr), "udp", 3))
                    {
                        srv.server_sock = SOCK_TYPE_UDP;
                    }
                }
                val = object_get_hash_str(vsrv, "addr");
                vstr = value_get_string(val);
                srv.server_addr = bsp_strndup(STR_STR(vstr), STR_LEN(vstr));
                val = object_get_hash_str(vsrv, "port");
                srv.server_port = (int) value_get_int(val);
                val = object_get_hash_str(vsrv, "heartbeat_check");
                srv.heartbeat_check = (int) value_get_int(val);
                val = object_get_hash_str(vsrv, "debug_input");
                srv.debug_hex_input = value_get_boolean(val);
                val = object_get_hash_str(vsrv, "debug_output");
                srv.debug_hex_input = value_get_boolean(val);
                val = object_get_hash_str(vsrv, "max_clients");
                srv.max_clients = (int) value_get_int(val);
                val = object_get_hash_str(vsrv, "max_packet_length");
                srv.max_packet_length = (size_t) value_get_int(val);
                val = object_get_hash_str(vsrv, "websocket");
                if (value_get_boolean(val))
                {
                    srv.def_client_type = CLIENT_TYPE_WEBSOCKET_HANDSHAKE;
                }
                val = object_get_hash_str(vsrv, "data_type");
                vstr = value_get_string(val);
                if (vstr && 0 == strncasecmp(STR_STR(vstr), "stream", 6))
                {
                    srv.def_data_type = DATA_TYPE_STREAM;
                }

                // Add server
                BSP_SERVER *s;
                int srv_fds[MAX_SERVER_PER_CREATION], srv_ct, fd_type;
                int nfds = MAX_SERVER_PER_CREATION;
                nfds = new_server(srv.server_addr, srv.server_port, srv.server_inet, srv.server_sock, srv_fds, &nfds);
                for (srv_ct = 0; srv_ct < nfds; srv_ct ++)
                {
                    fd_type = FD_TYPE_SOCKET_SERVER;
                    s = (BSP_SERVER *) get_fd(srv_fds[srv_ct], &fd_type);
                    if (s)
                    {
                        s->name = srv.server_name;
                        s->heartbeat_check = srv.heartbeat_check;
                        s->def_client_type = srv.def_client_type;
                        s->def_data_type = srv.def_data_type;
                        s->max_packet_length = srv.max_packet_length;
                        s->max_clients = srv.max_clients;
                        s->debug_hex_input = srv.debug_hex_input;
                        s->debug_hex_output = srv.debug_hex_output;

                        add_server(s);
                    }
                    else
                    {
                        bsp_free(srv.server_name);
                    }
                }
            }
        }
    }

    // Server event
    if (server_event)
    {
        core_settings.on_srv_events = server_event;
    }

    // Create 1 Hz clock
    BSP_TIMER *tmr = new_timer(BASE_CLOCK_SEC, BASE_CLOCK_USEC, -1);
    tmr->on_timer = base_timer;
    core_settings.main_timer = tmr;
    dispatch_to_thread(tmr->fd, MAIN_THREAD);
    start_timer(tmr);

    // Let's go
    load_bootstrap();
    trace_msg(TRACE_LEVEL_CORE, "Core   : Main thread loop started");
    thread_process((void *) t);

    return BSP_RTN_SUCCESS;
}
Пример #22
0
static void
accept_cb(EV_P_ ev_io *w, int revents)
{
    struct listen_ctx *listener = (struct listen_ctx *)w;
    int serverfd                = accept(listener->fd, NULL, NULL);
    if (serverfd == -1) {
        ERROR("accept");
        return;
    }
    setnonblocking(serverfd);
    int opt = 1;
    setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    int index                    = rand() % listener->remote_num;
    struct sockaddr *remote_addr = listener->remote_addr[index];

    int remotefd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
    if (remotefd == -1) {
        ERROR("socket");
        return;
    }

#ifdef ANDROID
    if (vpn) {
        int not_protect = 0;
        if (remote_addr->sa_family == AF_INET) {
            struct sockaddr_in *s = (struct sockaddr_in *)remote_addr;
            if (s->sin_addr.s_addr == inet_addr("127.0.0.1"))
                not_protect = 1;
        }
        if (!not_protect) {
            if (protect_socket(remotefd) == -1) {
                ERROR("protect_socket");
                close(remotefd);
                return;
            }
        }
    }
#endif

    setsockopt(remotefd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
#ifdef SO_NOSIGPIPE
    setsockopt(remotefd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
#endif

    if (listener->mptcp == 1) {
        int err = setsockopt(remotefd, SOL_TCP, MPTCP_ENABLED, &opt, sizeof(opt));
        if (err == -1) {
            ERROR("failed to enable multipath TCP");
        }
    }

    // Setup
    setnonblocking(remotefd);
#ifdef SET_INTERFACE
    if (listener->iface) {
        if (setinterface(remotefd, listener->iface) == -1)
            ERROR("setinterface");
    }
#endif

    server_t *server = new_server(serverfd, listener->method);
    remote_t *remote = new_remote(remotefd, listener->timeout);
    server->destaddr = listener->tunnel_addr;
    server->remote   = remote;
    remote->server   = server;

    int r = connect(remotefd, remote_addr, get_sockaddr_len(remote_addr));

    if (r == -1 && errno != CONNECT_IN_PROGRESS) {
        ERROR("connect");
        close_and_free_remote(EV_A_ remote);
        close_and_free_server(EV_A_ server);
        return;
    }

    // listen to remote connected event
    ev_io_start(EV_A_ & remote->send_ctx->io);
    ev_timer_start(EV_A_ & remote->send_ctx->watcher);
}
Пример #23
0
int main(int argc, char *argv[]) {
    /*
    	First up: initialize HeavyThing, and like our previous
    	examples, we are not interested in argc/argv from inside
    	our assembler environment:

    	An interesting sidenote here: because HeavyThing has normal
    	function definitions for memcpy, memcmp, etc, those get
    	preferentially linked instead of the libc versions, and so
    	during our C++ initialization, those HeavyThing functions
    	were already called. Fortunately for us in this case, those
    	functions do not require any HeavyThing global state.
    */
    ht$init_args(0, 0);
    /*
    	We need a default/generic io layer for our top level
    */
    void **iolayer = io$new();
    /*
    	Set its virtual method table to our own:
    */
    iolayer[0] = epoll_methods;
    /*
    	Next in the layers is our ssh server layer, and its argument
    	as 0 specifies to use /etc/ssh host keys
    */
    void *sshserver = ssh$new_server(0);
    if (!sshserver) {
        std::cerr << "SSH host key error" << std::endl;
        exit(1);
    }
    /*
    	Unlike our authless version, set our authentication callback
    */
    ssh$set_authcb(sshserver, ssh_authenticate);
    /*
    	We have to link the iolayer with the ssh layer:
    */
    io$link((void *)iolayer, sshserver);
    /*
    	And our lowest layer is a real epoll object with defaults
    */
    void *listener = epoll$new((vmethod_t)epoll$default_vtable, 0);
    /*
    	Link that to our sshserver
    */
    io$link(sshserver, listener);
    /*
    	Setup an IPv4 socket address for our listener, noting that
    	sockaddr_in_size from epoll.inc is 16 bytes. Listener port
    	== 8001:
    */
    unsigned char addrbuf[16];
    inaddr_any(addrbuf, 8001);
    /*
    	Now we can pass that off to our epoll layer. The HeavyThing's
    	epoll$inbound will return false if bind failure:
    */
    if (!epoll$inbound(addrbuf, sizeof(addrbuf), (void *)iolayer)) {
        std::cerr << "INADDR_ANY:8001 bind failure." << std::endl;
        exit(1);
    }
    /*
    	Dump a banner to stdout so that we know all is well
    */
    std::cout << "Simple SSH chat server listening on port 8001." << std::endl;
    /*
    	Pass control (indefinitely) to HeavyThing's epoll layer.
    */
    epoll$run();
    /*
    	Not reached.
    */
}