summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c')
-rw-r--r--mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c b/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c
index b505ccfbc..75da5e320 100644
--- a/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c
+++ b/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c
@@ -5,15 +5,10 @@
#include <netdb.h>
#include <stdlib.h>
#include <arpa/inet.h>
-#include <sys/poll.h>
#include <unistd.h>
+#include "dietfeatures.h"
#include <errno.h>
-
-#include <stdio.h>
-
-extern int __dns_gethostbyx_r(const char* name, struct hostent* result,
- char *buf, size_t buflen,
- struct hostent **RESULT, int *h_errnop, int lookfor);
+#include "dietdns.h"
/* Oh boy, this interface sucks so badly, there are no words for it.
* Not one, not two, but _three_ error signalling methods! (*h_errnop
@@ -22,7 +17,7 @@ extern int __dns_gethostbyx_r(const char* name, struct hostent* result,
int gethostbyname2_r(const char* name, int AF, struct hostent* result,
char *buf, size_t buflen,
struct hostent **RESULT, int *h_errnop) {
- int L=strlen(name);
+ size_t L=strlen(name);
int lookfor=0;
switch (AF) {
case AF_INET: lookfor=1; break;
@@ -31,6 +26,30 @@ int gethostbyname2_r(const char* name, int AF, struct hostent* result,
}
result->h_name=buf;
if (buflen<L) { *h_errnop=ERANGE; return 1; }
+#ifdef WANT_ETC_HOSTS
+ {
+ struct hostent* r;
+ while ((r=gethostent_r(buf,buflen))) {
+ if (r->h_addrtype==AF) {
+ int i;
+ if (!strcmp(r->h_name,name)) { /* found it! */
+found:
+ memmove(result,r,sizeof(struct hostent));
+ *RESULT=result;
+ *h_errnop=0;
+ endhostent();
+ return 0;
+ }
+ for (i=0; i<16; ++i) {
+ if (r->h_aliases[i]) {
+ if (!strcmp(r->h_aliases[i],name)) goto found;
+ } else break;
+ }
+ }
+ }
+ endhostent();
+ }
+#endif
strcpy(buf,name);
return __dns_gethostbyx_r(name,result,buf+L,buflen-L,RESULT,h_errnop,lookfor);
}