00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00027 #include "event_int.h"
00028
00029 #include <netinet/in.h>
00030 #include <string.h>
00031 #include <sys/socket.h>
00032 #include <sys/types.h>
00033 #include <sys/un.h>
00034
00035 RCSTAG("@(#)$Id: sockaddr_import.c,v 1.2 2005/10/26 12:53:59 klmitch Exp $");
00036
00037 ev_err_t
00038 sockaddr_import(ev_sockaddr_t *sa, const struct sockaddr *addr)
00039 {
00040 ev_init();
00041
00042
00043 if (!sa || !addr ||
00044 (addr->sa_family != AF_LOCAL && addr->sa_family != AF_INET
00045 #ifdef HAVE_SOCKADDR_IN6
00046 && addr->sa_family != AF_INET6
00047 #endif
00048 ))
00049 ev_return(EINVAL);
00050
00051 switch (addr->sa_family) {
00052 case AF_LOCAL:
00053 sa->sa_type = AT_LOCAL;
00054 ev_assert(strlen(((struct sockaddr_un *)addr)->sun_path) <
00055 SOCK_LOCALADDR_LEN);
00056 strncpy(sa->sa_addr.saa_localaddr, ((struct sockaddr_un *)addr)->sun_path,
00057 SOCK_LOCALADDR_LEN - 1);
00058 break;
00059
00060 case AF_INET:
00061 sa->sa_type = AT_IPv4;
00062 sa->sa_addr.saa_ipaddr.saai_port =
00063 ntohs(((struct sockaddr_in *)addr)->sin_port);
00064 memcpy(sa->sa_addr.saa_ipaddr.saai_addrbuf,
00065 &((struct sockaddr_in *)addr)->sin_addr.s_addr, SOCK_ADDRBUFV4_LEN);
00066 break;
00067
00068 #ifdef HAVE_SOCKADDR_IN6
00069 case AF_INET6:
00070 sa->sa_type = AT_IPv6;
00071 sa->sa_addr.saa_ipaddr.saai_port =
00072 ntohs(((struct sockaddr_in6 *)addr)->sin6_port);
00073 memcpy(sa->sa_addr.saa_ipaddr.saai_addrbuf,
00074 ((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr,
00075 SOCK_ADDRBUFV6_LEN);
00076 break;
00077 #endif
00078 }
00079
00080 ev_return(0);
00081 }