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 Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</a> | <a class="qindex" href="globals.html">Globals</a></div>
<div class="nav">
<a class="el" href="dir_000000.html">src</a> / <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. <http://www.koanlogic.com></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 <stdlib.h></span>
00013 <span class="preprocessor">#ifdef HAVE_STDINT</span>
00014 <span class="preprocessor"></span><span class="preprocessor">#include <stdint.h></span>
00015 <span class="preprocessor">#endif </span><span class="comment">/* HAVE_STDINT */</span>
00016 <span class="preprocessor">#include <<a class="code" href="addr_8h.html">klone/addr.h</a>></span>
00017 <span class="preprocessor">#include <<a class="code" href="server_8h.html">klone/server.h</a>></span>
00018 <span class="preprocessor">#include <u/libu.h></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-><a class="code" href="structaddr__s.html#o0">type</a> = ADDR_IPV4;
00036 addr-><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>, &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 &addr-><a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>.sin_addr) <= 0,
00044 <span class="stringliteral">"bad '<servname>.addr.ip' value"</span>);
00045 <span class="preprocessor">#else</span>
00046 <span class="preprocessor"></span> addr-><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-><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 '<servname>.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>, &subkey))
00053 {
00054 portn = atoi(u_config_get_value(subkey));
00055 warn_err_ifm(portn < 1 || portn > 65535, <span class="stringliteral">"port out of range"</span>);
00056 addr-><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 < 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-><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-><a class="code" href="structaddr__s.html#o0">type</a> = ADDR_IPV4;
00094
00095 <span class="comment">/* set default values */</span>
00096 memset(&addr-><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-><a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>));
00097 addr-><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-><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-><a class="code" href="structaddr__s.html#o0">type</a> = ADDR_IPV4;
00112
00113 <span class="comment">/* set default values */</span>
00114 memset(&addr-><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-><a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>));
00115 addr-><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-><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-><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->type = ADDR_IPV4;
00134 memcpy(&addr->sa.sin, sa, sz);
00135 break;
00136 #ifndef NO_IPV6
00137 case sizeof(struct sockaddr_in6):
00138 addr->type = ADDR_IPV6;
00139 memcpy(&addr->sa.sin6, sa, sz);
00140 break;
00141 #endif
00142 #ifndef NO_UNIXSOCK
00143 case sizeof(struct sockaddr_un):
00144 addr->type = ADDR_UNIX;
00145 memcpy(&addr->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>, &subkey),
00167 <span class="stringliteral">"missing or bad '<servname>.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 '<servname>.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(&addr-><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-><a class="code" href="structaddr__s.html#o4">sa</a>.<a class="code" href="structaddr__s.html#o1">sin</a>));
00192 addr-><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-><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-><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">←Products</a>
</div>
<div style="text-align:center;">
© 2005-2006 - <a href="http://www.koanlogic.com">KoanLogic S.r.l.</a> - All rights reserved
</div>
</div>
</body>
</html>
|