diff src/network.c @ 12730:d5b8f4dc1622

[gaim-migrate @ 15074] Update gaim_network_listen*() to have the socket type specified. This allows us to use the same functionality to listen on UDP sockets too. There are probably a couple things that should be updated to use this. I also updated SIMPLE to allow the connect port to be specified in the account options. committer: Tailor Script <tailor@pidgin.im>
author Daniel Atallah <daniel.atallah@gmail.com>
date Thu, 05 Jan 2006 05:04:07 +0000
parents fb3b7466e3d2
children 8e3b85fe4a55
line wrap: on
line diff
--- a/src/network.c	Thu Jan 05 04:32:25 2006 +0000
+++ b/src/network.c	Thu Jan 05 05:04:07 2006 +0000
@@ -179,7 +179,7 @@
 
 
 static int
-gaim_network_do_listen(unsigned short port)
+gaim_network_do_listen(unsigned short port, int socket_type)
 {
 	int listenfd = -1;
 	const int on = 1;
@@ -196,7 +196,7 @@
 	memset(&hints, 0, sizeof(struct addrinfo));
 	hints.ai_flags = AI_PASSIVE;
 	hints.ai_family = AF_UNSPEC;
-	hints.ai_socktype = SOCK_STREAM;
+	hints.ai_socktype = socket_type;
 	errnum = getaddrinfo(NULL /* any IP */, serv, &hints, &res);
 	if (errnum != 0) {
 #ifndef _WIN32
@@ -222,6 +222,8 @@
 			gaim_debug_warning("network", "setsockopt: %s\n", strerror(errno));
 		if (bind(listenfd, next->ai_addr, next->ai_addrlen) == 0)
 			break; /* success */
+		/* XXX - It is unclear to me (datallah) whether we need to be
+		   using a new socket each time */
 		close(listenfd);
 	}
 
@@ -232,7 +234,7 @@
 #else
 	struct sockaddr_in sockin;
 
-	if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+	if ((listenfd = socket(AF_INET, socket_type, 0)) < 0) {
 		gaim_debug_warning("network", "socket: %s\n", strerror(errno));
 		return -1;
 	}
@@ -251,7 +253,7 @@
 	}
 #endif
 
-	if (listen(listenfd, 4) != 0) {
+	if (socket_type == SOCK_STREAM && listen(listenfd, 4) != 0) {
 		gaim_debug_warning("network", "listen: %s\n", strerror(errno));
 		close(listenfd);
 		return -1;
@@ -259,13 +261,16 @@
 	fcntl(listenfd, F_SETFL, O_NONBLOCK);
 
 	if ((controlInfo = gaim_upnp_discover()) != NULL) {
+		char *type_desc = (socket_type == SOCK_STREAM) ? "TCP" : "UDP";
 		if (!gaim_upnp_set_port_mapping(controlInfo,
 				gaim_network_get_port_from_fd(listenfd),
-				"TCP")) {
+				type_desc)) {
 			gaim_upnp_remove_port_mapping(controlInfo,
-				gaim_network_get_port_from_fd(listenfd), "TCP");
+				gaim_network_get_port_from_fd(listenfd),
+				type_desc);
 			gaim_upnp_set_port_mapping(controlInfo,
-				gaim_network_get_port_from_fd(listenfd), "TCP");
+				gaim_network_get_port_from_fd(listenfd),
+				type_desc);
 
 		}
 		g_free(controlInfo->serviceType);
@@ -278,15 +283,16 @@
 }
 
 int
-gaim_network_listen(unsigned short port)
+gaim_network_listen(unsigned short port, int socket_type)
 {
 	g_return_val_if_fail(port != 0, -1);
 
-	return gaim_network_do_listen(port);
+	return gaim_network_do_listen(port, socket_type);
 }
 
 int
-gaim_network_listen_range(unsigned short start, unsigned short end)
+gaim_network_listen_range(unsigned short start, unsigned short end,
+		int socket_type)
 {
 	int ret = -1;
 
@@ -299,7 +305,7 @@
 	}
 
 	for (; start <= end; start++) {
-		ret = gaim_network_do_listen(start);
+		ret = gaim_network_do_listen(start, socket_type);
 		if (ret >= 0)
 			break;
 	}