diff options
author | Ben Lindstrom <mouring@eviladmin.org> | 2001-01-31 21:52:01 +0000 |
---|---|---|
committer | Ben Lindstrom <mouring@eviladmin.org> | 2001-01-31 21:52:01 +0000 |
commit | 3c06f6a0b234822c7b2d6c63ef1aaf554af7167b (patch) | |
tree | 86e5fe626cb9cbade752baf2440badfa19976200 /fake-getaddrinfo.c | |
parent | bf75776d415126a415ac92fb767c70dc67feba4f (diff) |
- (bal) Reorder. Move all bsd-*, fake-*, next-*, and cygwin* stuff to
openbsd-compat/. And resolve all ./configure and Makefile.in issues
assocated.
Logic:
* All OpenBSD functions should have the same filename as in the OpenBSD
tree
* All 'home brew' functions have bsd-* infront of them.
* All 'not really implemented' functions have fake-* infront of them.
Diffstat (limited to 'fake-getaddrinfo.c')
-rw-r--r-- | fake-getaddrinfo.c | 119 |
1 files changed, 0 insertions, 119 deletions
diff --git a/fake-getaddrinfo.c b/fake-getaddrinfo.c deleted file mode 100644 index 73c122ed1..000000000 --- a/fake-getaddrinfo.c +++ /dev/null | |||
@@ -1,119 +0,0 @@ | |||
1 | /* | ||
2 | * fake library for ssh | ||
3 | * | ||
4 | * This file includes getaddrinfo(), freeaddrinfo() and gai_strerror(). | ||
5 | * These funtions are defined in rfc2133. | ||
6 | * | ||
7 | * But these functions are not implemented correctly. The minimum subset | ||
8 | * is implemented for ssh use only. For exapmle, this routine assumes | ||
9 | * that ai_family is AF_INET. Don't use it for another purpose. | ||
10 | */ | ||
11 | |||
12 | #include "includes.h" | ||
13 | #include "ssh.h" | ||
14 | |||
15 | #ifndef HAVE_GAI_STRERROR | ||
16 | char *gai_strerror(int ecode) | ||
17 | { | ||
18 | switch (ecode) { | ||
19 | case EAI_NODATA: | ||
20 | return "no address associated with hostname."; | ||
21 | case EAI_MEMORY: | ||
22 | return "memory allocation failure."; | ||
23 | default: | ||
24 | return "unknown error."; | ||
25 | } | ||
26 | } | ||
27 | #endif /* !HAVE_GAI_STRERROR */ | ||
28 | |||
29 | #ifndef HAVE_FREEADDRINFO | ||
30 | void freeaddrinfo(struct addrinfo *ai) | ||
31 | { | ||
32 | struct addrinfo *next; | ||
33 | |||
34 | do { | ||
35 | next = ai->ai_next; | ||
36 | free(ai); | ||
37 | } while (NULL != (ai = next)); | ||
38 | } | ||
39 | #endif /* !HAVE_FREEADDRINFO */ | ||
40 | |||
41 | #ifndef HAVE_GETADDRINFO | ||
42 | static struct addrinfo *malloc_ai(int port, u_long addr) | ||
43 | { | ||
44 | struct addrinfo *ai; | ||
45 | |||
46 | ai = malloc(sizeof(struct addrinfo) + sizeof(struct sockaddr_in)); | ||
47 | if (ai == NULL) | ||
48 | return(NULL); | ||
49 | |||
50 | memset(ai, 0, sizeof(struct addrinfo) + sizeof(struct sockaddr_in)); | ||
51 | |||
52 | ai->ai_addr = (struct sockaddr *)(ai + 1); | ||
53 | /* XXX -- ssh doesn't use sa_len */ | ||
54 | ai->ai_addrlen = sizeof(struct sockaddr_in); | ||
55 | ai->ai_addr->sa_family = ai->ai_family = AF_INET; | ||
56 | |||
57 | ((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port; | ||
58 | ((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr; | ||
59 | |||
60 | return(ai); | ||
61 | } | ||
62 | |||
63 | int getaddrinfo(const char *hostname, const char *servname, | ||
64 | const struct addrinfo *hints, struct addrinfo **res) | ||
65 | { | ||
66 | struct addrinfo *cur, *prev = NULL; | ||
67 | struct hostent *hp; | ||
68 | struct in_addr in; | ||
69 | int i, port; | ||
70 | |||
71 | if (servname) | ||
72 | port = htons(atoi(servname)); | ||
73 | else | ||
74 | port = 0; | ||
75 | |||
76 | if (hints && hints->ai_flags & AI_PASSIVE) { | ||
77 | if (NULL != (*res = malloc_ai(port, htonl(0x00000000)))) | ||
78 | return 0; | ||
79 | else | ||
80 | return EAI_MEMORY; | ||
81 | } | ||
82 | |||
83 | if (!hostname) { | ||
84 | if (NULL != (*res = malloc_ai(port, htonl(0x7f000001)))) | ||
85 | return 0; | ||
86 | else | ||
87 | return EAI_MEMORY; | ||
88 | } | ||
89 | |||
90 | if (inet_aton(hostname, &in)) { | ||
91 | if (NULL != (*res = malloc_ai(port, in.s_addr))) | ||
92 | return 0; | ||
93 | else | ||
94 | return EAI_MEMORY; | ||
95 | } | ||
96 | |||
97 | hp = gethostbyname(hostname); | ||
98 | if (hp && hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) { | ||
99 | for (i = 0; hp->h_addr_list[i]; i++) { | ||
100 | cur = malloc_ai(port, ((struct in_addr *)hp->h_addr_list[i])->s_addr); | ||
101 | if (cur == NULL) { | ||
102 | if (*res) | ||
103 | freeaddrinfo(*res); | ||
104 | return EAI_MEMORY; | ||
105 | } | ||
106 | |||
107 | if (prev) | ||
108 | prev->ai_next = cur; | ||
109 | else | ||
110 | *res = cur; | ||
111 | |||
112 | prev = cur; | ||
113 | } | ||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | return EAI_NODATA; | ||
118 | } | ||
119 | #endif /* !HAVE_GETADDRINFO */ | ||