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 getpeername(int fd,void * addr,int * alen)20getpeername(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 } 51