summaryrefslogtreecommitdiffstats
path: root/picobsd/ssh-picobsd/files/patch-bg
blob: 689982094b9a278bcbccc85eb3479f0b84e105e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
*** getaddrinfo.c.orig	Mon Jan 10 22:56:13 2000
--- getaddrinfo.c	Mon Jan 10 22:56:13 2000
***************
*** 0 ****
--- 1,115 ----
+ /*
+  * fake library for ssh
+  *
+  * This file includes getaddrinfo(), freeaddrinfo() and gai_strerror().
+  * These funtions are defined in rfc2133.
+  *
+  * But these functions are not implemented correctly. The minimum subset
+  * is implemented for ssh use only. For exapmle, this routine assumes
+  * that ai_family is AF_INET. Don't use it for another purpose.
+  * 
+  * In the case not using 'configure --enable-ipv6', this getaddrinfo.c
+  * will be used if you have broken getaddrinfo or no getaddrinfo.
+  */
+ 
+ #include "includes.h"
+ #include "ssh.h"
+ 
+ #include "gai.h"
+ 
+ static struct addrinfo *
+ malloc_ai(port, addr)
+ int port;
+ u_long addr;
+ {
+   struct addrinfo *ai;
+ 
+   if (ai = (struct addrinfo *)malloc(sizeof(struct addrinfo) +
+ 				     sizeof(struct sockaddr_in))) {
+     memset(ai, 0, sizeof(struct addrinfo) + sizeof(struct sockaddr_in));
+     ai->ai_addr = (struct sockaddr *)(ai + 1);
+     /* XXX -- ssh doesn't use sa_len */
+     ai->ai_addrlen = sizeof(struct sockaddr_in);
+     ai->ai_addr->sa_family = ai->ai_family = AF_INET;
+     ((struct sockaddr_in *)(ai)->ai_addr)->sin_port = port;
+     ((struct sockaddr_in *)(ai)->ai_addr)->sin_addr.s_addr = addr;
+     return ai;
+   } else {
+     return NULL;
+   }
+ }
+ 
+ char *
+ gai_strerror(ecode)
+ int ecode;
+ {
+   switch (ecode) {
+   case EAI_NODATA:
+     return "no address associated with hostname.";
+   case EAI_MEMORY:
+     return "memory allocation failure.";
+   default:
+     return "unknown error.";
+   }
+ }    
+ 
+ void
+ freeaddrinfo(ai)
+ struct addrinfo *ai;
+ {
+   struct addrinfo *next;
+   
+   do {
+     next = ai->ai_next;
+     free(ai);
+   } while (ai = next);
+ }
+ 
+ int
+ getaddrinfo(hostname, servname, hints, res)
+ const char *hostname, *servname;
+ const struct addrinfo *hints;
+ struct addrinfo **res;
+ {
+   struct addrinfo *cur, *prev = NULL;
+   struct hostent *hp;
+   int i, port;
+   
+   if (servname)
+     port = htons(atoi(servname));
+   else
+     port = 0;
+   if (hints && hints->ai_flags & AI_PASSIVE)
+     if (*res = malloc_ai(port, htonl(0x00000000)))
+       return 0;
+     else
+       return EAI_MEMORY;
+   if (!hostname)
+     if (*res = malloc_ai(port, htonl(0x7f000001)))
+       return 0;
+     else
+       return EAI_MEMORY;
+   if (inet_addr(hostname) != -1)
+     if (*res = malloc_ai(port, inet_addr(hostname)))
+       return 0;
+     else
+       return EAI_MEMORY;
+   if ((hp = gethostbyname(hostname)) &&
+       hp->h_name && hp->h_name[0] && hp->h_addr_list[0]) {
+     for (i = 0; hp->h_addr_list[i]; i++)
+       if (cur = malloc_ai(port,
+ 			  ((struct in_addr *)hp->h_addr_list[i])->s_addr)) {
+ 	if (prev)
+ 	  prev->ai_next = cur;
+ 	else
+ 	  *res = cur;
+ 	prev = cur;
+       } else {
+ 	if (*res)
+ 	  freeaddrinfo(*res);
+ 	return EAI_MEMORY;
+       }
+     return 0;
+   }
+   return EAI_NODATA;
+ }
OpenPOWER on IntegriCloud