summaryrefslogtreecommitdiff
path: root/fake-getnameinfo.c
blob: f74f3128f725cacd57e2725f9cee3ede8c70fa09 (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
/*
 * fake library for ssh
 *
 * This file includes getnameinfo().
 * 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 getnameinfo.c
 * will be used if you have broken getnameinfo or no getnameinfo.
 */

#include "includes.h"
#include "ssh.h"

#ifndef HAVE_GETNAMEINFO
int
getnameinfo(sa, salen, host, hostlen, serv, servlen, flags)
const struct sockaddr *sa;
size_t salen;
char *host;
size_t hostlen;
char *serv;
size_t servlen;
int flags;
{
  struct sockaddr_in *sin = (struct sockaddr_in *)sa;
  struct hostent *hp;
  char tmpserv[16];
  
  if (serv) {
    sprintf(tmpserv, "%d", ntohs(sin->sin_port));
    if (strlen(tmpserv) > servlen)
      return EAI_MEMORY;
    else
      strcpy(serv, tmpserv);
  }
  if (host)
    if (flags & NI_NUMERICHOST)
      if (strlen(inet_ntoa(sin->sin_addr)) > hostlen)
	return EAI_MEMORY;
      else {
	strcpy(host, inet_ntoa(sin->sin_addr));
	return 0;
      }
    else
      if (NULL != (hp = gethostbyaddr((char *)&sin->sin_addr, 
			sizeof(struct in_addr), AF_INET)))
	if (strlen(hp->h_name) > hostlen)
	  return EAI_MEMORY;
	else {
	  strcpy(host, hp->h_name);
	  return 0;
	}
      else
	return EAI_NODATA;
  return 0;
}
#endif /* !HAVE_GETNAMEINFO */