ccn_sockaddrutil.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <string.h>
00022 #include <sys/types.h>
00023 #include <sys/socket.h>
00024 #include <netinet/in.h>
00025 #include <arpa/inet.h>
00026 #include <ccn/charbuf.h>
00027 #include <ccn/sockaddrutil.h>
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 int
00038 ccn_charbuf_append_sockaddr(struct ccn_charbuf *c, const struct sockaddr *sa)
00039 {
00040 const unsigned char *rawaddr = NULL;
00041 const char *s = NULL;
00042 const char *closer = "";
00043 const struct sockaddr_in *addr4 = NULL;
00044 const struct sockaddr_in6 *addr6 = NULL;
00045 size_t savlen = c->length;
00046 socklen_t sz = 80;
00047 int port = 0;
00048
00049 if (sa == NULL)
00050 return(-1);
00051 switch (sa->sa_family) {
00052 case AF_INET:
00053 addr4 = (struct sockaddr_in *)sa;
00054 rawaddr = (const unsigned char *)&addr4->sin_addr.s_addr;
00055 port = htons(addr4->sin_port);break;
00056 case AF_INET6:
00057 addr6 = (struct sockaddr_in6 *)sa;
00058 rawaddr = (const unsigned char *)&addr6->sin6_addr;
00059 port = htons(addr6->sin6_port);
00060 ccn_charbuf_append_string(c, "[");
00061 closer = "]";
00062 break;
00063 default:
00064 return(-1);
00065 }
00066 s = inet_ntop(sa->sa_family, rawaddr,
00067 (void *)ccn_charbuf_reserve(c, sz), sz);
00068 if (s == NULL) {
00069 c->length = savlen;
00070 return(-1);
00071 }
00072 c->length += strlen(s);
00073 ccn_charbuf_append_string(c, closer);
00074 return(port);
00075 }