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
getpeername(int fd, void *addr, int *alen)
21
{
22
	Rock *r;
23
	int i;
24
	struct sockaddr_in *rip;
25
	struct sockaddr_un *runix;
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
		rip = (struct sockaddr_in*)&r->raddr;
36
		memmove(addr, rip, sizeof(struct sockaddr_in));
37
		*alen = sizeof(struct sockaddr_in);
38
		break;
39
	case PF_UNIX:
40
		runix = (struct sockaddr_un*)&r->raddr;
41
		i = &runix->sun_path[strlen(runix->sun_path)] - (char*)runix;
42
		memmove(addr, runix, i);
43
		*alen = i;
44
		break;
45
	default:
46
		errno = EAFNOSUPPORT;
47
		return -1;
48
	}
49
	return 0;
50
}