diff options
| author | SkyperTHC | 2026-03-03 06:28:55 +0000 |
|---|---|---|
| committer | SkyperTHC | 2026-03-03 06:28:55 +0000 |
| commit | 5d3573ef7a109ee70416fe94db098fe6a769a798 (patch) | |
| tree | dc2d5b294c9db8ab2db7433511f94e1c4bb8b698 /other/openssh-reverse/fake-getaddrinfo.c | |
| parent | c6c59dc73cc4586357f93ab38ecf459e98675cc5 (diff) | |
packetstorm sync
Diffstat (limited to 'other/openssh-reverse/fake-getaddrinfo.c')
| -rw-r--r-- | other/openssh-reverse/fake-getaddrinfo.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/other/openssh-reverse/fake-getaddrinfo.c b/other/openssh-reverse/fake-getaddrinfo.c new file mode 100644 index 0000000..73c122e --- /dev/null +++ b/other/openssh-reverse/fake-getaddrinfo.c | |||
| @@ -0,0 +1,119 @@ | |||
| 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 */ | ||
