File: addr_8c-source.html

package info (click to toggle)
klone 1.1.1.dfsg1-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 6,480 kB
  • ctags: 4,238
  • sloc: ansic: 16,288; makefile: 384; sh: 351
file content (224 lines) | stat: -rw-r--r-- 13,887 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>KLone: addr.c Source File</title>
<link href="kl.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.9.1 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a></div>
<div class="nav">
<a class="el" href="dir_000000.html">src</a>&nbsp;/&nbsp;<a class="el" href="dir_000001.html">libutils</a></div>
<h1>addr.c</h1><a href="addr_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="comment">/*</span>
00002 <span class="comment"> * Copyright (c) 2005, 2006 by KoanLogic s.r.l. &lt;http://www.koanlogic.com&gt;</span>
00003 <span class="comment"> * All rights reserved.</span>
00004 <span class="comment"> *</span>
00005 <span class="comment"> * This file is part of KLone, and as such it is subject to the license stated</span>
00006 <span class="comment"> * in the LICENSE file which you have received as part of this distribution.</span>
00007 <span class="comment"> *</span>
00008 <span class="comment"> * $Id: addr.c,v 1.16 2006/05/27 16:34:01 tat Exp $</span>
00009 <span class="comment"> */</span>
00010 
00011 <span class="preprocessor">#include "klone_conf.h"</span>
00012 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
00013 <span class="preprocessor">#ifdef HAVE_STDINT</span>
00014 <span class="preprocessor"></span><span class="preprocessor">#include &lt;stdint.h&gt;</span>
00015 <span class="preprocessor">#endif </span><span class="comment">/* HAVE_STDINT */</span>
00016 <span class="preprocessor">#include &lt;<a class="code" href="addr_8h.html">klone/addr.h</a>&gt;</span>
00017 <span class="preprocessor">#include &lt;<a class="code" href="server_8h.html">klone/server.h</a>&gt;</span>
00018 <span class="preprocessor">#include &lt;u/libu.h&gt;</span>
00019 
<a name="l00020"></a><a class="code" href="addr_8h.html#a7">00020</a> <span class="keywordtype">int</span> <a class="code" href="addr_8h.html#a7">addr_free</a>(<a class="code" href="structaddr__s.html">addr_t</a> *a)
00021 {
00022     U_FREE(a);
00023     <span class="keywordflow">return</span> 0;
00024 }
00025 
00026 <span class="keyword">static</span> <span class="keywordtype">int</span> addr_ipv4_create(u_config_t *c, <a class="code" href="structaddr__s.html">addr_t</a> *addr)
00027 {
00028     u_config_t *subkey;
00029     <span class="keywordtype">int</span> portn;
00030 
00031     dbg_return_if (c == NULL, ~0);
00032     dbg_return_if (addr == NULL, ~0);
00033     
00034     <span class="comment">/* set default values */</span>
00035     addr-&gt;<a class="code" href="structaddr__s.html#o0">type</a> = ADDR_IPV4;
00036     addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_family = AF_INET;
00037 
00038     <span class="comment">/* use user-defined ip or port */</span>
00039     <span class="keywordflow">if</span>(!u_config_get_subkey(c, <span class="stringliteral">"ip"</span>, &amp;subkey))
00040     {
00041 <span class="preprocessor">#ifdef OS_UNIX</span>
00042 <span class="preprocessor"></span>        warn_err_ifm(inet_pton(AF_INET, u_config_get_value(subkey), 
00043             &amp;addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_addr) &lt;= 0, 
00044                 <span class="stringliteral">"bad '&lt;servname&gt;.addr.ip' value"</span>);
00045 <span class="preprocessor">#else</span>
00046 <span class="preprocessor"></span>        addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_addr.s_addr = inet_addr(u_config_get_value(subkey));
00047         warn_err_ifm(addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_addr.s_addr == INADDR_NONE,
00048                 <span class="stringliteral">"bad '&lt;servname&gt;.addr.ip' value"</span>);
00049 <span class="preprocessor">#endif</span>
00050 <span class="preprocessor"></span>    }
00051 
00052     <span class="keywordflow">if</span>(!u_config_get_subkey(c, <span class="stringliteral">"port"</span>, &amp;subkey))
00053     {
00054         portn = atoi(u_config_get_value(subkey));
00055         warn_err_ifm(portn &lt; 1 || portn &gt; 65535, <span class="stringliteral">"port out of range"</span>);
00056         addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_port = htons(portn);
00057     }
00058 
00059     <span class="keywordflow">return</span> 0;
00060 err:
00061     <span class="keywordflow">return</span> ~0;
00062 }
00063 
00064 <span class="keyword">static</span> <span class="keywordtype">int</span> addr_is_ipv4(<span class="keyword">const</span> <span class="keywordtype">char</span> *ip)
00065 {
00066     size_t i, len = strlen(ip);
00067 
00068     dbg_return_if (ip == NULL, 0);
00069 
00070     <span class="comment">/* assume ip it's of type IPv4 if it contains a dot '.' */</span>
00071     <span class="keywordflow">for</span>(i = 0; i &lt; len; ++i)
00072         <span class="keywordflow">if</span>(ip[i] == <span class="charliteral">'.'</span>)
00073             <span class="keywordflow">return</span> 1;
00074     
00075     <span class="keywordflow">return</span> 0;
00076 }
00077 
<a name="l00078"></a><a class="code" href="addr_8h.html#a6">00078</a> <span class="keywordtype">int</span> <a class="code" href="addr_8h.html#a6">addr_set_ipv4_port</a>(<a class="code" href="structaddr__s.html">addr_t</a> *addr, <span class="keywordtype">int</span> port)
00079 {
00080     dbg_return_if (addr == NULL, ~0);
00081     dbg_return_if (port == 0, ~0);
00082 
00083     addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_port = htons(port);
00084 
00085     <span class="keywordflow">return</span> 0;
00086 }
00087 
<a name="l00088"></a><a class="code" href="addr_8h.html#a5">00088</a> <span class="keywordtype">int</span> <a class="code" href="addr_8h.html#a5">addr_set_ipv4_ip</a>(<a class="code" href="structaddr__s.html">addr_t</a> *addr, <span class="keyword">const</span> <span class="keywordtype">char</span> *ip)
00089 {
00090     dbg_return_if (addr == NULL, ~0);
00091     dbg_return_if (ip == NULL, ~0);
00092 
00093     addr-&gt;<a class="code" href="structaddr__s.html#o0">type</a> = ADDR_IPV4;
00094 
00095     <span class="comment">/* set default values */</span>
00096     memset(&amp;addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>, 0, <span class="keyword">sizeof</span>(addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>));
00097     addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_family = AF_INET;
00098     addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_addr.s_addr = inet_addr(ip);
00099 
00100     <span class="keywordflow">return</span> 0;
00101 }
00102 
<a name="l00103"></a><a class="code" href="addr_8h.html#a4">00103</a> <span class="keywordtype">int</span> <a class="code" href="addr_8h.html#a4">addr_set</a>(<a class="code" href="structaddr__s.html">addr_t</a> *addr, <span class="keyword">const</span> <span class="keywordtype">char</span> *ip, <span class="keywordtype">int</span> port)
00104 {
00105     dbg_return_if (addr == NULL, ~0);
00106     dbg_return_if (ip == NULL, ~0);
00107     dbg_return_if (port == 0, ~0);
00108 
00109     <span class="keywordflow">if</span>(addr_is_ipv4(ip))
00110     {
00111         addr-&gt;<a class="code" href="structaddr__s.html#o0">type</a> = ADDR_IPV4;
00112 
00113         <span class="comment">/* set default values */</span>
00114         memset(&amp;addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>, 0, <span class="keyword">sizeof</span>(addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>));
00115         addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_family = AF_INET;
00116         addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_addr.s_addr = inet_addr(ip);
00117         addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_port = htons(port);
00118     } <span class="keywordflow">else</span> {
00119         <span class="keywordflow">return</span> ~0; <span class="comment">/* FIXME IPv6 */</span>
00120     }
00121 
00122     <span class="keywordflow">return</span> 0;
00123 }
00124 
<a name="l00125"></a><a class="code" href="addr_8h.html#a3">00125</a> <span class="keywordtype">int</span> <a class="code" href="addr_8h.html#a3">addr_set_from_sa</a>(<a class="code" href="structaddr__s.html">addr_t</a> *addr, <span class="keyword">struct</span> sockaddr *sa, size_t sz)
00126 {
00127     dbg_return_if (addr == NULL, ~0);
00128     dbg_return_if (sa == NULL, ~0);
00129     
00130     <span class="keywordflow">switch</span>(sz)
00131     {
00132     <span class="keywordflow">case</span> <span class="keyword">sizeof</span>(<span class="keyword">struct </span>sockaddr_in):
00133         addr-&gt;type = ADDR_IPV4;
00134         memcpy(&amp;addr-&gt;sa.sin, sa, sz);
00135         break;
00136 #ifndef NO_IPV6
00137     case sizeof(struct sockaddr_in6):
00138         addr-&gt;type = ADDR_IPV6;
00139         memcpy(&amp;addr-&gt;sa.sin6, sa, sz);
00140         break;
00141 #endif
00142 #ifndef NO_UNIXSOCK
00143     case sizeof(struct sockaddr_un):
00144         addr-&gt;type = ADDR_UNIX;
00145         memcpy(&amp;addr-&gt;sa.sun, sa, sz);
00146         break;
00147 #endif  
00148     default:
00149         dbg("bad sockaddr size");
00150         return ~0;
00151     }
00152 
00153     return 0;
00154 }
00155 
<a name="l00156"></a><a class="code" href="addr_8h.html#a2">00156</a> int <a class="code" href="addr_8c.html#a7">addr_set_from_config</a>(addr_t *addr, u_config_t *c)
00157 {
00158     u_config_t *subkey;
00159     <span class="keyword">const</span> <span class="keywordtype">char</span> *type;
00160 
00161     dbg_return_if (addr == NULL, ~0);
00162     dbg_return_if (c == NULL, ~0);
00163     
00164     dbg_err_if(strcasecmp(u_config_get_key(c), <span class="stringliteral">"addr"</span>));
00165 
00166     warn_err_ifm(u_config_get_subkey(c, <span class="stringliteral">"type"</span>, &amp;subkey),
00167         <span class="stringliteral">"missing or bad '&lt;servname&gt;.addr.type' value"</span>);
00168 
00169     type = u_config_get_value(subkey); <span class="comment">/* IPv4, IPv6, unix, etc.  */</span>
00170 
00171     <span class="keywordflow">if</span>(!strcasecmp(type, <span class="stringliteral">"IPv4"</span>))
00172         dbg_err_if(addr_ipv4_create(c, addr));
00173     <span class="keywordflow">else</span> 
00174         warn_err_if(<span class="stringliteral">"bad '&lt;servname&gt;.addr.type', only IPv4 is supported"</span>);
00175 
00176     <span class="keywordflow">return</span> 0;
00177 err:
00178     <span class="keywordflow">return</span> ~0;
00179 }
00180 
<a name="l00181"></a><a class="code" href="addr_8h.html#a1">00181</a> <span class="keywordtype">int</span> <a class="code" href="addr_8h.html#a1">addr_create</a>(<a class="code" href="structaddr__s.html">addr_t</a> **pa)
00182 {
00183     <a class="code" href="structaddr__s.html">addr_t</a> *addr = NULL;
00184 
00185     dbg_return_if (pa == NULL, ~0);
00186     
00187     addr = u_zalloc(<span class="keyword">sizeof</span>(<a class="code" href="structaddr__s.html">addr_t</a>));
00188     dbg_err_if(addr == NULL);
00189 
00190     <span class="comment">/* set default ipv4 values */</span>
00191     memset(&amp;addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>, 0, <span class="keyword">sizeof</span>(addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>));
00192     addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_family = AF_INET;
00193     addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_addr.s_addr = htonl(INADDR_ANY);
00194     addr-&gt;<a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_port = htons(0);
00195 
00196     *pa = addr;
00197 
00198     <span class="keywordflow">return</span> 0;
00199 err:
00200     <span class="keywordflow">if</span>(addr)
00201         <a class="code" href="addr_8h.html#a7">addr_free</a>(addr);
00202     <span class="keywordflow">return</span> ~0;
00203 }
</pre></div><hr>
<div> 
  <div style="text-align:left">
    <a href="http://www.koanlogic.com/kl/cont/gb/html/products.html">&larr;Products</a>
  </div>
  <div style="text-align:center;">
    &copy; 2005-2006 - <a href="http://www.koanlogic.com">KoanLogic S.r.l.</a> - All rights reserved
  </div>
</div>

</body>
</html>