- if (dir) {
- catn(strcpy(path, dir), file, sizeof path);
- if (stat(path, &statb) >= 0) {
- if (statb.st_mode & S_IFDIR)
- return ('/');
+ catn(strcpy(path, dir), file, sizeof path);
+ if (lstat(path, &statb) == 0) {
+ switch(statb.st_mode & S_IFMT) {
+ case S_IFDIR:
+ return ('/');
+
+ case S_IFLNK:
+ if (stat(path, &statb) == 0 && /* follow it out */
+ (statb.st_mode & S_IFMT) == S_IFDIR)
+ return ('>');
+ else
+ return ('@');
+
+ case S_IFSOCK:
+ return ('=');
+
+ default: