summaryrefslogtreecommitdiff
path: root/security/ssh6/patches/patch-bp
diff options
context:
space:
mode:
Diffstat (limited to 'security/ssh6/patches/patch-bp')
-rw-r--r--security/ssh6/patches/patch-bp120
1 files changed, 120 insertions, 0 deletions
diff --git a/security/ssh6/patches/patch-bp b/security/ssh6/patches/patch-bp
new file mode 100644
index 00000000000..97c6ac152fe
--- /dev/null
+++ b/security/ssh6/patches/patch-bp
@@ -0,0 +1,120 @@
+$NetBSD: patch-bp,v 1.1 2000/03/20 02:25:44 itojun Exp $
+
+--- getaddrinfo.c.orig Wed Dec 31 19:00:00 1969
++++ getaddrinfo.c Fri Dec 24 21:50:41 1999
+@@ -0,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;
++}