jabberd2
2.2.16
|
00001 /* 00002 * jabberd - Jabber Open Source Server 00003 * Copyright (c) 2002 Jeremie Miller, Thomas Muldowney, 00004 * Ryan Eatmon, Robert Norris 00005 * 00006 * This program is free software; you can redistribute it and/or modify 00007 * it under the terms of the GNU General Public License as published by 00008 * the Free Software Foundation; either version 2 of the License, or 00009 * (at your option) any later version. 00010 * 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with this program; if not, write to the Free Software 00018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307USA 00019 */ 00020 00035 #include "util.h" 00036 00046 int j_inet_pton(char *src, struct sockaddr_storage *dst) 00047 { 00048 #ifndef HAVE_INET_PTON 00049 struct sockaddr_in *sin; 00050 00051 memset(dst, 0, sizeof(struct sockaddr_storage)); 00052 sin = (struct sockaddr_in *)dst; 00053 00054 if(inet_aton(src, &sin->sin_addr)) 00055 { 00056 dst->ss_family = AF_INET; 00057 return 1; 00058 } 00059 00060 return 0; 00061 #else 00062 struct sockaddr_in *sin; 00063 struct sockaddr_in6 *sin6; 00064 00065 memset(dst, 0, sizeof(struct sockaddr_storage)); 00066 sin = (struct sockaddr_in *)dst; 00067 sin6 = (struct sockaddr_in6 *)dst; 00068 00069 if(inet_pton(AF_INET, src, &sin->sin_addr) > 0) 00070 { 00071 dst->ss_family = AF_INET; 00072 return 1; 00073 } 00074 00075 if(inet_pton(AF_INET6, src, &sin6->sin6_addr) > 0) 00076 { 00077 dst->ss_family = AF_INET6; 00078 #ifdef SIN6_LEN 00079 sin6->sin6_len = sizeof(struct sockaddr_in6); 00080 #endif 00081 return 1; 00082 } 00083 00084 return 0; 00085 #endif 00086 } 00087 00097 const char *j_inet_ntop(struct sockaddr_storage *src, char *dst, size_t size) 00098 { 00099 #ifndef HAVE_INET_NTOP 00100 char *tmp; 00101 struct sockaddr_in *sin; 00102 00103 sin = (struct sockaddr_in *)src; 00104 00105 /* if we don't have inet_ntop we only accept AF_INET 00106 * it's unlikely that we would have use for AF_INET6 00107 */ 00108 if(src->ss_family != AF_INET) 00109 { 00110 return NULL; 00111 } 00112 00113 tmp = inet_ntoa(sin->sin_addr); 00114 00115 if(!tmp || strlen(tmp)>=size) 00116 { 00117 return NULL; 00118 } 00119 00120 strncpy(dst, tmp, size); 00121 return dst; 00122 #else 00123 struct sockaddr_in *sin; 00124 struct sockaddr_in6 *sin6; 00125 00126 sin = (struct sockaddr_in *)src; 00127 sin6 = (struct sockaddr_in6 *)src; 00128 00129 switch(src->ss_family) 00130 { 00131 case AF_UNSPEC: 00132 case AF_INET: 00133 return inet_ntop(AF_INET, &sin->sin_addr, dst, size); 00134 case AF_INET6: 00135 return inet_ntop(AF_INET6, &sin6->sin6_addr, dst, size); 00136 default: 00137 return NULL; 00138 } 00139 #endif 00140 } 00141 00148 int j_inet_getport(struct sockaddr_storage *sa) 00149 { 00150 struct sockaddr_in *sin; 00151 struct sockaddr_in6 *sin6; 00152 00153 switch(sa->ss_family) 00154 { 00155 case AF_INET: 00156 sin = (struct sockaddr_in *)sa; 00157 return ntohs(sin->sin_port); 00158 case AF_INET6: 00159 sin6 = (struct sockaddr_in6 *)sa; 00160 return ntohs(sin6->sin6_port); 00161 default: 00162 return 0; 00163 } 00164 } 00165 00173 int j_inet_setport(struct sockaddr_storage *sa, in_port_t port) 00174 { 00175 struct sockaddr_in *sin; 00176 struct sockaddr_in6 *sin6; 00177 00178 sin = (struct sockaddr_in *)sa; 00179 sin6 = (struct sockaddr_in6 *)sa; 00180 00181 switch(sa->ss_family) 00182 { 00183 case AF_INET: 00184 sin->sin_port = htons(port); 00185 return 1; 00186 case AF_INET6: 00187 sin6->sin6_port = htons(port); 00188 return 1; 00189 default: 00190 return 0; 00191 } 00192 } 00193 00203 socklen_t j_inet_addrlen(struct sockaddr_storage *sa) 00204 { 00205 #ifdef SIN6_LEN 00206 if(sa->ss_len != 0) 00207 return sa->ss_len; 00208 #endif 00209 switch(sa->ss_family) 00210 { 00211 case AF_INET: 00212 return sizeof(struct sockaddr_in); 00213 case AF_INET6: 00214 return sizeof(struct sockaddr_in6); 00215 default: 00216 return sizeof(struct sockaddr_storage); 00217 } 00218 }