jabberd2  2.2.16
util/inaddr.c
Go to the documentation of this file.
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 }