2b9cc09ff9b5914429118324bccfae35dcc7e534
[asterisk/asterisk.git] / addons / ooh323c / src / ooports.c
1 /*
2  * Copyright (C) 2004-2005 by Objective Systems, Inc.
3  *
4  * This software is furnished under an open source license and may be 
5  * used and copied only in accordance with the terms of this license. 
6  * The text of the license may generally be found in the root 
7  * directory of this installation in the COPYING file.  It 
8  * can also be viewed online at the following URL:
9  *
10  *   http://www.obj-sys.com/open/license.html
11  *
12  * Any redistributions of this file including modified versions must 
13  * maintain this copyright notice.
14  *
15  *****************************************************************************/
16
17 #include <asterisk.h>
18 #include <asterisk/lock.h>
19
20 #include "ooports.h"
21 #include "ooh323ep.h"
22 #include "ootrace.h"
23
24 /** Global endpoint structure */
25 extern OOH323EndPoint gH323ep;
26 extern ast_mutex_t bindPortLock;
27
28 /* Get the next port of type TCP/UDP/RTP */
29 int ooGetNextPort (OOH323PortType type)
30 {
31    if(type==OOTCP)
32    {
33       if(gH323ep.tcpPorts.current <= gH323ep.tcpPorts.max)
34          return gH323ep.tcpPorts.current++;
35       else
36       {
37          gH323ep.tcpPorts.current = gH323ep.tcpPorts.start;
38          return gH323ep.tcpPorts.current++;
39       }
40    }
41    if(type==OOUDP)
42    {
43       if(gH323ep.udpPorts.current <= gH323ep.udpPorts.max)
44          return gH323ep.udpPorts.current++;
45       else
46       {
47          gH323ep.udpPorts.current = gH323ep.udpPorts.start;
48          return gH323ep.udpPorts.current++;
49       }
50    }
51    if(type==OORTP)
52    {
53       if(gH323ep.rtpPorts.current <= gH323ep.rtpPorts.max)
54          return gH323ep.rtpPorts.current++;
55       else
56       {
57          gH323ep.rtpPorts.current = gH323ep.rtpPorts.start;
58          return gH323ep.rtpPorts.current++;
59       }
60    }
61    return OO_FAILED;
62 }
63
64 int ooBindPort (OOH323PortType type, OOSOCKET socket, char *ip)
65 {
66    int initialPort, bindPort, ret;
67    OOIPADDR ipAddrs;
68
69    ast_mutex_lock(&bindPortLock);
70
71    initialPort = ooGetNextPort (type);
72    bindPort = initialPort;
73
74    ret= ooSocketStrToAddr (ip, &ipAddrs);
75
76    while(1)
77    {
78       if((ret=ooSocketBind(socket, ipAddrs, bindPort))==0)
79       {
80          ast_mutex_unlock(&bindPortLock);
81          return bindPort;
82       }
83       else
84       {
85          bindPort = ooGetNextPort (type);
86          if (bindPort == initialPort) { ast_mutex_unlock(&bindPortLock); return OO_FAILED; }
87       }
88    }
89 }
90
91 #ifdef _WIN32        
92 int ooBindOSAllocatedPort(OOSOCKET socket, char *ip)
93 {
94    OOIPADDR ipAddrs;
95    int size, ret;
96    struct sockaddr_in name;
97    size = sizeof(struct sockaddr_in);
98    ret= ooSocketStrToAddr (ip, &ipAddrs);
99    if((ret=ooSocketBind(socket, ipAddrs, 
100                      0))==ASN_OK)
101    {
102       ret = ooSocketGetSockName(socket, &name, &size);
103       if(ret == ASN_OK)
104       {
105          return name.sin_port;
106          
107       }
108    }
109
110    return OO_FAILED;
111 }
112 #endif