Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/* posix */
2
#include <sys/types.h>
3
#include <unistd.h>
4
#include <stdlib.h>
5
#include <stdio.h>
6
#include <fcntl.h>
7
#include <string.h>
8
#include <errno.h>
9
#include <sys/stat.h>
10
 
11
/* bsd extensions */
12
#include <sys/uio.h>
13
#include <sys/socket.h>
14
#include <netinet/in.h>
15
#include <sys/un.h>
16
 
17
#include "priv.h"
18
 
19
int
20
getsockname(int fd, void *addr, int *alen)
21
{
22
	Rock *r;
23
	int i;
24
	struct sockaddr_in *lip;
25
	struct sockaddr_un *lunix;
26
 
27
	r = _sock_findrock(fd, 0);
28
	if(r == 0){
29
		errno = ENOTSOCK;
30
		return -1;
31
	}
32
 
33
	switch(r->domain){
34
	case PF_INET:
35
		lip = (struct sockaddr_in*)addr;
36
		_sock_ingetaddr(r, lip, alen, "local");
37
		break;
38
	case PF_UNIX:
39
		lunix = (struct sockaddr_un*)&r->addr;
40
		i = &lunix->sun_path[strlen(lunix->sun_path)] - (char*)lunix;
41
		memmove(addr, lunix, i);
42
		*alen = i;
43
		break;
44
	default:
45
		errno = EAFNOSUPPORT;
46
		return -1;
47
	}
48
	return 0;
49
}