pkg/kamailio/fedora/16: Updated rel in .spec to dev2
[sip-router] / proxy.h
1 /*
2  * $Id$
3  *
4  *
5  * Copyright (C) 2001-2003 FhG Fokus
6  *
7  * This file is part of ser, a free SIP server.
8  *
9  * ser is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version
13  *
14  * For a license to use the ser software under conditions
15  * other than those described here, or to purchase support for this
16  * software, please contact iptel.org by e-mail at the following addresses:
17  *    info@iptel.org
18  *
19  * ser is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License 
25  * along with this program; if not, write to the Free Software 
26  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
27  */
28  /*
29   * History:
30   * -------
31   *  2003-02-13  added proto to struct proxy_l & to *_proxy functions (andrei)
32   */
33
34
35 #ifndef proxy_h
36 #define proxy_h
37
38 #include <netdb.h>
39 #include "ip_addr.h"
40 #include "str.h"
41 #include "config.h"
42
43 struct proxy_l{
44         struct proxy_l* next;
45         str name; /* original name */
46         struct hostent host; /* addresses */
47         unsigned short port;
48         unsigned short reserved; /*align*/
49         int proto;
50         
51         /* socket ? */
52
53         int addr_idx;   /* crt. addr. idx. */
54         int ok; /* 0 on error */
55         /*statistics*/
56         int tx;
57         int tx_bytes;
58         int errors;
59 };
60
61 extern struct proxy_l* proxies;
62
63 struct proxy_l* add_proxy(str* name, unsigned short port, int proto);
64 struct proxy_l* mk_proxy(str* name, unsigned short port, int proto);
65 struct proxy_l* mk_shm_proxy(str* name, unsigned short port, int proto);
66 struct proxy_l* mk_proxy_from_ip(struct ip_addr* ip, unsigned short port,
67                                                                         int proto);
68 void free_proxy(struct proxy_l* p);
69 void free_shm_proxy(struct proxy_l* p);
70
71
72
73 /* returns 0 on success, -1 on error (unknown af/bug) */
74 inline static int proxy2su(union sockaddr_union* su, struct proxy_l* p)
75 {
76         /* if error try next ip address if possible */
77         if (p->ok==0){
78                 if (p->host.h_addr_list[p->addr_idx+1])
79                         p->addr_idx++;
80                 else p->addr_idx=0;
81                 p->ok=1;
82         }
83         
84         return hostent2su(su, &p->host, p->addr_idx,
85                                 (p->port)?p->port:((p->proto==PROTO_TLS)?SIPS_PORT:SIP_PORT) );
86 }
87
88
89
90 /* mark as proxy either as ok (err>=0) or as bad (err<0) */
91 inline static void proxy_mark(struct proxy_l* p, int err)
92 {
93         if (err<0){
94                 p->errors++;
95                 p->ok=0;
96         }else{
97                 p->tx++;
98         }
99 }
100
101
102
103 #endif
104