Beispiel #1
0
extern "C" int ext_yahoo_connect_async(int id, const char *host, int port, 
		yahoo_connect_callback callback, void *data)
{
	struct sockaddr_in serv_addr;
	static struct hostent *server;
	int servfd;
	struct connect_callback_data * ccd;
	int error;

	if(!(server = gethostbyname(host))) {
		errno=h_errno;
		return -1;
	}
	
	if((servfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		return -1;
	}
	
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	memcpy(&serv_addr.sin_addr.s_addr, *server->h_addr_list, server->h_length);
	serv_addr.sin_port = htons(port);
	
	error = connect(servfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
	
	LOG(kProtocolName, liDebug, "Trying to connect: fd:%d error:%d", servfd, error);
	if(!error) {
		LOG(kProtocolName, liDebug, "  connected!");
		callback(servfd, 0, data);
		return 0;
	} else if(error == -1 && errno == EINPROGRESS) {
		LOG(kProtocolName, liDebug, "  in progress...");
		ccd = (struct connect_callback_data*)calloc(1, sizeof(struct connect_callback_data));
		ccd->callback = callback;
		ccd->callback_data = data;
		ccd->id = id;
		
		ccd->tag = ext_yahoo_add_handler(-1, servfd, YAHOO_INPUT_WRITE, ccd);
		return ccd->tag;
	} else {
		LOG(kProtocolName, liDebug, "  error!");
		if(error == -1) {
			LOG(kProtocolName, liDebug, "%s", strerror(errno));
		}
		close(servfd);
		return -1;
	}
}
Beispiel #2
0
extern "C" int ext_yahoo_connect_async(int id, const char *host, int port, 
		yahoo_connect_callback callback, void *data, int use_ssl)
{
	struct sockaddr_in serv_addr;
	static struct hostent *server;
	int servfd;
	struct connect_callback_data * ccd;
	int error;
	SSL *ssl = NULL;

	struct _conn *c;

	LOG("Connecting to %s:%d\n", host, port);
	
	if (!(server = gethostbyname(host))) {
		errno=h_errno;
		return -1;
	}

	if ((servfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		return -1;
	}

	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	memcpy(&serv_addr.sin_addr.s_addr, *server->h_addr_list, server->h_length);
	serv_addr.sin_port = htons(port);

	c = y_new0(struct _conn, 1);
	c->fd = servfd;
	c->use_ssl = use_ssl;

	error = connect(servfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

	LOG("Trying to connect: fd:%d error:%d\n", servfd, error);
	if (!error) {
		LOG("Connected\n");
		if (use_ssl) {
			ssl = do_ssl_connect(servfd);

			if (!ssl) {
				LOG("SSL Handshake Failed!\n");
				ext_yahoo_close(c);

				callback(NULL, 0, data);
				return -1;
			}
		}

		c->ssl = ssl;
		fcntl(c->fd, F_SETFL, O_NONBLOCK);

		callback(c, 0, data);
		return 0;
	} else if (error == -1 && errno == EINPROGRESS) {
		ccd = (connect_callback_data*) calloc(1, sizeof(struct connect_callback_data));
		ccd->callback = callback;
		ccd->callback_data = data;
		ccd->id = id;

		ccd->tag = ext_yahoo_add_handler(-1, c, YAHOO_INPUT_WRITE, ccd);
		return ccd->tag;
	} else {
		if(error == -1)
			LOG("Connection failure: %s\n", strerror(errno));

		ext_yahoo_close(c);

		callback(NULL, errno, data);
		return -1;
	}
}