File: sockaddr.c

package info (click to toggle)
inn2 2.4.5-5
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 8,912 kB
  • ctags: 7,860
  • sloc: ansic: 85,104; perl: 11,427; sh: 9,863; makefile: 2,498; yacc: 1,563; python: 298; lex: 252; tcl: 7
file content (47 lines) | stat: -rw-r--r-- 1,185 bytes parent folder | download
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
/*  $Id: sockaddr.c 5381 2002-03-31 22:35:47Z rra $
**
**  Routines for manipulating sockaddr structs
*/

#include "config.h"
#include "clibrary.h"
#include "portable/socket.h"
#include <netdb.h>

#include "libinn.h"

char *sprint_sockaddr(const struct sockaddr *sa)
{
#ifdef HAVE_INET6
    static char buff[256];
    const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *) sa;

    *buff = '\0';
    if (sa->sa_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
	struct sockaddr_in sin;
	memcpy(&sin.sin_addr, sin6->sin6_addr.s6_addr + 12,
		sizeof sin.sin_addr);
	sin.sin_port = sin6->sin6_port;
	sin.sin_family = AF_INET;
#ifdef HAVE_SOCKADDR_LEN
	sin.sin_len = sizeof(struct sockaddr_in);
#endif
	return inet_ntoa(sin.sin_addr);
    }
    getnameinfo(sa, SA_LEN(sa), buff, sizeof buff, NULL, 0, NI_NUMERICHOST);

    return buff;
#else
    return inet_ntoa(((const struct sockaddr_in *)sa)->sin_addr);
#endif
}

void make_sin(struct sockaddr_in *s, const struct in_addr *src)
{
    memset(s, 0, sizeof( struct sockaddr_in ));
    s->sin_family = AF_INET;
#ifdef HAVE_SOCKADDR_LEN
    s->sin_len = sizeof( struct sockaddr_in );
#endif
    s->sin_addr = *src;
}