Home | History | Annotate | Download | only in src
      1 #include <unistd.h>
      2 #include <fcntl.h>
      3 #include <string.h>
      4 #include <stdlib.h>
      5 #include <errno.h>
      6 #include <sys/socket.h>
      7 #include "selinux_internal.h"
      8 #include "policy.h"
      9 
     10 #ifndef SO_PEERSEC
     11 #define SO_PEERSEC 31
     12 #endif
     13 
     14 int getpeercon(int fd, char ** context)
     15 {
     16 	char *buf;
     17 	socklen_t size;
     18 	ssize_t ret;
     19 
     20 	size = INITCONTEXTLEN + 1;
     21 	buf = malloc(size);
     22 	if (!buf)
     23 		return -1;
     24 	memset(buf, 0, size);
     25 
     26 	ret = getsockopt(fd, SOL_SOCKET, SO_PEERSEC, buf, &size);
     27 	if (ret < 0 && errno == ERANGE) {
     28 		char *newbuf;
     29 
     30 		newbuf = realloc(buf, size);
     31 		if (!newbuf)
     32 			goto out;
     33 
     34 		buf = newbuf;
     35 		memset(buf, 0, size);
     36 		ret = getsockopt(fd, SOL_SOCKET, SO_PEERSEC, buf, &size);
     37 	}
     38       out:
     39 	if (ret < 0)
     40 		free(buf);
     41 	else
     42 		*context = buf;
     43 	return ret;
     44 }
     45 
     46