Esempio n. 1
0
char fd_type(int fd)
{
	struct stat buf;
	static int (*libc_getsockname)(int, struct sockaddr *, socklen_t *);

	if (fstat(fd, &buf) < 0)
		return '?';
	if (S_ISREG(buf.st_mode))
		return 'F';
	if (S_ISDIR(buf.st_mode))
		return 'f';
	if (S_ISCHR(buf.st_mode) || S_ISBLK(buf.st_mode))
		return 'D';
	if (S_ISFIFO(buf.st_mode))
		return 'P';
	if (S_ISLNK(buf.st_mode))
		return 'l';
	if (S_ISSOCK(buf.st_mode)) {
		struct sockaddr sam;
		int len = sizeof(sam);
		if (!libc_getsockname)
			libc_getsockname = dlsym(RTLD_NEXT, "getsockname");
		if (!libc_getsockname)
			return '?';
		if (libc_getsockname(fd, (struct sockaddr *)&sam, &len) < 0)
			return '?';
		if (sam.sa_family == AF_UNIX || sam.sa_family == AF_LOCAL)
			return 'U';
		return 'S';
	}
	return '?';
}
Esempio n. 2
0
int getsockname (int fd, struct sockaddr *addr, socklen_t *len)
{
#if __DEBUG__
    printf("function %s called\n", __func__);
#endif

    return libc_getsockname(fd, addr, len);
}