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 '?'; }
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); }