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_export.c,v 1.3 2005/12/29 04:33:58 klmitch Exp $");
00036
00037 ev_err_t
00038 sockaddr_export(const ev_sockaddr_t *sa, struct sockaddr *addr, int *len)
00039 {
00040 int t_len;
00041
00042 ev_init();
00043
00044
00045 if (!sa || !addr || !len)
00046 ev_return(EINVAL);
00047
00048
00049 memset(addr, 0, *len);
00050
00051 switch (sa->sa_type) {
00052 #ifdef HAVE_SOCKADDR_IN6
00053 case AT_IPv6:
00054 if (*len < sizeof(struct sockaddr_in6))
00055 ev_return(ENOSPC);
00056 *len = sizeof(struct sockaddr_in6);
00057 ((struct sockaddr_in6 *)addr)->sin6_family = AF_INET6;
00058
00059 ((struct sockaddr_in6 *)addr)->sin6_port = htons(sa_ipaddrport(sa));
00060
00061 memcpy(((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr,
00062 sa_ipaddrbuf(sa), SOCK_ADDRBUFV6_LEN);
00063 break;
00064 #endif
00065
00066 case AT_IPv4:
00067 if (*len < sizeof(struct sockaddr_in))
00068 ev_return(ENOSPC);
00069 *len = sizeof(struct sockaddr_in);
00070 ((struct sockaddr_in *)addr)->sin_family = AF_INET;
00071
00072 ((struct sockaddr_in *)addr)->sin_port = htons(sa_ipaddrport(sa));
00073
00074 memcpy(&((struct sockaddr_in *)addr)->sin_addr.s_addr,
00075 sa_ipaddrbuf(sa), SOCK_ADDRBUFV4_LEN);
00076 break;
00077
00078 case AT_LOCAL:
00079 if (*len < (sizeof(struct sockaddr_un) - SOCK_LOCALADDR_LEN +
00080 (t_len = strlen(sa_localaddr(sa)))))
00081 ev_return(ENOSPC);
00082
00083 *len = sizeof(struct sockaddr_un) - SOCK_LOCALADDR_LEN + t_len;
00084 ((struct sockaddr_un *)addr)->sun_family = AF_LOCAL;
00085
00086 memcpy(((struct sockaddr_un *)addr)->sun_path, sa_localaddr(sa), t_len);
00087
00088 break;
00089
00090 default:
00091 ev_return(ENOSYS);
00092 break;
00093 }
00094
00095 #ifdef HAVE_SOCKADDR_SA_LEN
00096 addr->sa_len = *len;
00097 #endif
00098
00099 ev_return(0);
00100 }