Changeset 391 for python/trunk/Modules/getnameinfo.c
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Modules/getnameinfo.c
r2 r391 2 2 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 3 3 * All rights reserved. 4 * 4 * 5 5 * Redistribution and use in source and binary forms, with or without 6 6 * modification, are permitted provided that the following conditions … … 14 14 * may be used to endorse or promote products derived from this software 15 15 * without specific prior written permission. 16 * 16 * 17 17 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 18 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE … … 54 54 55 55 static struct gni_afd { 56 57 58 59 56 int a_af; 57 int a_addrlen; 58 int a_socklen; 59 int a_off; 60 60 } gni_afdl [] = { 61 61 #ifdef ENABLE_IPV6 62 63 64 #endif 65 66 67 62 {PF_INET6, sizeof(struct in6_addr), sizeof(struct sockaddr_in6), 63 offsetof(struct sockaddr_in6, sin6_addr)}, 64 #endif 65 {PF_INET, sizeof(struct in_addr), sizeof(struct sockaddr_in), 66 offsetof(struct sockaddr_in, sin_addr)}, 67 {0, 0, 0}, 68 68 }; 69 69 70 70 struct gni_sockinet { 71 u_charsi_len;72 u_charsi_family;73 u_shortsi_port;71 u_char si_len; 72 u_char si_family; 73 u_short si_port; 74 74 }; 75 75 76 #define ENI_NOSOCKET 77 #define ENI_NOSERVNAME 78 #define ENI_NOHOSTNAME 79 #define ENI_MEMORY 80 #define ENI_SYSTEM 81 #define ENI_FAMILY 82 #define ENI_SALEN 76 #define ENI_NOSOCKET 0 77 #define ENI_NOSERVNAME 1 78 #define ENI_NOHOSTNAME 2 79 #define ENI_MEMORY 3 80 #define ENI_SYSTEM 4 81 #define ENI_FAMILY 5 82 #define ENI_SALEN 6 83 83 84 84 /* forward declaration to make gcc happy */ 85 85 int getnameinfo Py_PROTO((const struct sockaddr *, size_t, char *, size_t, 86 86 char *, size_t, int)); 87 87 88 88 int 89 89 getnameinfo(sa, salen, host, hostlen, serv, servlen, flags) 90 91 92 93 94 95 96 90 const struct sockaddr *sa; 91 size_t salen; 92 char *host; 93 size_t hostlen; 94 char *serv; 95 size_t servlen; 96 int flags; 97 97 { 98 99 100 101 102 103 104 105 #ifdef ENABLE_IPV6 106 107 #endif 108 109 110 111 112 113 98 struct gni_afd *gni_afd; 99 struct servent *sp; 100 struct hostent *hp; 101 u_short port; 102 int family, len, i; 103 char *addr, *p; 104 u_long v4a; 105 #ifdef ENABLE_IPV6 106 u_char pfx; 107 #endif 108 int h_error; 109 char numserv[512]; 110 char numaddr[512]; 111 112 if (sa == NULL) 113 return ENI_NOSOCKET; 114 114 115 115 #ifdef HAVE_SOCKADDR_SA_LEN 116 117 116 len = sa->sa_len; 117 if (len != salen) return ENI_SALEN; 118 118 #else 119 120 #endif 121 122 123 124 125 126 127 128 129 119 len = salen; 120 #endif 121 122 family = sa->sa_family; 123 for (i = 0; gni_afdl[i].a_af; i++) 124 if (gni_afdl[i].a_af == family) { 125 gni_afd = &gni_afdl[i]; 126 goto found; 127 } 128 return ENI_FAMILY; 129 130 130 found: 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 flags |= NI_NUMERICHOST; 161 162 #ifdef ENABLE_IPV6 163 164 pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr8[0];165 166 167 168 #endif 169 170 171 172 173 174 175 176 177 178 179 180 #ifdef ENABLE_IPV6 181 131 if (len != gni_afd->a_socklen) return ENI_SALEN; 132 133 port = ((struct gni_sockinet *)sa)->si_port; /* network byte order */ 134 addr = (char *)sa + gni_afd->a_off; 135 136 if (serv == NULL || servlen == 0) { 137 /* what we should do? */ 138 } else if (flags & NI_NUMERICSERV) { 139 sprintf(numserv, "%d", ntohs(port)); 140 if (strlen(numserv) > servlen) 141 return ENI_MEMORY; 142 strcpy(serv, numserv); 143 } else { 144 sp = getservbyport(port, (flags & NI_DGRAM) ? "udp" : "tcp"); 145 if (sp) { 146 if (strlen(sp->s_name) > servlen) 147 return ENI_MEMORY; 148 strcpy(serv, sp->s_name); 149 } else 150 return ENI_NOSERVNAME; 151 } 152 153 switch (sa->sa_family) { 154 case AF_INET: 155 v4a = ((struct sockaddr_in *)sa)->sin_addr.s_addr; 156 if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a)) 157 flags |= NI_NUMERICHOST; 158 v4a >>= IN_CLASSA_NSHIFT; 159 if (v4a == 0 || v4a == IN_LOOPBACKNET) 160 flags |= NI_NUMERICHOST; 161 break; 162 #ifdef ENABLE_IPV6 163 case AF_INET6: 164 pfx = ((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr[0]; 165 if (pfx == 0 || pfx == 0xfe || pfx == 0xff) 166 flags |= NI_NUMERICHOST; 167 break; 168 #endif 169 } 170 if (host == NULL || hostlen == 0) { 171 /* what should we do? */ 172 } else if (flags & NI_NUMERICHOST) { 173 if (inet_ntop(gni_afd->a_af, addr, numaddr, sizeof(numaddr)) 174 == NULL) 175 return ENI_SYSTEM; 176 if (strlen(numaddr) > hostlen) 177 return ENI_MEMORY; 178 strcpy(host, numaddr); 179 } else { 180 #ifdef ENABLE_IPV6 181 hp = getipnodebyaddr(addr, gni_afd->a_addrlen, gni_afd->a_af, &h_error); 182 182 #else 183 184 185 #endif 186 187 188 189 190 191 192 193 #ifdef ENABLE_IPV6 194 195 #endif 196 197 198 199 #ifdef ENABLE_IPV6 200 201 #endif 202 203 204 205 206 207 208 209 210 211 212 213 183 hp = gethostbyaddr(addr, gni_afd->a_addrlen, gni_afd->a_af); 184 h_error = h_errno; 185 #endif 186 187 if (hp) { 188 if (flags & NI_NOFQDN) { 189 p = strchr(hp->h_name, '.'); 190 if (p) *p = '\0'; 191 } 192 if (strlen(hp->h_name) > hostlen) { 193 #ifdef ENABLE_IPV6 194 freehostent(hp); 195 #endif 196 return ENI_MEMORY; 197 } 198 strcpy(host, hp->h_name); 199 #ifdef ENABLE_IPV6 200 freehostent(hp); 201 #endif 202 } else { 203 if (flags & NI_NAMEREQD) 204 return ENI_NOHOSTNAME; 205 if (inet_ntop(gni_afd->a_af, addr, numaddr, sizeof(numaddr)) 206 == NULL) 207 return ENI_NOHOSTNAME; 208 if (strlen(numaddr) > hostlen) 209 return ENI_MEMORY; 210 strcpy(host, numaddr); 211 } 212 } 213 return SUCCESS; 214 214 }
Note:
See TracChangeset
for help on using the changeset viewer.