Пример #1
0
/* Connect to server, call func when finished */
int net_connect_nonblock(const char *server, int port, const IPADDR *my_ip,
                         NET_CALLBACK func, void *data)
{
    SIMPLE_THREAD_REC *rec;
    int fd[2];

    g_return_val_if_fail(server != NULL, FALSE);
    g_return_val_if_fail(func != NULL, FALSE);

    if (pipe(fd) != 0) {
        g_warning("net_connect_nonblock(): pipe() failed.");
        return FALSE;
    }

    rec = g_new0(SIMPLE_THREAD_REC, 1);
    rec->port = port;
    if (my_ip != NULL) {
        rec->my_ip = g_malloc(sizeof(IPADDR));
        memcpy(rec->my_ip, my_ip, sizeof(IPADDR));
    }
    rec->func = func;
    rec->data = data;
    rec->pipes[0] = g_io_channel_new(fd[0]);
    rec->pipes[1] = g_io_channel_new(fd[1]);

    /* start nonblocking host name lookup */
    net_gethostbyname_nonblock(server, rec->pipes[1], 0);
    rec->tag = g_input_add(rec->pipes[0], G_INPUT_READ,
                           (GInputFunction) simple_readpipe, rec);

    return TRUE;
}
Пример #2
0
/* starts connecting to server */
int server_start_connect(SERVER_REC *server)
{
	const char *connect_address;
        int fd[2];

	g_return_val_if_fail(server != NULL, FALSE);
	if (!server->connrec->unix_socket && server->connrec->port <= 0)
		return FALSE;

	server->rawlog = rawlog_create();

	if (server->connrec->connect_handle != NULL) {
		/* already connected */
		GIOChannel *handle = server->connrec->connect_handle;

		server->connrec->connect_handle = NULL;
		server->handle = net_sendbuffer_create(handle, 0);
		server_connect_finished(server);
	} else if (server->connrec->unix_socket) {
		/* connect with unix socket */
		server_real_connect(server, NULL, server->connrec->address);
	} else {
		/* resolve host name */
		if (pipe(fd) != 0) {
			g_warning("server_connect(): pipe() failed.");
			g_free(server->tag);
			g_free(server->nick);
			return FALSE;
		}

		server->connect_pipe[0] = g_io_channel_unix_new(fd[0]);
		server->connect_pipe[1] = g_io_channel_unix_new(fd[1]);

		connect_address = server->connrec->proxy != NULL ?
			server->connrec->proxy : server->connrec->address;
		server->connect_pid =
			net_gethostbyname_nonblock(connect_address,
						   server->connect_pipe[1],
						   settings_get_bool("resolve_reverse_lookup"));
		server->connect_tag =
			g_input_add(server->connect_pipe[0], G_INPUT_READ,
				    (GInputFunction)
				    server_connect_callback_readpipe,
				    server);

		lookup_servers = g_slist_append(lookup_servers, server);

		signal_emit("server looking", 1, server);
	}
	return TRUE;
}