aboutsummaryrefslogtreecommitdiffstats
path: root/addons/ooh323c/src/ooports.c
diff options
context:
space:
mode:
Diffstat (limited to 'addons/ooh323c/src/ooports.c')
-rw-r--r--addons/ooh323c/src/ooports.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/addons/ooh323c/src/ooports.c b/addons/ooh323c/src/ooports.c
new file mode 100644
index 000000000..3059404db
--- /dev/null
+++ b/addons/ooh323c/src/ooports.c
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2004-2005 by Objective Systems, Inc.
+ *
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
+ * can also be viewed online at the following URL:
+ *
+ * http://www.obj-sys.com/open/license.html
+ *
+ * Any redistributions of this file including modified versions must
+ * maintain this copyright notice.
+ *
+ *****************************************************************************/
+
+
+#include "ooports.h"
+#include "ooh323ep.h"
+#include "ootrace.h"
+
+/** Global endpoint structure */
+extern OOH323EndPoint gH323ep;
+
+/* Get the next port of type TCP/UDP/RTP */
+int ooGetNextPort (OOH323PortType type)
+{
+ if(type==OOTCP)
+ {
+ if(gH323ep.tcpPorts.current <= gH323ep.tcpPorts.max)
+ return gH323ep.tcpPorts.current++;
+ else
+ {
+ gH323ep.tcpPorts.current = gH323ep.tcpPorts.start;
+ return gH323ep.tcpPorts.current++;
+ }
+ }
+ if(type==OOUDP)
+ {
+ if(gH323ep.udpPorts.current <= gH323ep.udpPorts.max)
+ return gH323ep.udpPorts.current++;
+ else
+ {
+ gH323ep.udpPorts.current = gH323ep.udpPorts.start;
+ return gH323ep.udpPorts.current++;
+ }
+ }
+ if(type==OORTP)
+ {
+ if(gH323ep.rtpPorts.current <= gH323ep.rtpPorts.max)
+ return gH323ep.rtpPorts.current++;
+ else
+ {
+ gH323ep.rtpPorts.current = gH323ep.rtpPorts.start;
+ return gH323ep.rtpPorts.current++;
+ }
+ }
+ return OO_FAILED;
+}
+
+int ooBindPort (OOH323PortType type, OOSOCKET socket, char *ip)
+{
+ int initialPort, bindPort, ret;
+ OOIPADDR ipAddrs;
+
+ initialPort = ooGetNextPort (type);
+ bindPort = initialPort;
+
+ ret= ooSocketStrToAddr (ip, &ipAddrs);
+
+ while(1)
+ {
+ if((ret=ooSocketBind(socket, ipAddrs, bindPort))==0)
+ {
+ return bindPort;
+ }
+ else
+ {
+ bindPort = ooGetNextPort (type);
+ if (bindPort == initialPort) return OO_FAILED;
+ }
+ }
+}
+
+#ifdef _WIN32
+int ooBindOSAllocatedPort(OOSOCKET socket, char *ip)
+{
+ OOIPADDR ipAddrs;
+ int size, ret;
+ struct sockaddr_in name;
+ size = sizeof(struct sockaddr_in);
+ ret= ooSocketStrToAddr (ip, &ipAddrs);
+ if((ret=ooSocketBind(socket, ipAddrs,
+ 0))==ASN_OK)
+ {
+ ret = ooSocketGetSockName(socket, &name, &size);
+ if(ret == ASN_OK)
+ {
+ return name.sin_port;
+
+ }
+ }
+
+ return OO_FAILED;
+}
+#endif