#!/usr/bin/perl $| = 1; &readerrnos; require 'find.pl'; @ARGV = ('.') unless @ARGV; &find(@ARGV); sub wanted { if ((($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && -l _) { &resolve; } } sub resolve { local($linkname) = readlink($_) || "[readlink failed: $!]"; print $name unless $level++; print " -> $linkname"; unless (-e $linkname) { print " [$errno[$!]] " } elsif (-l $linkname) { local($cwd) = `pwd`; chop $cwd; local($dir) = $linkname; local($base) = $linkname; $dir =~ s,/[^/]*$,,; $base =~ s,.*/,,; unless (chdir $dir) { warn "can't cd $dir: $!"; goto gone; } local($name, $_) = ($linkname,$base); &resolve; chdir ($cwd) || die "can't return to $cwd"; }; gone: print "\n" unless --$level; } sub readerrnos { open (ERRNOS, "/usr/include/sys/errno.h") || die "can't read errnos: $!"; while () { if (/#define\s*(E\w+)\s+(\d+)/) { $errno[$2] = $1; } } }