Bugzilla – Attachment 1710 Details for
Bug 1665
prefix_pton is inefficient
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
change prefix_pton to use inet_pton()
radix-pton.diff (text/plain), 1.94 KB, created by
Göran Weinholt
on 2009-10-26 22:07:29 AEDT
(
hide
)
Description:
change prefix_pton to use inet_pton()
Filename:
MIME Type:
Creator:
Göran Weinholt
Created:
2009-10-26 22:07:29 AEDT
Size:
1.94 KB
patch
obsolete
>--- radix.c.old 2007-10-24 08:04:31.000000000 +0200 >+++ radix.c 2009-10-26 11:56:57.000000000 +0100 >@@ -558,12 +558,12 @@ > prefix_t > *prefix_pton(const char *string, long len, const char **errmsg) > { >+ unsigned char buf[sizeof(struct in6_addr)]; > char save[256], *cp, *ep; >- struct addrinfo hints, *ai; > void *addr; > prefix_t *ret; > size_t slen; >- int r; >+ int domain = AF_INET; > > ret = NULL; > >@@ -587,26 +587,30 @@ > } > /* More checks below */ > } >- memset(&hints, '\0', sizeof(hints)); >- hints.ai_flags = AI_NUMERICHOST; > >- if ((r = getaddrinfo(save, NULL, &hints, &ai)) != 0) { >- snprintf(save, sizeof(save), "getaddrinfo: %s:", >- gai_strerror(r)); >- *errmsg = save; >- return NULL; >- } >- if (ai == NULL || ai->ai_addr == NULL) { >- *errmsg = "getaddrinfo returned no result"; >- goto out; >+ if (strchr(save,':')) >+ domain = AF_INET6; >+ >+ switch (inet_pton(domain, save, buf)) { >+ case 1: break; >+ case 0: >+ *errmsg = "the address is not in presentation format"; >+ return NULL; >+ case -1: >+ *errmsg = "the address family is not supported"; >+ return NULL; >+ default: >+ *errmsg = "unknown error"; >+ return NULL; > } >- switch (ai->ai_addr->sa_family) { >+ *errmsg = "invalid prefix length"; >+ switch (domain) { > case AF_INET: > if (len == -1) > len = 32; > else if (len < 0 || len > 32) > goto out; >- addr = &((struct sockaddr_in *) ai->ai_addr)->sin_addr; >+ addr = &((struct in_addr *) buf)->s_addr; > sanitise_mask(addr, len, 32); > break; > case AF_INET6: >@@ -614,18 +618,17 @@ > len = 128; > else if (len < 0 || len > 128) > goto out; >- addr = &((struct sockaddr_in6 *) ai->ai_addr)->sin6_addr; >+ addr = &((struct in6_addr *) buf)->s6_addr; > sanitise_mask(addr, len, 128); > break; > default: > goto out; > } > >- ret = New_Prefix2(ai->ai_addr->sa_family, addr, len, NULL); >+ ret = New_Prefix2(domain, addr, len, NULL); > if (ret == NULL) > *errmsg = "New_Prefix2 failed"; > out: >- freeaddrinfo(ai); > return (ret); > } >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 1665
: 1710