jabberd2  2.2.17
inaddr.c
Go to the documentation of this file.
1 /*
2  * jabberd - Jabber Open Source Server
3  * Copyright (c) 2002 Jeremie Miller, Thomas Muldowney,
4  * Ryan Eatmon, Robert Norris
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307USA
19  */
20 
35 #include "util.h"
36 
46 int j_inet_pton(char *src, struct sockaddr_storage *dst)
47 {
48 #ifndef HAVE_INET_PTON
49  struct sockaddr_in *sin;
50 
51  memset(dst, 0, sizeof(struct sockaddr_storage));
52  sin = (struct sockaddr_in *)dst;
53 
54  if(inet_aton(src, &sin->sin_addr))
55  {
56  dst->ss_family = AF_INET;
57  return 1;
58  }
59 
60  return 0;
61 #else
62  struct sockaddr_in *sin;
63  struct sockaddr_in6 *sin6;
64 
65  memset(dst, 0, sizeof(struct sockaddr_storage));
66  sin = (struct sockaddr_in *)dst;
67  sin6 = (struct sockaddr_in6 *)dst;
68 
69  if(inet_pton(AF_INET, src, &sin->sin_addr) > 0)
70  {
71  dst->ss_family = AF_INET;
72  return 1;
73  }
74 
75  if(inet_pton(AF_INET6, src, &sin6->sin6_addr) > 0)
76  {
77  dst->ss_family = AF_INET6;
78 #ifdef SIN6_LEN
79  sin6->sin6_len = sizeof(struct sockaddr_in6);
80 #endif
81  return 1;
82  }
83 
84  return 0;
85 #endif
86 }
87 
97 const char *j_inet_ntop(struct sockaddr_storage *src, char *dst, size_t size)
98 {
99 #ifndef HAVE_INET_NTOP
100  char *tmp;
101  struct sockaddr_in *sin;
102 
103  sin = (struct sockaddr_in *)src;
104 
105  /* if we don't have inet_ntop we only accept AF_INET
106  * it's unlikely that we would have use for AF_INET6
107  */
108  if(src->ss_family != AF_INET)
109  {
110  return NULL;
111  }
112 
113  tmp = inet_ntoa(sin->sin_addr);
114 
115  if(!tmp || strlen(tmp)>=size)
116  {
117  return NULL;
118  }
119 
120  strncpy(dst, tmp, size);
121  return dst;
122 #else
123  struct sockaddr_in *sin;
124  struct sockaddr_in6 *sin6;
125 
126  sin = (struct sockaddr_in *)src;
127  sin6 = (struct sockaddr_in6 *)src;
128 
129  switch(src->ss_family)
130  {
131  case AF_UNSPEC:
132  case AF_INET:
133  return inet_ntop(AF_INET, &sin->sin_addr, dst, size);
134  case AF_INET6:
135  return inet_ntop(AF_INET6, &sin6->sin6_addr, dst, size);
136  default:
137  return NULL;
138  }
139 #endif
140 }
141 
149 {
150  struct sockaddr_in *sin;
151  struct sockaddr_in6 *sin6;
152 
153  switch(sa->ss_family)
154  {
155  case AF_INET:
156  sin = (struct sockaddr_in *)sa;
157  return ntohs(sin->sin_port);
158  case AF_INET6:
159  sin6 = (struct sockaddr_in6 *)sa;
160  return ntohs(sin6->sin6_port);
161  default:
162  return 0;
163  }
164 }
165 
173 int j_inet_setport(struct sockaddr_storage *sa, in_port_t port)
174 {
175  struct sockaddr_in *sin;
176  struct sockaddr_in6 *sin6;
177 
178  sin = (struct sockaddr_in *)sa;
179  sin6 = (struct sockaddr_in6 *)sa;
180 
181  switch(sa->ss_family)
182  {
183  case AF_INET:
184  sin->sin_port = htons(port);
185  return 1;
186  case AF_INET6:
187  sin6->sin6_port = htons(port);
188  return 1;
189  default:
190  return 0;
191  }
192 }
193 
203 socklen_t j_inet_addrlen(struct sockaddr_storage *sa)
204 {
205 #ifdef SIN6_LEN
206  if(sa->ss_len != 0)
207  return sa->ss_len;
208 #endif
209  switch(sa->ss_family)
210  {
211  case AF_INET:
212  return sizeof(struct sockaddr_in);
213  case AF_INET6:
214  return sizeof(struct sockaddr_in6);
215  default:
216  return sizeof(struct sockaddr_storage);
217  }
218 }